30 Paneles
Los paneles no son controles, sino ventanas que contienen grupos de controles. Normalmente se insertan en un marco (wxFrame).
Panel
En su forma más simple, wxPanel, se puede usar para que una ventana normal, basada en wxFrame, que permite añadir un menú o una barra de estado, se comporte como un cuadro de diálogo.
Un wxPanel no añade opciones de visualización, salvo que apliquemos alguno de los estilos de wxWindow, o cambiemos el color de fondo, pero proporciona opciones de navegación, usando la tecla TAB para desplazarse entre sus controles hijos.
No todas las plataformas permiten pintar en un marco. La forma de asegurarse de que nuestra aplicación puede hacerlo es incluir un panel. Sólo requiere añadir una línea de código, y no afecta al comportamiento de la aplicación.
Tampoco todas las plataformas permiten la navegación usando TAB en un marco de forma nativa. Usar un panel es la forma de asegurarse, si existe una forma nativa se usará, en caso contrario wxWidgets proporciona una propia.
Creación del panel
Para añadir un panel usaremos su constructor, indicando los siguientes parámetros:
- La ventana padre.
- Un identifcador.
- La posición.
- El tamaño.
- Los estilos.
- Un nombre opcional.
wxGridSizer *sizer = new wxGridSizer(3, wxDefaultSize);
...
wxPanel *panel = new wxPanel(this, idFrame, wxPoint(10,10), wxSize(50,100), wxTAB_TRAVERSAL | wxBORDER_SUNKEN);
sizer->Add(new wxButton(panel, 1001, _T("Botón"), wxDefaultPosition, wxDefaultSize));
...
panel->SetSizerAndFit(sizer);
Ejemplo 30
| Nombre | Fichero | Fecha | Tamaño | Contador | Descarga |
|---|---|---|---|---|---|
| Ejemplo 30 | wx030.zip | 2026-02-05 | 4279 bytes | 18 |
Panel colapsable
En ocasiones, cuando nuestros diálogos contengan muchos controles, puede ser difícil o imposible mostrarlos todos en una ventana. Hay que tener en cuenta que no todos los usuarios disponen de monitores con grandes resoluciones, y aunque una ventana o diálogo permita mostrar todos los controles en la resolución en la que estamos probando la aplicación, es posible que en resoluciones menores esto no sea así.
Otras veces es posible que ciertos datos sólo tengan sentido en algunos casos, y no nos interese que siempre se muestren al usuario, sobre todo si no necesita introducirlos.
En estos casos una posible solución es usar paneles colapsables.
En estado colapsado estos controles sólo muestran una etiqueta junto a una flecha apuntando a la derecha. Al pulsar sobre la etiqueta el control se expande y permite mostrar un conjunto de controles, la flecha ahora apuntará hacia abajo. Cuando está expandido se puede volver a colapsar pulsando de nuevo sobre la etiqueta.
El wxCollapsiblePane se comporta como un cuadro de diálogo anidado. Sus controles forman parte de la ventana a la que pertenecen, aunque en algún momento no sean visibles.
Creación del control
Para añadir uno de estos controles usaremos su constructor, indicando los siguientes parámetros:
- La ventana padre.
- Un identifcador.
- Una etiqueta
- La posición.
- El tamaño.
- Los estilos.
- Un validador.
- Un nombre opcional.
Después de crear el control tendremos que insertar los controles que se mostrará u ocultarán cuando el panel se expanda o se colapse.
Para ello tendremos que obtener la ventana asociada al control mediante el método GetPane, y después insertar los controles en esa ventana.
panel = new wxCollapsiblePane(this, idColPane, "Colapsable:");
wxWindow *win = panel->GetPane();
sizer = new wxGridSizer(3, wxDefaultSize);
for(int i=0; i<30; i++) {
cad = "BUT"+std::to_string(i+1);
sizer->Add(new wxButton(win, idBoton+i, cad, wxDefaultPosition, wxDefaultSize), wxSizerFlags().Proportion(1).Expand().DoubleBorder());
}
sizervertical->Add(panel1, wxSizerFlags().Expand().Border());
En la ventana asociada al control colapsable se pueden usar sizers del mismo modo que en cualquier otra ventana.
Estilos
Además de los estilos propios de las clases base, como wxControl o wxWindow, estos controles disponen de dos estilos propios:
El estilo por defecto, wxCP_DEFAULT_STYLE, que incluye los estilos wxTAB_TRAVERSAL y wxBORDER_NONE.
El estilo wxCP_NO_TLW_RESIZE, que impide que la ventana padre cambie su tamaño para acomodarse a las dimensiones del panel.
Otros métodos
Podemos colapsar o expandir estos controles mediante los métodos Collapse y Expand, respectivamente, o simplemente con Collapse, e indicando un parámetro con valor true para colapsar o false para expandir.
También podemos obtener el estado del control mediante IsCollapsed o IsExpanded.
Eventos
A menudo el comportamiento automático de estos controles será suficiente, pero en ocasiones nos puede interesar capturar eventos procedentes de ellos. Es el caso del programa de ejemplo, en el que se crean dos controles de este tipo, pero nos aseguramos de que uno de ellos siempre esté desplegado.
Para procesar eventos procedentes de estos controles cuando se colapsen o se expandan usaremos la macro EVT_COLLAPSIBLEPANE_CHANGED:
BEGIN_EVENT_TABLE(wxMiFrame, wxFrame)
...
EVT_COLLAPSIBLEPANE_CHANGED(idColPane, wxMiFrame::OnPaneChanged)
...
END_EVENT_TABLE()
El procedimiento recibirá un parámetro de la clase wxCollapsiblePaneEvent, que sólo dispone de dos métodos propios, además de los heredados de wxCommandEvent.
GetCollapsed obtiene el nuevo estado del control, true si el control está colapsado.
SetCollapsed establece el nuevo estado del control, true para colapsar el control.
Cabecera de control colapsable
Los controles wxCollapsiblePane están formados por un control wxCollapsibleHeaderCtrl y una ventana asociada. Pero se puede usar el control wxCollapsibleHeaderCtrl de forma independiente para nuestras propias aplicaciones.
Para ello crearemos un control de esta clase y procesaremos los eventos EVT_COLLAPSIBLEHEADER_CHANGED para usarlos en nuestra aplicación.
El procedimiento que procese estos eventos recibirá una referencia a un objeto de la clase wxCommandEvent que nos permitirá saber qué control provocó el evento.
Estos controles, además de los constructores, sólo disponen de dos métodos propios.
El método IsCollapsed permite obtener el estado actual del control.
El método SetCollapsed permite establecer el estado del control.
Ejemplo 30b
| Nombre | Fichero | Fecha | Tamaño | Contador | Descarga |
|---|---|---|---|---|---|
| Ejemplo 30b | wx030b.zip | 2026-02-05 | 4695 bytes | 16 |