En este capítulo abordaremos aspectos básicos de wxWidgets y las ventajas que tiene sobre otras herramientas similares. Presentaremos algo de su historia, de la comunidad que trabaja con wxWidgets, de su licencia y una visión general de su arquitectura.
¿Qué es wxWidgets?
wxWidgets es un set de herramientas de programador para producir aplicaciones con interfaz gráfica de usuario (GUI), en distintas plataformas. Es un framework, en el sentido que realiza gran parte del trabajo, y nos entrega, ya programado, el comportamiento que por defecto tiene la mayoría de las aplicaciones. Las librerías de wxWidgets contienen gran cantidad de clases y métodos para que el programador las use y personalice. Una aplicación normalmente muestra ventanas, que contienen controles estándar, que pueden generar y mostrar imágenes y gráficos, y puede responder a entradas desde el teclado, el mouse u otras fuentes, además de comunicarse con otros procesos o programas. wxWidgest le permite al programador reproducir, de manera relativamente sencilla, todos estos comportamientos que son típicos en una aplicación moderna.
Si bien, a menudo, wxWidgets es etiquetado como un set de herramientas para el desarrollo de GUI's, en la práctica es mucho más que eso, teniendo características de utilidad para muchos aspectos del desarrollo de software. wxWidgets entrega soluciones a todas las necesidades de una aplicación, no solo a la interfaz gráfica, sino también manejo de múltiples hilos de ejecución, manejo de archivos y flujos, ajustes de aplicación, comunicación entre procesos, ayuda online, acceso a bases de datos, y mucho más.
¿Por qué usar wxWidgets?
Un área donde wxWidgets se diferencia de muchas otras frameworks, como MFC o OWL, es su naturaleza multiplataforma. Su Interfaz de Programación de Aplicaciones (API) es la misma, o casi la misma, en todas las plataformas que la soportan. Esto significa que puedes programar una aplicación en Windows, por ejemplo, y con sólo algunos cambios (si es que) lo puedes recompilar en Linux o Mac OS X. Esto implica un enorme beneficio en comparación con la necesidad de re-escribir por completo una aplicación para otra plataforma, y ya no es necesario tener diferentes API's para diferentes plataformas. Además, tus aplicaciones son más resistentes a la obsolescencia. En la medida que el campo de la informática avanza, wxWidgets avanza con él, permitiendo que tus aplicaciones mantengan los mejores y más recientes desarrollos.
Otra característica que distingue a wxWidgets es que entrega un comportamiento y una apariencia nativa a tu aplicación. Algunas frameworks usan los mismos widgets para todas las plataformas, con pequeños cambios para simular distintas apariencias. Mientras que wxWidgets usa los widgets nativos del sistema siempre que puede (y cuando no, usa su propio set de widgets), por lo que, no solo dispones de una apariencia nativa para tus aplicaciones en las principales plataformas, sino que, en la práctica, son aplicaciones nativas. Esto tiene una gran importancia para la aceptación de los usuarios, ya que por muy pequeña, casi imperceptible que parezca la diferencia de comportamiento de una aplicación en relación al estándar del sistema, puede producir una experiencia alienante para el usuario. Para ilustrar este punto, la figura 1-1 muestra la aplicación StoryLines, una herramienta para escritores que usa wxWidgets, corriendo en Windows XP.

figura 1-1
Se puede reconocer la vista de una aplicación Windows, con elementos propios de su interfaz gráfica, como pestañas, barras de desplazamiento y listas desplegables. De manera similar, la figura 1-2 muestra la misma aplicación para Mac OS X, con la apariencia Aqua. No tiene una barra de menú en la ventana misma del programa, pues por convención de Mac OS, la barra de menús se muestra el la parte superior de la pantalla.

figura 1-2
Finalmente, en la figura 1-3 se muestra StoryLines corriendo como una aplicación GTK+ en Red Hat Linux.
¿Por qué no usar Java? Java es una buena alternativa para aplicaciones orientadas a la web, pero no siempre es la mejor opción para aplicaciones de escritorio. En general, una aplicación en C++ que usa wxWidgets es más rápida, con una apariencia nativa, y es más fácil de instalar, pues no requiere de la existencia de una máquina virtual, como ocurre con Java. C++ también nos entrega un mejor acceso a la máquina a bajo-nivel, y se integra fácilmente a la gran cantidad de código en C y C++ ya existente. Por estas razones, son pocas las aplicaciones de escritorio que está programadas en Java. wxWidgets te permite construir aplicaciones de aspecto nativo con el rendimiento esperado por el usuario.

figura 1-3
wxWidgets es un proyecto de código abierto. Naturalmente, esto implica que no debes pagar para usar wxWidgets (a menos que desees hacer alguna donación al proyecto!), pero además tiene una importante significación filosófica y estratégica. El software de código abierto suele mantenerse en el tiempo más que sus equivalentes privativos. Usando wxWidgets sabes que tu código nunca desaparecerá, pues siempre es posible resolver cualquier falla o problema cambiando parte de éste. También es más entretenido participar en una comunidad de código abierto que trabajar en un entorno corporativo. Siempre habrá alguien dispuesto a ayudarte en la comunidad, pues lo hacen por que les gusta el código abierto y desean compartir sus conocimientos, cuestión totalmente distintas en el ambiente corporativo, donde las motivaciones no son tan idealistas. Cuando elijes wxWidgets accedes a una amplia fuente de talento, donde el rango de experiencia es amplio entre los colaboradores. Muchos aspectos en el desarrollo de una aplicación, que pudiesen significar un arduo trabajo personal, ya han sido encapsulados por estos desarrolladores en clases que, con facilidad, pudieras incluir en tu propio código. Puedes encontrar ayuda en las listas de correo de esta activa comunidad de usuarios, no solo en lo que respecta a wxWidgets, sino sobre otras materias, tanto de desarrolladores experimentados como novatos. Tal vez, algún día, puedas contribuir con tu experiencia a ayudar a otros.
wxWidgets cuenta con una amplia reputación dentro de la industria. La lista de usuarios incluye a AOL, AMD, CALTECH, Lockheed Martin, Nasa, la Open Source Applications Foundations, Xerox, y muchos otros. WxWidgets abarca una amplia variedad de usuarios, desde los desarrolladores independientes hasta las grandes corporaciones, desde los departamentos de informática hasta los equipos de investigación médica, y desde la investigación ecológica hasta la industria de las telecomunicaciones. También es usado por un gran número de proyectos de código abierto, como el editor de audio Audacity o el sistema de administración y diseño de bases de datos pgAdmin III.
La gente usa wxWidgets por distintas razones, ya sea por que resulta un simple y elegante reemplazo de MFC para una plataforma, o porque te permite mover fácilmente desde, digamos, Microsoft Windows a Unix o Mac OS X. WxWidgets comienza a hacer frente al desafío de los dispositivos móviles también, ya sea en Linux, Microsoft Pocket PC o (pronto) Palm OS.
Una breve historia de wxWidgets
El proyecto wxWidgets comenzó en 1992 cuando Julian Smart trabajaba en la University of Edinburgh en una herramienta de diagramación llamada Hardy. Él no quería tener que elegir entre trabajar en una estación de trabajo con Sun o en una PC, por lo que decidió usar una framework multiplataforma. Como la oferta de frameworks multiplataforma en ese momento era limitada, y como el departamento no tenía presupuesto de todas formas, la única alternativa que quedaba era construirla él mismo. La universidad le permitió subir wxWidgets 1.0, al sitio FTP del departamento, en septiembre de 1992, y otros desarrolladores comenzaron a usar el código. Inicialmente, wxWidgets estaba dirigido para XView y MFC 1.0; los usuarios de Borland C++ no estaban conforme con los requisitos de MFC, por lo que lo re-escribieron para usar solamente Win32. Luego, Mofit fue reemplazando paulatinamente a XView.
Con el tiempo, una pequeña pero entusiasta comunidad de wxWidgets se fue estableciendo y crearon una lista de correo. Comenzaron a llegar las contribuciones y correcciones, incluyendo una versión para Xt de Markus Holzem. wxWidgets fue poco a poco ganando más usuarios alrededor del mundo: usuarios independientes, académicos, departamentos gubernamentales, y -más gratificante aun- corporaciones encontraron en wxWidgets un mejor producto de lo que el mercado podía ofrecer.
En 1997, wxWidgets 2, con nueva API, fue diseñada con la ayuda de Markus Holzem. Wolfram Gloger sugirió que wxWidgets debería estar disponible también para GTK+, el nuevo y prometedor set de widgets para el entorno Gnome. Robert Roebling llegó a liderar el desarrollo de wxGTK, que es la principal adaptación de wxWidgets para el entorno Unix/Linux. En 1998, las versiones para Windows y GTK+ se fusionan bajo el control de CVS. Vadim Zeitlin se unió al proyecto, en el que contribuyó con buenas ideas y un montón de código, y Stefan Csomor comenzó a construir la versión para Mac OS en 1998.
En 1999 se agregaron las notables clases wxHTML de Vaclav Slavic y los menús de ayuda basados en HTML. En el 2000, SciTech Inc. patrocina el desarrollo de wxUniversal, un set de widgets de wxWidgets para todas aquellas plataformas que no cuenten con su propio set de widgets.
En el 2002 Julian Smart y Robert Roebling agregaron la versión wxX11, usando los widgets de wxUniversal. wxX11 solo requiere de X11 y Unix, pudiendo ser usado en cualquier entorno Unix, incluso en sistemas con pocos recursos.
En julio del 2003 wxWidgets comenzó a correr en Windows CE, y Robert Roebling corre una aplicación wxGTK en GPE con Linux integrado.
En el 2004, wxWidgets cambia su nombre desde el original wxWindows, luego que Microsoft lo objetara, al ser Windows una marca registrada.
También durante el 2004, Stefan Csomor y un grupo de colaboradores renovaron completamente wxMac para OS X, mejorando significativamente la apariencia y funcionalidad de las aplicaciones en Mac OS X. Una versión que usa Cocoa, que está en constante desarrollo, dirigido por David Elliot y William Osborne ganó el desafío de entregar una primera versión para Palm OS 6 donde se podía correr una pequeña aplicación en wxWidgets. La versión 2.6, lanzada en abril del 2005, incorporó mejoras importantes para todas estas versiones.
Los planes futuros para wxWidgets incluyen:
Un set de herramientas de administrador, para hacer más fácil la integración de componentes de terceros.
Mejorar el soporte a aplicaciones integradas.
Mecanismos alternativos de control de eventos.
Mejorar los controles, tales como árboles combinados y controles de lista.
WxHTML 2, con todas las capacidades de la web en distintas plataformas.
Iincluir compatibilidad con otros estándares, como STL.
Una versión completa para Palm OS.
La comunidad wxWidgets
La comunidad wxWidgets es muy movida, con dos listas de correo: wx-user para usuarios y wx-dev para colaboradores. Su sitio web tiene noticias, artículos y otros links de interés. Existe también una Wiki, donde cualquiera puede publicar información. Hay disponible, también, un foro, tanto para desarrolladores como para usuarios. Acá puedes encontrar una lista de sitios:
Como la mayoría de los proyectos de código abierto, wxWidgets es desarrollado usando los repositorios de CVS, un sistema de gestión de código que hace un seguimiento histórico de éste. Para evitar un desorden, sólo un pequeño número de desarrolladores tiene acceso a editar los registros de CVS, mientras que el resto de los colaboradores va reportando bugs o publicando parches (actualmente mediante SourceForge). El desarrollo se realiza, principalmente, en dos frentes: en una versión estable, donde sólo se permite código compatible a nivel binario y sin errores; y la versión en desarrollo (cabecera CVS). Se nombran las versiones estables con un número par (por ejemplo, 2.4.x) y la versión en desarrollo con un número impar (por ejemplo, 2.5.x). Los usuarios pueden esperar por el lanzamiento de una nueva versión, o pueden descargar la versión que prefieran.
Las decisiones sobre cambios en la API u otras cuestiones técnicas se adoptan por consenso, normalmente en la discusión en wx-dev. Así como existe una comunidad principal de wxWidgets, existen otras comunidades que han derivado de ésta para crear proyectos apartes, como es el caso de wxPython y wxPerl (ver el apéndice E “Herramientas wxWidgets de terceros”).
wxWidgets y la programación orientada a objetos
Tal y como la mayoría de las frameworks modernas para GUI's, wxWidgets se beneficia del uso de la programación orientada a objetos. Cada ventana es representada como un objeto en C++; estos objetos tienen un comportamiento bien definido, y pueden recibir y responder a eventos. Lo que el usuario ve es la manifestación visual de este sistema interactivo. Tu trabajo como desarrollador es orquestar el comportamiento colectivo de todos estos objetos, lo que se vuelve más fácil con el comportamiento por defecto que wxWidgets implementa por ti.
Por supuesto que no es casualidad que la programación orientada a objetos y las GUI's se integren tan bien, pues sus desarrollos fueron a la par. El lenguaje de programación orientado a objetos Smalltalk, diseñado por Alan Kay entre otros en los '70, fue un hito importante en la historia de la GUI, innovando en la tecnología de la interfaz de usuario y diseño de lenguaje, y aunque wxWidgets ocupa una API y un lenguaje diferente, usa los mismos principios de aquella época.
La Licencia
La licencia wxWidgets (licencia wxWindows oficialmente, por razones legales e históricas) es L-GPL con una cláusula de excepción. Puedes leer el detalle de la licencia en la página web, o en el directorio docs de la distribución, pero en resumen significa que puedes usar wxWidgets para software libre o comercial, sin necesidad de pagar por la licencia, ya sea que linkees las bibliotecas de wxWidgets de manera estática o dinámica. Si realizas un cambio al código fuente de wxWidgets lo debes poner a disposición del público. Por favor, consulta las licencias para las bibliotecas opcionales subordinadas que se distribuyen con wxWidgets, como las bibliotecas PNG y JPEG.
Los códigos fuentes contenidos en este libro están bajo la licencia wxWindows.
La arquitectura de wxWidgets
La tabla 1-1 muestra cuatro niveles conceptuales: La API pública de wxWidgets, las principales versiones, la API de la plataforma de cada versión y el sistema operativo en el que corren.
Tabla 1-1 Versiones de wxWidgets
API wxWidgets |
Versiones wxWidgets |
wxMSW | wxGTK | wxX11 | wxMotif | wxMac | wxCocoa | wxOS2 | wxPalOS | wxMGL |
API Plataforma |
Win32 | GTK+ | Xlib | Motif/ Lesstif | Carbon | Cocoa | PM | Palm OS Protein APIs | MGL |
Sistema Operativo |
Windows/ Windows CE | Unix/ Linux | Mac OS 9/ Mac OS X | Mac OS X | OS/2 | Palm OS | Unix/ DOS |
Las que siguen son las principales versiones de wxWidgets al momento de publicarse este libro.
wxMSW
Esta versión es compilada y corre en todas las versiones del sistema operativo Microsoft Windows, tanto para 32 bits como 64 bits, incluyendo Windows 95, Windows 98, Windows ME, Windows NT, Windows 2000, Windows XP y Windows 2003. También puede ser compilada usando Winelib en Linux, y tiene una configuración que funciona con Windows CE (ver wxWinCE). wxMSW puede ser configurado para usar los widgets de wxUniversal en lugar de los estándar de Win32.
wxGTK
wxWidgets para GTK+ puede usar las versiones 1.X o 2.X del set de widgets de GTK+, en cualquiera de las variantes de Unix que soporten X11 y GTK+ (por ejemplo Linux, Solaris, HP-UX, IRIX, FreeBSD, OpenBSD, AIX y otros). También se puede ejecutar en plataformas integradas con suficientes recursos, por ejemplo, en el entorno GPE de Palmtop (ver figura 1-4). wxGTK es la versión recomendada para sistemas basados en Unix.

Figura 1-4 Ejemplo de "Life!" con wxWidgets ejecutado con GPE en un iPAQ PDA
wxX11
wxWidgets para X11 usa el set de widgets de wxUniversal y se ejecuta directamente en Xlib sin set de widgets nativos. Esto lo hace la versión adecuada para sistemas integrados, pero también se puede usar para aplicaciones de escritorio donde GTK+ no nos sea útil. Corre en cualquier sistema basado en Unix con X11. wxX11 aun no está tan desarrollado como wxGTK. La figura 1-5 muestra una versión de “Life!” compilado en wxX11 y ejecutado en una distribución de Linux/TinyX en un iPAQ PDA.

Figura 1-5 Ejemplo de "Life!" con wxWidgets ejecutado en entorno con X11 integrado
wxMotif
Esta versión puede utilizar Motif, OpenMotif o Lesstif en la mayoría de los sistemas Unix. Considerando que Sun Microsystems está enfocando sus recursos en Gnome y GTK+, Motif no resulta una alternativa atractiva para desarrolladores ni usuarios.
wxMac
wxMac está orientado para Mac OS 9 (desde 9.1 y más recientes) y Mac OS X (desde 10.2.8 y más recientes). Para desarrollos en Mac OS 9 son necesarias las herramientas de Metrowerks CodeWarrior, y para Mac OS X puedes usar Metrowerks CodeWarrior o las herramientas de Apple. Si usas Apple, necesitarás usar Xcode 1.5 o más reciente, o en caso que solo estés usando herramientas de líneas de comando, necesitas GCC 3.3 o más reciente.
wxCocoa
Es una versión en desarrollo, orientada para la API Cocoa de Mac OS X. Aunque la funcionalidad de Carbon y Cocoa son similares, esta versión tiene el potencial de ejecutar GNUStep en plataformas distintas a Mac.
wxWinCE
La versión para Windows CE abarca varios kit de desarrollo de software (SDK) basados en plataformas de Windows CE, incluyendo Pocket PC y Smartphone. El grueso de esta versión está basado en la versión wxMSW para Win32, con algunos cambios orientados a las pequeñas plataformas. La figura 1-6 muestra un demo de Life! Con wxWdgets corriendo en un emulador de Pocket PC 2003. La figura 1-7 muestra cuatro pantallas de diálogo con wxWidgets corriendo en Smartphone 2003 con una pantalla de 176 x 220 pixeles. wxWidgets adapta la interfaz de usuario a las restricciones de estas plataformas, por ejemplo, anidando los menús en lugar de la clásica barra de menú, ya que el Smartphone solo soporta dos botones de menú. Algunas recomendaciones adicionales son necesarias en las aplicaciones, como generar llamadas a SetLeftMenu y SetRightMenu en lugar de agregar los convencionales botones de dialogo OK y Cancelar.

figura 1-6 Ejemplo de Life! con wxWidgets en Pocket PC 2003

Figura 1-7 Ejemplo de diálogos con wxWidgets en Smartphone 2003
wxPalmOS
Esta el la versión para Palm OS 6 (Cobalt). Al momento de editar este libro, esta versión se encuentra en pañales aun. Aun así, es posible compilar y correr, en un simulador de Palm OS 6, un simple ejemplo como el que muestra la figura 1-8.

figura 1-8. Un ejemplo de wxWidgets en Palm OS 6.
wxOS2
wxOS2 es la versión de Presentation Manager para OS2 o eComStation.
Organización Interna
Internamente, el código de wxWidgets se divide, generalmente, en 6 niveles:
Código común, que es usado en todas las versiones. Esto incluye clases de datos, información de tiempo de ejecución, clases bases como la wxWindowBase, que se utilizan para factorizar el código común a todas las implementaciones de un
clase.
Código genérico, para implementar los widgets, independiente de la plataforma, permitiendo emular los controles y otras funciones que no estén presentes en una plataforma determinada. wxWizard y wxCalendarCtrl son ejemplos de controles genéricos.
WxUniversal es un conjunto de widgets básico para aquellas plataformas que no posean sus propios widgets, como X11 o MGL.
Código específico de la plataforma para implementar las clases de funcionalidades nativas de cada plataforma. Un ejemplo de código específico de plataforma es la clase wxTextCtrl en wxMSW para implementar el control de edición en Win32.
Código aportado existe en una jerarquía independiente llamada contrib e incluye clases no esenciales, pero útiles como wxStyledTextCtrl.
Código de terceros comprende las bibliotecas que se han desarrollado de forma independiente de wxWidgets, pero se utilizan para implementar característica importantes. Ejemplos de código de terceros son las bibliotecas para JPEG, Zlib, PNG y Expat.
Cada versión adopta lo que necesite de estos niveles para implementar wxWidgets en sus respectivas API.
¿Cómo sabe wxWidgets cuales clases usar cuando compilas tu aplicación? Cuando incluyes un archivo cabecera de wxWidgets, como wx/textctrl.h, lo que haces en realidad es incluir un archivo específico para la plataforma, como wx/msw/textctrl.h, esto gracias a las directrices incluidas en wx/textctrl.h, siempre y cuando generes las declaraciones apropiadas. Enlazas tu aplicación con la librería que tiene la configuración adecuada para la plataforma en cuestión. Pueden existir varias configuraciones disponibles a la vez, como la versión Debug y Release, o puedes enlazar el código de wxWidgets de manera estática o dinámica. Si quieres puedes inhabilitar los componentes de wxWidgets, o elegir entre Unicode y ANSI, editando el archivo setup.h, o usando las opciones de configuración, dependiendo del compilador. Para más detalles, revisa el apéndice A, “Instalando wxWidgets”. Nota que, aunque wxWidgets es una biblioteca de envoltura para cada API, esto no te impide escribir código específico para la plataforma en que la API es nativa si es que lo requieres, aunque normalmente no será necesario algo así.
Sumario
En este capítulo hemos definido lo que es wxWidgets, descrito algo de su historia, mencionamos las versiones disponibles, y dimos un vistazo a como se organiza internamente la biblioteca.
En el próximo capítulo, “Primeros Pasos”, veremos algunos códigos de ejemplo y nos acercaremos más a la escritura de una aplicación en wxWidgets.