Clase wxFileDialogCustomizeHook
Clase base para los ganchos de personalización utilizados con wxFileDialog.
wxFileDialogCustomizeHook es una clase base abstracta, es decir, para poder utilizarla debe definirse una clase concreta que herede de ella e implemente su función virtual pura AddCustomControls(). Entonces se debe pasar un objeto de esta clase a wxFileDialog::SetCustomizeHook(), lo que hará que se llame a su función AddCustomControls() antes de que se muestre el diálogo, se llame a UpdateCustomControls() cada vez que algo cambie en el diálogo mientras se muestra y, finalmente, se llame a TransferDataFromCustomControls() cuando el usuario acepte su elección en el diálogo.
Poniendo todo esto junto, aquí hay un ejemplo de personalización del diálogo de archivo usando esta clase:
class EncryptHook : public wxFileDialogCustomizeHook { public: // Anular para añadir controles personalizados utilizando el objeto personalizador proporcionado. void AddCustomControls(wxFileDialogCustomize& customizer) override { // Supongamos que podemos cifrar los archivos al guardarlos. m_checkbox = customizer.AddCheckBox("Encrypt"); // Aunque m_checkbox no es un wxCheckBox, se parece a uno y, en particular, // podemos enlazarlo a eventos de control personalizados como de costumbre. m_checkbox->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& event) { // También podemos llamar a funciones similares a wxWindow. m_button->Enable(event.IsChecked()); }); // Los parámetros de encriptación pueden editarse en un cuadro de diálogo específico. m_button = customizer.AddButton("Parameters..."); m_button->Bind(wxEVT_BUTTON, [](wxCommandEvent&) { ... mostrar aquí el diálogo de parámetros de encriptación ... }); } // Anular para guardar los valores de los controles personalizados. void TransferDataFromCustomControls() override { // Guarda el valor del checkbox, ya que no podremos usarlo más // una vez que esta función regrese. m_encrypt = m_checkbox->GetValue(); } // Un simple accesorio para obtener los resultados. bool Encrypt() const { return m_encrypt; } private: wxFileDialogButton* m_button; wxFileDialogCheckBox* m_checkbox; bool m_encrypt = false; }; void SomeFunc() { wxFileDialog dialog(NULL, "Save document", wxString(), "file.my", "My files (*.my)|*.my", wxFD_SAVE | wxFD_OVERWRITE_PROMPT); // Este objeto puede ser destruido antes del diálogo, pero debe // permanecer vivo hasta que ShowModal() retorne. EncryptHook customizeHook; dialog.SetCustomizeHook(customHook); if ( dialog.ShowModal() == wxID_OK ) { if ( customizeHook.Encrypt() ) ... guardar con cifrado ... else ... guardar sin cifrado ... } }
Funciones miembro
AddCustomControls()
virtual void wxFileDialogCustomizeHook::AddCustomControls(wxFileDialogCustomize & customizer)
Debe sobrescribirse para añadir controles personalizados al diálogo utilizando el objeto personalizador proporcionado.
Llama a las funciones wxFileDialogCustomize para añadir controles y posiblemente enlazar con sus eventos.
Hay que tener en cuenta que no hay posibilidad de definir la disposición de los controles personalizados, aparecerán más o menos consecutivamente, pero la disposición exacta viene determinada por la plataforma actual.
TransferDataFromCustomControls()
virtual void wxFileDialogCustomizeHook::TransferDataFromCustomControls()
Normalmente debería sobrescribirse para guardar los valores de los controles personalizados cuando se acepta el diálogo.
Los controles personalizados se destruyen y no se pueden utilizar más una vez que wxFileDialog::ShowModal() devuelve, por lo que sus valores deben ser recuperados en esta función, que es llamada justo antes de que esto ocurra.
Esta función no es llamada si el usuario cancela el diálogo.
La versión de la clase base no hace nada.
UpdateCustomControls()
virtual void wxFileDialogCustomizeHook::UpdateCustomControls()
Puede sobreescribirse para actualizar los controles personalizados cada vez que algo cambia en el diálogo.
Esta función es llamada cuando el usuario selecciona un archivo, cambia el directorio o cambia el filtro actual en el diálogo, por ejemplo. Se puede utilizar para actualizar el estado de los controles personalizados dependiendo del archivo seleccionado, por ejemplo.
Hay que tener en cuenta que no se llama necesariamente cuando cambia el valor de un control personalizado.
La versión de la clase base no hace nada.