25 Barras de herramientas

Ejemplo de wxToolBar

Un ToolBar, o barra de herramientas, es una ventana que contiene una fila o una columna de controles de tipo botón, radio, verificación o combobox, en un formato empaquetado. Se suelen usar para agrupar acciones de la aplicación de una forma más accesible que los menús.

Por norma general, en una barra de herramientas, los botones muestran como un mapa de bits, y en general suelen tener asociado un ToolTip con un pequeño texto explicativo de la función de cada herramienta. También puede asociarse a cada herramienta un texto de ayuda que se mostrará en la barra de estado.

En la práctica, al menos los botones, los controles de radio y los de verificación se manejan igual que sus equivalentes en los menús. De hecho generan eventos wxCommandEvent, y es habitual que las muchas de las opciones que aparecen en una barra de herramientas también estén disponibles en el menú principal.

Estilos

Evitaremos usar estilos que no estén disponibles para todas las plataformas, como wxTB_FLAT, wxTB_DOCKABLE, wxTB_NODIVIDER, wxTB_NOALIGN o wxTB_HORZ_LAYOUT, ya que puede que de ese modo nuestras aplicaciones no sean multiplataforma.

Si no indica lo contrario, se creará una barra de herramientas horizontal, wxTB_HORIZONTAL y se colocará en la parte superior de la ventana. Si queremos que se sitúe en la parte inferior podemos añadir el estilo wxTB_BOTTOM.

También podemos crear una barra de herramientas vertical, indicando el estilo wxTB_VERTICAL, que se colocará en la parte izquierda de la ventana. Si queremos que aparezca en la parte derecha tendremos que añadir el estilo wxTB_RIGHT, que asume también que la barra es vertical.

El resto de estilos afectan al aspecto del control:

  • wxTB_TEXT añadirá un texto a cada botón de la barra. Por defecto el texto no se muestra.
  • wxTB_NOICONS evitará que se muestren las imágenes de los botones. Activar este estilo activa también wxTB_TEXT, de otro modo no se mostraría nada.
  • wxTB_NO_TOOLTIPS evitará que se muestren los tooltips de cada herramienta. El texto de los tooltips corresponde con la ayuda breve, que puede ser muy parecido al que se muestra al usar el estilo wxTB_TEXT, de modo que si se especifica este estilo, mostrar los tooltips puede resultar redundante.

Creación de una barra de herramientas

Para manejar una barra de herramientas usaremos la clase wxToolBar.

Los parámetros son los habituales para la creación de controles:

  • Un puntero a la ventana padre.
  • Un identificador.
  • Las coordenadas de la posición. Generalmente usaremos el valor wxDefaultPosition.
  • Las dimensiones. Generalmente usaremos wxDefaultSize.
  • Los estilos. Por defecto es wxTB_HORIZONTAL, o su equivalente wxTB_DEFAULT_STYLE.
  • Un nombre opcional.
wxToolBar* herramientas = new wxToolBar(this, idToolBar, wxDefaultPosition, wxDefaultSize, wxTB_NOICONS | wxTB_RIGHT);

Añadir herramientas

Una vez creada la barra de herramientas, tendremos que añadir las herramientas.

Para añadir botones disponemos de los métodos AddTool. Su sobrecarga más utilizada requiere cinco parámetros:

  • Un identificador.
  • Una etiqueta, que por defecto no se muestra, salvo que se active el estilo wxTB_TEXT.
  • Un conjunto de mapas de bits, del que el sistema elegirá el más adecuado según las dimensiones de la barra de herramientas.
  • El texto de la ayuda breve, que se mostrará en el tooltip.
  • El tipo de botón. Por defecto es wxITEM_NORMAL, que crea un botón normal, pero puede ser wxITEM_CHECK para crear un botón de tipo checkbox, o wxITEM_RADIO, para crear un botón de tipo radiobutton. En éste último caso no tiene sentido crear un único botón de este tipo, se deben crear más para formar un grupo, y todos los botones de este tipo que se creen consecutivos formaran parte del mismo grupo, igual que sucede con los radiobuttons de menú.

Existe otro tipo, wxITEM_DROPDOWN, que sirve para crear un botón que despliega un submenú, pero no está disponible para todas las plataformas.

Si queremos añadir un texto de ayuda largo, que se mostrará en la barra de estado, disponemos del método SetToolLongHelp, indicando como parámetros el identificador y el texto de ayuda.

Disponemos de otra sobrecarga del método AddTool, que requiere más parámetros:

  • El identificador.
  • La etiqueta.
  • El conjunto de mapas de bits.
  • Un segundo conjunto de mapas de bits, que se usarán cuando la herramienta esté deshabilitada. Si se usa el valor wxNullBitmap, se generará uno a partir de la imagen normal.
  • El tipo.
  • La cadena correspondiente al tooltip.
  • La cadena correspondiente a la barra de estado.
  • Los datos de cliente, opcionales.

La tercera sobrecarga sólo requiere un puntero a un objeto wxToolBarToolBase.

Para crear un objeto de herramienta se usa el método CreateTool.

Si queremos crear botones de tipo checkbox, en lugar de especificar el tipo wxITEM_CHECK, podemos usar el método AddCheckTool, que requiere los mismos parámetros que la segunda opción de AddTool, salvo el tipo.

Lo mismo sucede con los botones radiobutton, para los que disponemos del método AddRadioTool.

    wxBitmapBundle bmb = wxBitmapBundle(exit_xpm);
    herramientas->AddTool(idToolSalir, _T("Salir"), bmb, _T("Salir"));
    herramientas->SetToolLongHelp(idToolSalir, _T("Salir de la aplicación"));
    bmb = wxBitmapBundle(rojo_xpm);
    herramientas->AddRadioTool(idToolColor, _T("Rojo"), bmb, wxBitmapBundle(), _T("Rojo"), _T("Seleccionar color"));
    bmb = wxBitmapBundle(amarillo_xpm);
    herramientas->AddRadioTool(idToolColor, _T("Amarillo"), bmb, wxBitmapBundle(), _T("Amarillo"), _T("Seleccionar color"));
    bmb = wxBitmapBundle(verde_xpm);
    herramientas->AddRadioTool(idToolColor, _T("Verde"), bmb, wxBitmapBundle(), _T("Verde"), _T("Seleccionar color"));
    bmb = wxBitmapBundle(azul_xpm);
    herramientas->AddRadioTool(idToolColor, _T("Azul"), bmb, wxBitmapBundle(), _T("Azul"), _T("Seleccionar color"));

Estos métodos siempre añaden las herramientas al final, lo que resulta práctico si podemos insertar todas las herramientas en el orden en que queremos que se muestren.

Pero también podemos insertar herramientas en una posición determinada, usando el método InsertTool, que sólo difiere del anterior en que hay que añadir un primer parámetro con la posición deseada de inserción.

Este método sólo tiene sobrecargados los equivalentes a la segunda y tercera forma de AddTool.

Añadir otros controles

Podemos añadir otros tipos de controles, aunque no todos generarán una barra de herramientas utilizable.

Lo más común es añadir un control combobox, o uno de edición.

Para hacerlo primero crearemos el control, y posteriormente lo añadiremos mediante el método AddControl, indicando como parámetros el puntero al control y una etiqueta.

Al crear el control es importante especificar como ventana padre la barra de herramientas.

Para añadir el control a la barra usaremos el método InsertControl.

    wxString opciones[] = {_T("Uno"), _T("Dos"), _T("Tres"), _T("Cuatro"), _T("Cinco")};
...
    wxComboBox* combo = new wxComboBox(herramientas, combobox, wxEmptyString, wxDefaultPosition, wxDefaultSize, 5, opciones);
    herramientas->AddControl(combo, _T("Opciones"));

También disponemos del método InsertControl para insertar controles en una posición concreta en lugar de añadirlos al final.

Separadores

Al igual que en los menús, también es posible añadir separadores a la barra de herramientas. Estos separadores resultan útiles para diferenciar grupos de herramientas, o para separar conjuntos de herramientas de radio.

Para insertar un separador se usa el método AddSeparator, sin parámetros.

O para insertarlos en una posición concreta, mediante InsertSeparator.

Una forma alternativa de añadir separaciones son los espaciadores.

Se pueden añadir uno o más espaciadores entre herramientas. Esto hará que el espacio libre en la barra de herramientas, no ocupado por ninguna, se reparta equitativamente entre todos los espaciadores.

Si no se añaden espaciadores, en una barra horizontal todas las herramientas aparecerán a la izquierda, dejando el espacio libre a la derecha.

En los verticales se agruparán en la zona superior.

Si se añade un espaciador, las herramientas anteriores al espaciador se agrupan a la izquierda, y las posteriores a la derecha, o arriba y abajo en el caso de las barras verticales.

Otra opción es añadir un espaciador al principio y otro al final, lo que hará que las herramientas se agrupen en el centro de la barra.

Para añadir un espaciador se usa el método AddStretchableSpace, si queremos insertarlo en una posición concreta, usaremos InsertStretchableSpace.

Eliminar herramientas

Por supuesto, también podemos eliminar herramientas de una barra.

ClearTools eliminará todas las herramientas, y dejará la barra vacía.

DeleteTool elimina una herramienta indicando como parámetro el identificador.

DeleteToolByPos elimina una herramienta indicando como parámetro su posición. Esto permite eliminar separadores y espaciadores, que no tienen un identificador.

RemoveTool funciona igual que DeleteTool, pero sólo extrae la herramienta de la barra, no la borra. El valor de retorno es un puntero a la herramienta extraída, que podrá insertarse posteriormente en esta o en otra barra de herramientas.

Construcción de la barra de herramientas

Una vez creada la barra de herramientas, o cada vez que queramos modificarla añadiendo herramientas, deberemos validarla invocando el método Realize. No será necesario invocar este método cuando se eliminen herramientas, en ese caso la barra se actualizará automáticamente.

Aunque es posible añadir barras de herramientas usando sizers, como cualquier otro control, lo normal es que la asignemos a la ventana usando el método wxFrame::SetToolBar. De esta forma los estilos para situar la barra de herramientas se procesarán correctamente.

    herramientas->Realize();
    SetToolBar(herramientas);

Habilitar y deshabilitar herramientas

Como con cualquier otro control u opción de menú, es posible habilitar o inhibir ciertas herramientas. Para ello usaremos el método EnableTool, indicando el identificador de la herramienta cuyo estado queremos modificar, y un segundo parámetro booleano, con valor true para habilitar la herramienta o false para inhibirla.

También podemos recuperar el estado de una herramienta, usando el método GetToolEnabled, indicando en el parámetro el identificador de la herramienta a consultar.

    herramientas->EnableTool(idToolAyuda, false);

Herramientas de dos estados

Cuando trabajamos con herramientas de verificación, o de dos estados, es probable que tengamos que forzar uno de los estados, normalmente el de marcado, ya que el otro es el estado por defecto. Para ello usaremos el método ToggleTool, indicando en el primer parámetro el identificador de la herramienta, y en el segundo el estado deseado, true para marcado o false para desmarcado.

Para obtener el estado de una de estas herramientas disponemos del método GetToolState.

    herramientas->ToggleTool(idToolActivar, true);
...
    if(herramientas->GetToolEstatel(idToolActivar)) {
...
    }

Lo mismo se aplica a herramientas de tipo check o radio, aunque veremos que para obtener el estado de un grupo de herramientas de radio es mejor usar otros métodos.

Procesar notificaciones

Para las herramientas de tipo botón lo más sencillo es procesar las notificaciones EVT_TOOL, que funcionan exactamente igual que las EVT_MENU.

BEGIN_EVENT_TABLE(wx025Frame, wxFrame)
    EVT_CLOSE(wx025Frame::OnClose)
    EVT_MENU(idMenuQuit, wx025Frame::OnQuit)
    EVT_TOOL(idToolSalir, wx025Frame::OnQuit)
...
END_EVENT_TABLE()

De hecho, en este ejemplo, podríamos haber usado el mismo identificador para el menú de salir y para la herramienta, y usar una única notificación.

También podemos usar la misma notificación para botones de tipo check.

Para procesar grupos de herramientas de tipo radio es preferible usar la notificación EVT_MENU_RANGE.

BEGIN_EVENT_TABLE(wx025Frame, wxFrame)
...
    EVT_MENU_RANGE(idToolRojo, idToolAzul, wx025Frame::OnColor)
...
END_EVENT_TABLE()
...
void wx025Frame::OnColor(wxCommandEvent& event) {
    wxString msg;

    if(event.GetId()<idToolRojo || event.GetId()>idToolAzul) return;
    switch(event.GetId()) {
    case idToolRojo: msg = _T("Color rojo"); break;
    case idToolAmarillo: msg = _T("Color amarillo"); break;
    case idToolVerde: msg = _T("Color verde"); break;
    case idToolAzul: msg = _T("Color azul"); break;
    }
    wxMessageBox(msg, "Color elegido");
}

Datos de cliente

Como en otros controles que contienen varios elementos, en las barras de herramientas también es posible asignar un dato de cliente a cada herramienta.

Esto se puede hacer al insertarlas, usando el parámetro clientData, o posteriormente, usando el método SetToolClientData, indicando el identificador de la herramienta y un puntero a los datos a asociar. En el caso de herramientas, al contrario de los otros controles que ya hemos visto, los datos de cliente tienen que ser de una clase derivada de wxObject.

Para recuperar los datos asociados a una herramienta usaremos GetToolClientData.

No es probable que necesitemos usar esta característica, y no he encontrado ejemplos que la usen.

Modificar herramientas

A veces tendremos que modificar alguna característica de las herramientas después de crearlas. Disponemos de varios métodos para ello.

Para modificar el texto del tooltip asociado a una herramienta usaremos SetToolShortHelp, indicando en identificador de la herramienta y el nuevo texto.

Lo mismo se aplica al texto de la ayuda larga, que se muestra en la barra de estado, usando SetToolLongHelp.

También podemos modificar la imagen asociada a la herramienta. Con SetToolNormalBitmap asignaremos la imagen que se muestra con la herramienta habilitada y con SetToolDisabledBitmap la imagen de la herramienta inhibida.

        herramientas->SetToolShortHelp(idToolActivar, _T("Inhibir ayuda"));
        herramientas->SetToolLongHelp(idToolActivar, _T("Inhibir herramienta de ayuda"));

Por otra parte, los métodos GetToolShortHelp y GetToolLongHelp permiten recuperar las cadenas de ayuda de una herramienta.

Búsqueda de herramientas

Otros métodos, probablemente menos útiles en aplicaciones normales son:

  • GetToolPos: obtiene la posición dentro de la barra de una herramienta a partir de su identificador.
  • GetToolsCount: obtiene el número de herramientas que contiene una barra.
  • FindById: recupera la herramienta con el identificador dado.
  • FindControl: recupera el control con el identificador dado.
  • GetToolByPos: recupera la herramienta a partir de su posición.

Ejemplo 25

Windows:

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 25 wx025.zip 2025-09-08 16554 bytes 10

Linux:

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 25 wx025.tar.gz 2025-09-08 14480 bytes 10