28 Control de selección de color

Ejemplo de wxColourPickerCtrl

En este capítulo veremos el control wxColourPickerCtrl.

Como todos los controles de la familia "picker", se trata de un botón que, en este caso, permite seleccionar un color. El botón cambiará de aspecto dependiendo del color seleccionado.

Al pulsar sobre el control se despliega un cuadro de diálogo con un conjunto de colores predefinidos entre los que el usuario puede elegir uno, o bien pulsar sobre el botón de personalización, y elegir un color más específico o incluso capturar un color desde la pantalla.

Estilos

Ejemplo de wxColourPickerCtrl 2

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

  • El estilo wxCLRP_USE_TEXTCTRL añade un control de texto a la izquierda del botón que está completamente gestionado por wxColourPickerCtrl. Se usa tanto para mostrar el valor actual del color seleccionado como para que el usuario pueda modificarlo desde el teclado.
  • El estilo wxCLRP_SHOW_LABEL, según la documentación, muestra el color en formato HTML (AABBCC) como etiqueta del botón de color. Al menos es GTK no parece que haga nada.
  • El estilo wxCLRP_SHOW_ALPHA permite seleccionar la opacidad en el selector de color, el canal alfa.

El estilo por defecto, wxCLRP_DEFAULT_STYLE, únicamente muestra el botón con el color actual.

Creación del control

El constructor de estos controles se aparta muy poco de la regla general, y requiere los siguientes parámetros:

  • La ventana padre.
  • Un identifcador.
  • Un wxColour con el color actualmente seleccionado. Por defecto es el negro.
  • La posición.
  • El tamaño.
  • Los estilos.
  • Un validador.
  • Un nombre opcional.
    colourPickerCtrl = new wxColourPickerCtrl(this, idColourPickerCtrl, color,
        wxDefaultPosition, wxSize(350, wxDefaultCoord), wxCLRP_SHOW_LABEL);

Validadores

Estos controles admiten el uso de validadores que podemos usar para limitar el rango de valores que el usuario puede introducir, evitando que pueda suministrar colores que no queremos usar.

Por ejemplo, podemos limitar el rango de colores a tonos de gris.

Para ello crearemos nuestra propia clase de validación derivada de wxValidator, como hicimos con otros controles.

class colorValidator : public wxValidator {
public:
    colorValidator(wxColour *c=nullptr);
    virtual wxObject* Clone() const { return new colorValidator(*this); }
    virtual bool TransferFromWindow();
    virtual bool TransferToWindow();
    virtual bool Validate(wxWindow * parent);
private:
    wxColour *m_color;
    DECLARE_DYNAMIC_CLASS( colorValidator )
    DECLARE_EVENT_TABLE()
};

Tendremos que definir los tres métodos TransferFromWindow, TransferToWindow y Validate.

Por ejemplo, para Validate podemos usar este código:

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

    bool retval;
    wxColour temp;

    try {
        wxColourPickerCtrl *cpc = dynamic_cast<wxColourPickerCtrl*>(m_validatorWindow);
        temp = cpc->GetColour();
    }
    catch (...) {
        wxFAIL_MSG( _T("paresValidator sólo funciona con wxColourPickerCtrl"));
        return false;
    }

    retval = temp.Red() == temp.Green() && temp.Red() == temp.Blue(
    if(!retval) {
        wxString errmsg = wxT("El color debe tener las tres componentes RGB iguales");
        wxMessageDialog dlg(parent,errmsg,wxT("Entrada incorrecta"),wxOK);
        dlg.ShowModal();
    }

    return retval;
}

Por supuesto, en el constructor del control tendremos que añadir un parámetro para usar nuestro validador:

    colourPickerCtrl = new wxColourPickerCtrl(this, idColourPickerCtrl, color,
        wxDefaultPosition, wxSize(350, wxDefaultCoord), wxCLRP_USE_TEXTCTRL | wxCLRP_SHOW_LABEL, colorValidator(&color));

Y al cerrar el cuadro de diálogo validar el contenido, de modo que sólo se cierre si el valor es correcto:

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

Obtener selección

Para obtener el color actualmente seleccionado, además del validador (ya sea uno propio o el validador por defecto), disponemos del método GetColour().

    color = colourPickerCtrl->GetColour();

Establecer valor

Para establecer el valor del color, además del propio constructor o un validador, se puede usar el método SetColour(), especificando un objeto wxColour.

En teoría se puede usar una cadena con el nombre de uno de los colores predefinidos, o uno de los colores de de la base de datos de colores wxTheColourDatabase, pero no he conseguido que funcione.

    wxColour color = wxColour(22, 22, 88);
    colourPickerCtrl->SetColour(color);

Se puede usar una cadena para definir el color, en lugar de usar los valores numéricos de cada componente.

Hay varias convenciones que se pueden usar: CSS, HTML o la base de datos:

    wxColour color = wxColour("rbg(127, 255, 212)");
    wxColour color = wxColour("rbga(127, 255, 212, 255)");
    wxColour color = wxColour("#7FFFD4");
    wxColour color = wxTheColourDatabase->Find("aquamarine");

Ejemplo 28

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 28 wx028.zip 2025-11-20 6430 bytes 20