Cómo utilizar wxwidgets para desarrollar interfaces
wxWidgets es un kit de desarrollo de software multiplataforma. Nació en 1992 y su nombre original era wxWindows, pero debido a la protesta de Microsoft, pasó a llamarse wxWidgets en 2004. Originalmente fue diseñado como un kit de desarrollo de software GUI multiplataforma, pero luego, a medida que más y más personas participaron, se agregaron muchas funciones no GUI a wxWidgets, como multiproceso (MultiThread), red (Red), etc. Y desde el soporte inicial solo para el lenguaje C ++, se ha desarrollado gradualmente para admitir varios lenguajes (como Python, Perl, C#, Basic, etc.). Por lo tanto, wxWidgets ya no es un simple kit de desarrollo de software GUI multiplataforma, sino un kit de desarrollo de software multiplataforma universal que puede admitir múltiples plataformas de sistemas operativos y usarse en múltiples idiomas.
Dado que wxWidgets se diseñó originalmente para C++, este artículo analiza principalmente el uso de wxWidgets en C++.
¿Por qué elegir wxWidgets?
Actualmente existen muchos kits de desarrollo de software que admiten C++. Además de wxWidgets, los más famosos incluyen otros kits de desarrollo de software, como MFC, QT, ACE, etc. Dado que existen tantos paquetes de desarrollo, ¿por qué deberíamos utilizar wxWidgets? Antes de dar la respuesta, primero echemos un vistazo a las características de los tres kits de desarrollo de software anteriores.
1. MFC
MFC es un kit de desarrollo de software proporcionado por Microsoft. Aunque MFC es muy potente, sólo puede ejecutarse en Windows. Y viene con una tarifa.
2. ?QT
QT es un kit de desarrollo de software multiplataforma desarrollado por Trolltech Company. Es similar a wxWidgets, pero QT sólo es gratuito en Linux, y usar QT en Windows o Unix requiere pagar regalías a Trolltech.
3. ?ACE
Aunque ACE es gratuito y de código abierto, no proporciona funciones GUI.
Se puede ver en los tres kits de desarrollo de software anteriores que, aunque tienen sus propias ventajas, restringirán más o menos el desarrollo. El uso de wxWidgets no tendrá los problemas anteriores. La comparación de funciones entre wxWidgets y MFC, QT y ACE se muestra en la Tabla 1.
Nota: El "sí/no" en gratis significa que la Edición Gratuita de QT en la plataforma Linux es gratuita, mientras que el uso de QT en Windows y Unix es de pago. El "sí/no" en código abierto significa que QT tiene una versión de código abierto basada en GPL, pero para el desarrollo comercial, es necesario utilizar su versión comercial.
Usa wxWidgets para escribir programas
La mejor manera de aprender un lenguaje de programación es usarlo para escribir programas, y aprender wxWidgets no es una excepción. Dado que la función principal de wxWidgets es implementar una GUI multiplataforma, este artículo comienza principalmente con la GUI y analiza cómo escribir aplicaciones multiplataforma con wxWidgets en C++
1?Establecimiento de clases de aplicación<. /p >
Construir un sistema usando wxWidgets requiere una clase para describir la aplicación completa. Esta clase debe heredar de la clase wxApp.
clase MyApp: public wxApp ? //Clase de aplicación
{
public:
virtual bool OnInit() // Llamado cuando se inicia la aplicación, si se devuelve false, salga de la aplicación
};
Esta clase solo cubre un método virtual OnInit de wxApp. Puede utilizar este método para realizar alguna verificación cuando se inicie el programa. Si la verificación falla, puede salir de la aplicación devolviendo falso. Por supuesto, dado que esta función es el punto de entrada de la aplicación, el trabajo de establecer el formulario principal debe completarse en esta función.
2. Cree una clase de formulario
Hay muchas clases relacionadas con formularios en wxWidgets. Si desea crear un formulario general, puede heredar de wxFrame. ?
clase MyFrame: public wxFrame //Clase de formulario
{
public:
MyFrame(const wxString& title); Constructor de formulario
};
3. Agregar controles al formulario
En este artículo, se agrega una barra de menú a este formulario ( Menu Bar), una barra de estado, un panel y un botón. Generalmente agregaremos estos controles en el constructor del formulario principal. ?
MyFrame::MyFrame(const wxString& title): wxFrame(NULL, wxID_ANY, title)
{
wxMenu *fileMenu = new wxMenu; / ¿Crear un menú "Archivo"?
wxMenu *helpMenu = new wxMenu; // Crear un menú "Ayuda"
// Agregar subelementos al menú
helpMenu->Append(wxID_ABOUT, _T("Acerca de "tF1"), _T("Mostrar cuadro de diálogo Acerca de"));
fileMenu->Append(wxID_EXIT, _T("Salir "tAlt -X" ), _T("Salir de la aplicación"));
wxMenuBar *menuBar = new wxMenuBar(); ?// Crear una barra de menú
menuBar->Append( fileMenu, _T ("Archivo")); ?//Agregar el menú "Archivo" a la barra de menú
menuBar->Append(helpMenu, _T("Ayuda")); Menú "Ayuda" A la barra de menú
SetMenuBar(menuBar); ?//Coloca la barra de menú en el formulario
wxPanel *panel = new wxPanel(this); Crear un panel
wxButton *button = new wxButton(panel, wxID_ABOUT, "Acerca de", wxPoint(20, 20), wxSize(50, 30));//Crear un botón
CreateStatusBar (2); ?//Crear una barra de estado de dos columnas
SetStatusText(_T("¡Bienvenido a wxWidgets!"));//Establecer el texto de la barra de estado
p>En Las propiedades de sample.ico y el icono en sí se describen en la matriz sample_xpm. Por ejemplo, X representa rojo; o representa amarillo, etc. Luego haga referencia a este archivo de recursos en el programa fuente incluyendo "sample.xpm". Para cargar el icono desde este archivo de recursos. Puede usar SetIcon(wxICON(sample)); wxICON para leer el archivo de recursos, y SetIcon establece este ícono como el ícono de la barra de título del marco. Para convertir archivos ico en este tipo de archivo de recursos, puede utilizar XnView, un software gratuito, para convertirlo.
5. Mostrar el formulario principal
Mostrar el formulario principal es muy simple. Solo necesita crear una instancia de la clase MyFrame creada anteriormente y llamar al método Show de wxFrame para mostrarlo. Estos códigos se pueden escribir en el método OnInit de la clase MyApp.
bool MyApp::OnInit()
{
//Crear una instancia de la clase MyFrame
MyFrame *frame = new MyFrame( _T("El primer programa wxWidgets"));
frame->Show(true);//Mostrar el formulario principal
return true ?//Debe regresar; verdadero, de lo contrario la aplicación se cerrará
}
En el código anterior, el método Show tiene un parámetro. Si es verdadero, se mostrará en forma de ventana modal. De lo contrario, se mostrará en forma de ventana no modal.
6. Agregar eventos al formulario
Hasta ahora, la interfaz de este programa se ha completado, pero no ha respondido a ningún evento. Aquí hay una explicación detallada de cómo hacerlo. agregar eventos a esta aplicación. Agregar código de evento.
Para los eventos, generalmente constan de dos partes.
(1) Llamar a la parte del evento
Cuando ocurre una determinada acción en el programa, como hacer clic en un botón o seleccionar un control, es posible que sea necesario ejecutar un fragmento de código. Este código generalmente lo llama el sistema, lo que significa que el sistema llama al código correspondiente a través del puntero de función de evento.
(2) La función de evento en sí
La función de evento es la misma que una función ordinaria, excepto que el sistema la llama después de que ocurre un evento. ?
En wxWidgets, los eventos se procesan a través de la tabla hash de eventos (Event Hash Table), es decir, el puntero de función de evento correspondiente se guarda en una tabla hash y luego, cuando ocurre el evento, desde esta búsqueda. el puntero de función de evento correspondiente en la tabla hash y luego llame a la función a través del puntero de función. Antes de utilizar una tabla hash de eventos, se debe definirla. Dado que definir una tabla hash es muy complejo y cada clase que necesita manejar eventos requiere el mismo código, wxWidgets define una macro DECLARE_EVENT_TABLE() para definir la tabla hash. Esta macro se puede escribir en cualquier lugar de la clase MyFrame. Es equivalente a poner la siguiente declaración en la clase MyFrame.
privado:
static const wxEventTableEntry sm_eventTableEntries[];?
protected:?
static const wxEventTable ?sm_eventTable;? p>
virtual const wxEventTable* ?GetEventTable() const;?
estático wxEventHashTable ?sm_eventHashTable;
virtual wxEventHashTable& ?GetEventHashTable() const;
La variable de matriz estática sm_eventTableEntries almacena toda la información del evento en la clase MyFrame.
El código anterior declara algunos métodos para procesar tablas hash de eventos. Ahora que están declarados, deben implementarse. Dado que los códigos de implementación son los mismos, wxWidgets también define un conjunto de macros para implementar estos métodos. Las macros que implementan estos métodos se muestran a continuación.
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(wxID_EXIT, ?MyFrame::OnQuit)
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
EVT_BUTTON(wxID_ABOUT, MyFrame::OnAbout)
END_EVENT_TABLE()
Entre ellos, BEGIN_EVENT_TABLE(...) implementa el método definido anteriormente e inicializa la variable estática sm_eventTable. Los siguientes dos EVT_MENU y una macro EVT_BUTTON inicializan la variable estática sm_eventTableEntries, es decir, los punteros de estas dos funciones de evento (el botón y el menú Acerca de usan una función de evento OnAbout) y el ID de control se guardan en sm_eventTableEntries, y el END_EVENT_TABLE( ) la macro se utiliza como El puntero de función de evento vacío se asigna a sm_eventTableEntries, que es algo así como procesar cadenas en lenguaje C. El último carácter se asigna a '"0', para que pueda saber dónde está el final.
Al formulario El último paso para agregar eventos es declarar e implementar funciones de eventos. En este caso, ¿se declaran dos funciones de eventos?
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent&).
Puedes colocar estas dos declaraciones de función en cualquier lugar de MyFrame. El siguiente es su código de implementación.
void MyFrame::OnQuit(wxCommandEvent&). WXUNUSED(evento).
{ ?
Cerrar(verdadero);
}
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED). (evento))
{
wxString msg;
msg.Printf( _T("Este es un ejemplo de un cuadro de diálogo."n")
_T("Bienvenido a %s"), wxVERSION_STRING);
wxMessageBox(msg, _T("?About"), wxOK | wxICON_INFORMATION, esto);
} p>
La función OnQuit llama a Close(true) para cerrar MyFrame. Dado que MyFrame es el formulario principal, después de cerrar MyFrame, la aplicación también se cierra. OnAbout utiliza la función wxMessageBox para abrir un cuadro de diálogo de información.
7. Ejecutar el programa
Hasta ahora, el código de este programa se ha completado básicamente, pero como se mencionó anteriormente, el método OnInit en MyApp se ejecuta cuando se inicia la aplicación. Entonces, ¿quién llamó al método OnInit? La respuesta es, por supuesto, wxWidgets. Para llamar a este método, wxWidgets proporciona una macro IMPLEMENT_APP(...). Esta macro tiene un parámetro y MyApp debe pasarse como parámetro. Eso es IMPLEMENT_APP (Mi aplicación). Esta macro es equivalente a una función WinMain (similar a la función principal del programa de consola), es decir, la función OnInit en MyApp se llama en la función WinMain. Después de agregar esta macro, puede usar un compilador de C++ para compilar el programa fuente anterior en un archivo exe.