29 Selección de fuente

Ejemplo de wxFontPickerCtrl

Para terminar con los controles de la familia picker vamos a ver el control wxFontPickerCtrl, que nos permite seleccionar una fuente de caracteres.

De nuevo, se trata de un botón que al pulsarse despliega un diálogo que nos permite seleccionar una de las fuentes entre las disponibles en el sistema. El aspecto del botón cambia en función de la fuente seleccionada.

Estilos

Estos controles disponen de varios estilos que permiten establecer algunas opciones de funcionamiento:

  • El estilo wxFNTP_FONTDESC_AS_LABEL muestra como etiqueta del control el nombre y tamaño de la fuente seleccionada.
  • El estilo wxFNTP_USEFONT_FOR_LABEL utiliza además esa fuente para mostrar el nombre de la fuente.
  • El estilo wxFNTP_USE_TEXTCTRL añade un control de edición de texto gestionado por wxFontPickerCtrl en el que el usuario puede escribir el nombre de la fuente. En mi opinión su utilidad es limitada, ya que raramente el usuario conocerá el nombre de la fuente, y siempre será más sencillo buscarla en la lista de las disponibles.
Ejemplo de wxFontPickerCtrl 2

El estilo por defecto, wxFNTP_DEFAULT_STYLE combina los estilos wxFNTP_FONTDESC_AS_LABEL y wxFNTP_USEFONT_FOR_LABEL. Esto hace que se muestre el nombre de la fuente usando esa misma fuente y además el tamaño.

Creación del control

El constructor de estos controles es parecido al de otros controles picker, y requiere los siguientes parámetros:

  • La ventana padre.
  • Un identifcador.
  • Un wxFont con la fuente actualmente seleccionada.
  • La posición.
  • El tamaño.
  • Los estilos.
  • Un validador.
  • Un nombre opcional.
    fontPickerCtrl = new wxFontPickerCtrl(this, idFontPickerCtrl, fuente,
        wxDefaultPosition, wxSize(350, wxDefaultCoord), wxFNTP_DEFAULT_STYLE);

Validadores

Estos controles también admiten el uso de validadores que podemos usar para limitar las fuentes que el usuario puede elegir.

Por ejemplo, podemos impedir que el usuario pueda seleccionar fuentes de anchura proporcional, o lo que es lo mismo, que sólo pueda seleccionar fuentes de anchura constante.

Para ello crearemos nuestra propia clase de validación derivada de wxValidator.

class fontValidator : public wxValidator {
public:
    fontValidator(wxFont *f=nullptr);
    virtual wxObject* Clone() const { return new fontValidator(*this); }
    virtual bool TransferFromWindow();
    virtual bool TransferToWindow();
    virtual bool Validate(wxWindow * parent);
private:
    wxFont *m_fuente;
    DECLARE_DYNAMIC_CLASS( fontValidator )
    DECLARE_EVENT_TABLE()
};

Como en casos anteriores definiremos los métodos TransferFromWindow, TransferToWindow y Validate.

En este caso, para Validate podemos usar este código:

bool fontValidator::Validate(wxWindow* parent)
{
    if (!m_validatorWindow->IsEnabled()) return true;

    bool retval;
    wxFont temp;

    try {
        wxFontPickerCtrl *fpc = dynamic_cast<wxFontPickerCtrl*>(m_validatorWindow);
        temp = fpc->GetSelectedFont();
    }
    catch (...) {
        wxFAIL_MSG( _T("fontValidator sólo funciona con wxFontPickerCtrl"));
        return false;
    }

    retval = temp.IsFixedWidth();
    if(!retval) {
        wxString errmsg = wxT("Sólo se pueden seleccionar fuentes de anchura constante.");
        wxMessageDialog dlg(parent,errmsg,wxT("Entrada incorrecta"),wxOK);
        dlg.ShowModal();
    }

    return retval;
}

En el constructor del control tendremos que añadir un parámetro para usar nuestro validador:

    fontPickerCtrl = new wxFontPickerCtrl(this, idFontPickerCtrl, fuente,
        wxDefaultPosition, wxSize(350, wxDefaultCoord), wxFNTP_DEFAULT_STYLE, fontValidator(&fuente));

Finalmente, cuando procesemos el cierre del cuadro de diálogo hay que validar el contenido, de modo que sólo se cierre y se retorne si la fuente seleccionada es correcta:

void FontPicker::OnOk(wxCommandEvent& event) {
    if ( Validate() && TransferDataFromWindow() ) EndModal(wxID_OK);
}

Obtener selección

Para obtener el valor de la fuente actualmente seleccionada, ya sea en el validador (ya sea uno propio o el validador por defecto) o al procesar el cierre del diálogo, disponemos del método GetSelectedFont().

    fuente = fontPickerCtrl->GetSelectedFont();

Establecer valor

Para establecer el valor de de la fuente en el control se usa el método SetSelectedFont(), especificando un objeto wxFont.

    fontPickerCtrl->SetSelectedFont(fuente);

Ejemplo 29

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 29 wx029.zip 2025-11-20 6376 bytes 13