Capítulo 3 P C++ ROGRAMACIÓN EN W AMBIENTE INDOWS Uno de los ambientes computacionales más usado actualmente es Microsoft Windows. Hasta hace poco tiempo para desarrollar una apli- cación para Windows se debía aprender el "Microsoft Windows Softwa- re Development Kit" (SDK) y cientos de funciones y mensajes. Por esta razón Borland gracias a las ventajas que ofrece la Orientación a Objetos ofrece ahora la biblioteca o jerarquía de objetos "ObjectWindows Libra- ry®" (OWL), incorporada con C++. ObjectWindows es un conjunto de clases que contienen las funcio- nes y mensajes del "Microsoft Windows Software Development Kit", además tiene características importantes como las siguientes: (cid:31) Una curva fácil de aprendizaje. (cid:31) Una plataforma simple para el desarrollo de aplicaciones. (cid:31) Código reutilizable. (cid:31) Facilidades para la programación de ventanas, barras de íconos (but- ton bars), línea de estado (status line), cajas de diálogo, controles, entre otros. 2 Programación C++ en ambiente Windows Por lo anterior este capítulo está orientado a presentar los elementos básicos de programación C++ en ambiente Windows mediante la reuti- lización de código con la jerarquía de objetos Object-Windows® 2.0 de Borland. Se incluyen temas como: el uso de menús, cajas de diálogo, aceleradores, íconos, mapas de bits (bitmaps), entre otros. 3.1 El programa mínimo En esta sección presentamos el código mínimo que debe tener una aplicación Windows implementada con OWL, además se explica cómo se deben compilar y ejecutar tales aplicaciones. FIGURA 3.1. Icono para crear un nuevo proyecto en IDE. 1 Programación C++ en ambiente Windows FIGURA 3.2. Caja de diálogo para crear un nuevo proyecto. 1. Para crear una aplicación con OWL siga los siguientes pasos: 1. Cargue Borland C++. 2. Seleccione Proyect | New Proyect, o bien presione el ícono para crear proyectos nuevos, tal como se presenta en la Figura 3.1. 2 Programación C++ en ambiente Windows FIGURA 3.4. Ventana de pro- yectos en IDE. 1. 3. Luego Borland presenta la caja de diálogo de la Figura 3.2. 4. Mediante el botón Brouse... seleccione el directorio y el nombre ade- cuado para el proyecto, luego en el "Target Type" seleccione Application [exe] y en "Standard Libraries" seleccione los botones, tal como se mues- tra en la Figura 3.2. FIGURA 3.3. Caja de diálogo de la opción Advan- ced... en proyec- tos nuevos. 1. 2 Programación C++ en ambiente Windows 5. En esta misma caja de diálogo seleccione el botón Advanced, le apa- recerá la caja de diálogo de la Figura 3.3, seleccione .cpp Node y .def como se muestra en la Figura 3.3. Por tratarse de la aplicación mínima, este ejemplo no llevará archivo de recursos .rc, aunque prácticamente siempre deberá seleccionarse también. 6. Dé click en el botón OK, entonces aparecerá la ventana de la Figura 3.4. Luego dé doble click sobre el nodo e31.cpp como se muestra en la Figura 3.4 para que aparezca la ventana donde se editará el programa principal. 7. El programa se podrá compilar y ejecutar tal como se explicó en la sección 2.2. El programa mínimo en OWL se presenta en el ejemplo 3.1. Este programa debe tener por lo menos dos partes: la clase TPrincipal deriva- da de TApplication y la función principal OwlMain que sustituye a la fun- ción main() de los programas tradicionales tipo C. La clase TPrincipal es la clase que nosotros hemos definido, por esto la destacamos en negrita e itálica; mientras que la clase TApplication forma parte de OWL. (cid:31) Ejemplo 3.1. Programa mínimo en OWL: // E31.CPP #include <owl\owlpch.h> #include <owl\applicat.h> #include <owl\framewin.h> class TPrincipal : public TApplication { public: TPrincipal() : TApplication() {} // Constructor void InitMainWindow(); }; // Implementación del método InitMainWindow void TPrincipal::InitMainWindow() { SetMainWindow(new TFrameWindow(0, "Programa mínimo en Object-Windows")); } // Programa Principal en Object-Windows El programa mínimo 3 FIGURA 3.5. Salida del pro- grama mínimo en OWL. int OwlMain(int argc, char* argv[] ) { TPrincipal Ap; return Ap.Run(); } // E31.DEF <------ No digite esta línea en el archivo pues produce error NAME E31 DESCRIPTION 'Aplicación mínima en OWL' EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE MULTIPLE HEAPSIZE 4096 STACKSIZE 8192 La salida que produce este programa es únicamente una instancia de TFrameWindow creada por el método InitMainWindow, es decir la ventana principal del programa. Esta ventana podrá ser minimizada, maximiza- da, movida y podrá tener controles, tales como el menú. La clase TFra- meWindow forma parte OWL y se explica con detalle más adelante. Esta salida se presenta en la Figura 3.5. 4 Programación C++ en ambiente Windows La primera parte del programa mínimo es la clase que administra la aplicación, esta clase debe ser derivada de la clase TApplication de OWL, la cual provee las funcionalidades necesarias para inicializar la aplica- ción, crear la ventana principal, ejecutar el ciclo o paso de mensajes ("message loop" de Windows) para ejecutar la aplicación. La definición de esta clase se muestra en el siguiente fragmento de código: class TPrincipal : public TApplication { public: TPrincipal() : TApplication() {} // Constructor void InitMainWindow(); }; Nótese que esta clase tiene dos métodos: el constructor que tiene código "inline" vacío y el método InitMainWindow() que redefine al método Init- MainWindow() de la clase TApplication. Este método se encarga de crear la ventana principal y de ponerle un título. El código de este método es el siguiente: void TPrincipal::InitMainWindow() { SetMainWindow(new TFrameWindow(0, "Programa mínimo en El programa mínimo 5 Object-Windows")); } El fragmento de código new TFrameWindow(0, "Programa mínimo en Object-Windows") lo que hace es invocar al constructor de la clase TFrameWindow (que forma parte de OWL) para crear la ventana princi- pal. Las relaciones existentes hasta ahora se muestran en la Figura 3.6. Las clases que forman parte de OWL se presentan sombreadas. De este diagrama se puede notar que el programa mínimo de OWL es suma- mente pequeño; pero existe gran reutilización del código. Para ver un TStreamableBase TEventHandler FIGURA 3.6. Relación de herencia TModule en el programa míni- mo de OWL. TApplication TFrameWindows TPrincipal diagrama con todo detalle, una vez que el proyecto esté cargado, selec- cione la opción View | Classes y Borland C++ desplegará un diagrama con las relaciones existentes entre las clases. 6 Programación C++ en ambiente Windows La segunda parte del programa mínimo en OWL es el programa principal OwlMain(. . .) el cual reemplaza la función main() de un pro- grama usual tipo C o C++. El código de esta función es el siguiente: int OwlMain(int argc, char* argv [] ) { TPrincipal Ap; return Ap.Run(); } Este programa principal consta de la declaración de una instancia o va- riable de tipo TPrincipal (clase que nosotros definimos) denominada en este caso Ap, esto mediante la instrucción: TPrincipal Ap; luego se ejecuta el método Run() de la clase TPrincipal, este método fue heredado de la clase TApplication, éste se encarga de correr la aplicación y de reconstruir la pantalla una vez que el programa concluya su ejecu- ción, lo anterior se logra con la instrucción: return Ap.Run(); El programa principal OwlMain(int argc, char* argv []) tiene como puede verse, dos argumentos: el primero de tipo entero argc y el segun- do de tipo hilera argv[]. Los nombres de estos argumentos son muchas veces colocados como comentarios; pues generalmente no se utilizan, con lo cual se evitan dos mensajes de alerta (Warning). De modo que el código de la función OwlMain, usualmente es el siguiente: // Programa Principal en Object-Windows int OwlMain(int /* argc */, char* /* argv */ [] ) { TPrincipal Ap; return Ap.Run(); } Para terminar esta sección diremos que todo programa Windows debe tener un archivo definición, cuya extensión es .DEF. En este archi- El programa mínimo 7 vo se documenta el programa para futuras referencias y se controlan las características del mismo. Si el archivo .DEF no aparece en el proyecto Borland C++ tomará un archivo de definición estándar y enviará un mensaje de Warning. Para la aplicación mínima de OWL el archivo de definición es el siguiente: NAME E31 DESCRIPTION 'Aplicación mínima en OWL' EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE MULTIPLE HEAPSIZE 4096 STACKSIZE 8192 3.2 Ventanas bajo Object-Windows Todas las aplicaciones que corren bajo Windows usan áreas rectan- gulares de la pantalla denominadas ventanas, con el fin de que la aplica- ción se comunique con el usuario. OWL ayuda a crear, desplegar, des- truir ventanas, además ayuda a crear gráficos en las ventanas y sobre to- do permite administrar toda la aplicación a través de ventanas. En la sección anterior se mostró que la clase TApplication permite crear la ventana principal de la aplicación. En esta sección mostraremos cómo definir una nueva clase derivada de TFrameWindow para darle a esta ventana las características que deseamos para nuestra aplicación. Toda aplicación OWL tiene una ventana principal. Las ventanas en OWL son todas derivadas de la clase TWindow. En el siguiente ejemplo se agrega al ejemplo 3.1 una nueva clase derivada de TFrameWindow la cual a su vez es derivada de TWindow, esto porque como se verá adelan- te TFrameWindow ofrece algunas ventajas adicionales. (cid:31) Ejemplo 3.2. Ventana principal con OWL: // E32.CPP #include <owl\owlpch.h> #include <owl\applicat.h> #include <owl\framewin.h>
Description: