3 Controles estáticos
Los controles estáticos, no están destinados a introducir datos en la aplicación, sino al contrario, sirven para informar al usuario, añadiendo etiquetas a otros controles. También tienen finalidades estéticas, añadiendo separadores, marcos, etc.
Existen, pues, varios tipos de controles estáticos.

Controles estáticos de texto
Los controles estáticos de texto se suelen usar como etiquetas para otros controles, indicando el tipo de dato que se debe introducir.
Estos controles se encapsulan en la clase wxStaticText.
Insertar un control estático de texto es sencillo, bastará con usar el constructor:
m_staticText1 = new wxStaticText(this, wxID_ANY, wxT("Bienvenido a\nwxWidgets"), wxPoint(30,30), wxSize(180,200), wxALIGN_CENTRE_HORIZONTAL);
Necesitaremos indicar algunos parámetros:
- La ventana en la que se insertará el control.
- El identificador del control. Generalmente no nos interesará el valor de este identificador, ya que no es habitual volver a acceder a estos controles después de insertarlos. Por ello podemos usar el valor wxID_ANY, de modo que wxWidgets elija un valor por nosotros. En cualquier caso, siempre podemos usar un puntero al control si queremos modificar alguna de sus propiedades.
- El texto que mostrará el control. Se pueden insertar caracteres '\n' si queremos dividir el texto en varias líneas.
- Las coordenadas de la esquina superior izquierdo del control. Para ello se usa una referencia a una estructura wxPoint, o el valor wxDefaultPosition si vamos a usar sizers.
- El tamaño del control. Se usa una referencia a una estructura wxSize, o el valor wxDefaultSize si vamos a usar sizers.
- Banderas de estilo. Una combinación de estilos de controles estáticos de texto y de su clase base, wxWindow.
- El nombre de la ventana. Normalmente usaremos el valor por defecto wxStaticTextNameStr.
Línea estática
Un control de línea estática es simplemente una línea, horizontal o vertical que se usa para separar grupos de controles.
wxWidgets encapsula estos controles en la clase wxStaticLine.
Crear uno de estos controles es sencillo, basta usar su constructor:
new wxStaticLine(this, wxID_ANY, wxPoint(180,50), wxSize(130,3), wxLI_HORIZONTAL);
Para crear uno de estos controles necesitaremos indicar algunos parámetros:
- La ventana en la que se insertará el control.
- Identificador, que como sucede en el caso del control estático de texto, normalmente no nos interesará establecer a un valor concreto. Generalmente usaremos el valor wxID_ANY.
- La posición del extremo izquierdo, para líneas horizontales o del extremo superior para líneas verticales. Para ello se usa una referencia a una estructura wxPoint, o el valor wxDefaultPosition si vamos a usar sizers.
- El tamaño, que en realidad solo sirve para establecer la longitud de la línea. Se usa una referencia a una estructura wxSize de la que en líneas verticales el valor de la anchura se ignora y en líneas horizontales se ignora la altura.
- El estilo es el parámetro que establece si la línea será horizontal, wxLI_HORIZONTAL o vertical, wxLI_VERTICAL.
- El nombre de la ventana. Normalmente usaremos el valor por defecto wxStaticLineNameStr.
Caja estática
Un control de caja estática es un rectángulo que generalmente se usa para agrupar controles, como botones de radio, o checkboxes. Puede tener una etiqueta en la parte superior, y en futuros capítulos veremos que también puede funcionar como una caja de grupo, que tiene la propiedad añadida de poder activar o desactivar los controles contenidos en su interior simultáneamente.
La clase que usa wxWidgets para encapsular estos controles es wxStaticBox. La documentación recomienda, para evitar algunos problemas de actualización de pantalla, que los controles que insertemos en una caja sean hijos del control en lugar de ser sus hermanos, pero esto es opcional.
Si se añaden los controles que formarán el grupo como hijos de la caja, sus coordenadas serán relativas a la caja y no a la ventana padre de ésta.
Crear uno de estos controles, como el resto de los controles estáticos, es fácil, basta usar su constructor:
m_staticBox = new wxStaticBox(this, wxID_ANY, wxT("&Grupo"), wxPoint(200, 10), wxSize(100,90));
Para crear uno de estos controles necesitaremos indicar algunos parámetros:
- La ventana en la que se insertará el control.
- Identificador, que como sucede en el caso del control estático de texto, normalmente no nos interesará establecer a un valor concreto. Generalmente usaremos el valor wxID_ANY.
- La etiqueta que se mostrará en la parte superior, o una cadena vacía para no mostrar etiqueta.
- La posición de la esquina superior izquierda. Para ello se usa una referencia a una estructura wxPoint, o el valor wxDefaultPosition si vamos a usar sizers.
- El tamaño, para el que se usa una referencia a una estructura wxSize.
- El estilo. Estos controles no tienen estilos propios, pero se pueden usar los estilos wxALIGN_LEFT, wxALIGN_CENTRE_HORIZONTAL y wxALIGN_RIGHT que afectarán a la etiqueta, si se especifica.
- El nombre de la ventana. Normalmente usaremos el valor por defecto wxStaticBoxNameStr.
Bitmap estático
Un control de bitmap estático sirve para mostrar una imagen en una ventana. Su uso es estético y, bien empleado, es una ayuda para indicar el propósito de un cuadro de diálogo o parte de él.
wxWidgets dispone de dos clases para encapsular estos controles es wxStaticBitmap y wxGenericStaticBitmap.
La diferencia es que wxGenericStaticBitmap permite elegir entre varias opciones a la hora de adaptar el tamaño del mapa de bits al del control, ya sea recortándolo, escalándolo usando la misma escala horizontal y vertical o no.
La clase wxStaticBitmap usará el comportamiento nativo del sistema operativo, que adaptará el mapa de bits de forma diferente en cada caso.
Para crear uno de estos controles, de nuevo, basta usar su constructor:
wxGenericStaticBitmap* m_staticBitmap = new wxGenericStaticBitmap(this, wxID_ANY, wxBITMAP_PNG(logo), wxPoint(5,30), wxSize(50,50)); m_staticBitmap->SetScaleMode(wxStaticBitmapBase::Scale_AspectFit);
Es preferible usar la clase wxGenericStaticBitmap, que tiene más opciones, y nos permite redimensionar el mapa de bits.
En cuanto a los parámetros, tenemos:
- La ventana en la que se insertará el control.
- El identificador, que como en casi todos los controles estáticos, generalmente nos interesará establecer a un valor concreto, y usaremos el valor wxID_ANY.
- El mapa de bits a mostrar. En futuros capítulos veremos que se pueden usar ficheros gráficos en varios formatos.
- La posición de la esquina superior izquierda, mediante una referencia a una estructura wxPoint, o el valor wxDefaultPosition si vamos a usar sizers.
- El tamaño, mediante una referencia a una estructura wxSize. Si se usa el valor wxDefaultSize, el tamaño del control será el mismo que el del mapa de bits.
- El estilo.
- El nombre de la ventana. Normalmente usaremos el valor por defecto wxStaticBoxNameStr.
Para establecer el modo en que se reescalará el mapa de bits con respecto a las dimensiones del control se usa el método wxGenericStaticBitmap::SetScaleMode. El valor del parámetro es uno de los del enumerado wxGenericStaticBitmap::ScaleMode:
- Scale_None, el valor por defecto, muestra el mapa de bits en tamaño original. Las partes que no quepan se recortan.
- Scale_Fill, el mapa de bits se escalará para cubrir toda el área del control, sin respetar la relación de aspecto si es necesario.
- Scale_AspectFit, el mapa de bits se escalará para cubrir toda el área del control, pero respetando la relación de aspecto.
- Scale_AspectFill, el mapa de bits se escala para cubrir todo el control, recortando alguna parte si fuese necesario.
Indicador de actividad
Algunas veces nuestros programas tienen que realizar alguna tarea que requiere mucho tiempo. Esto puede ser un problema, ya que las aplicaciones dejan de responder a las acciones del usuario y pueden hacerle pensar que el programa ha dejado de funcionar.
Dependiendo del tiempo que requiera la tarea tenemos diferentes formas de indicar al usuario que no está pasando nada malo, y que sencillamente el programa está ocupado con una tarea.
Si el tiempo es muy largo tendremos que diseñar alguna forma de indicar al usuario cuánto de la tarea está terminada y cuánto queda para completarla, e incluso dar la opción de interrumpir la tarea sin tener que finalizar el programa de forma abrupta. Para eso veremos en otro capítulo las barras de progreso.
Para tiempos relativamente cortos probablemente baste con cambiar el cursor. Muchos sistemas operativos optan por animaciones de algún tipo de reloj, o cursores que indiquen de algún modo el paso del tiempo. No deberíamos usar esas opciones para tiempos demasiado largos, ya que el usuario puede impacientarse o pensar que el programa ha crasheado o ha entrado en un bucle infinito.
wxWidgeds nos proporciona el control wxActivityIndicator que hace algo similar, pero en lugar de sustituir el cursor permite mostrar una animación en la posición y con el tamaño que deseemos.
Como cualquier otro control estático, en el constructor tendremos que indicar la ventana padre, un identificador, una posición y un tamaño, el estilo y un nombre. Solo el primer parámetro es obligatorio. Además, este control no dispone de estilos propios, pero podemos usar los de la clase wxWindow, así como sus métodos, y los de las clases de las que se deriva.
También se puede crear el control en dos fases, usando el constructor por defecto, para más tarde invocar el método Create. El constructor por defecto será invocado automáticamente si declaramos controles de esta clase y no llamamos al constructor con parámetros explícitamente.
Una vez creado, por defecto, el control será visible y estará parado, no mostrará la animación. Si no queremos este comportamiento, podemos ocultarlo usando el método Hide.
Para activar el control disponemos del método Start, y para detenerlo del método Stop. Siempre podemos averiguar si el control está en marcha usando el método IsRunning.
Control de animación
Los controles de animación se pueden usar, igual que el de actividad, para indicar que el programa está realizando alguna tarea, o sencillamente como decoración.
La clase wxAnimationCtrl permite crear un control estático que muestra una animación.
Están soportadas animaciones de tipo GIF y ANI. El formato ANI se usa normalmente para cursores animados de Windows.
El constructor no obtiene la animación directamente. Se puede especificar un objeto wxAnimation o bien cargar posteriormente la animación desde un fichero, mediante LoadFile o desde un wxInputStream, mediante Load.
Por ejemplo, estos dos códigos son equivalentes:
wxAnimation miAnim("flapper.gif"); AniGIF = new wxAnimationCtrl(this, idAniGIF, miAnim, wxPoint(20,130)); AniGIF->Play();
Y este:
AniGIF = new wxAnimationCtrl(this, wxNullAnimation, miAnim, wxPoint(20,130)); AniGIF->LoadFile("flapper.gif"); AniGIF->Play();
Cargar la animación no hace que se ejecute, si no se invoca al método Play, se mostrará el primer fotograma.
Se puede detener la animación mediante Stop y averiguar si se está ejecutando mediante el método IsPlaying.
Ejemplo 3
Nombre | Fichero | Fecha | Tamaño | Contador | Descarga |
---|---|---|---|---|---|
Ejemplo 3 | wx003.zip | 2024-12-02 | 53146 bytes | 5 |