2. El programa basico Windows Escrito por Vicengetorix El programa basico con el que empezaremos a trabajar. Primero creamos un programa minimo al que ir añadiendo cosas e ir compilando y viendo como queda. No es muy ortodoxo, pero no somos profesionales. ¡Al tema!... Empezamos a codificar con el programa basico para windows, que sera el esqueleto sobre el que se sostendra nuestro programa. Como en cualquier programa C o C++, primero incluimos los ficheros ".h" o ".hpp", definimos variables globales y comienza la ejecucion con el contenido de la funcion "main" (en windows WinMain). Merecen mencion tres partes definidas del programa. Primero la funcion ProcesaMensajes que se puede llamar como queramos. Esta funcion es para tratar los mensajes del sistema operativo como necesitemos. Por ahora solo tendremos encuenta la tecla ESC y la destruccion de la ventana para evitar que no haya forma de salir de nuestro programa y tengamos que cargarnoslo a lo bruto. Esta funcion se asociara mas tarde a la ventana que crearemos. Las dos partes restantes estan dentro de la funcion WinMain, aunque podrian definirse en funciones independientes y llamarlas desde WinMain; a gusto del programador. La segunda define y crea una ventana asociada a nuestro programa. Esta ventana no hace ahora nada, pero mas adelante sera usada como "pizarra de dibujo" con OpenGL. A esta ventana se asocia la funcion ProcesaMensajes, de forma que intercepte los eventos del windows que tengan lugar en esta ventana. La tercera parte es el bucle basico de un programa windows, ejecutandose continuamente y procesando los mensajes hasta que recibe el mensaje de terminar el programa (lo lanzamos nosotros al 1/8 2. El programa basico Windows Escrito por Vicengetorix destruir la ventana con el comando PostQuitMessage(0);). Al salir de este bucle el programa termina. El ejemplo de programa completo que no hace nada es este: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 2/8 2. El programa basico Windows Escrito por Vicengetorix 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 3/8 2. El programa basico Windows Escrito por Vicengetorix 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 4/8 2. El programa basico Windows Escrito por Vicengetorix 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 #include <windows.h> // Fichero de inclusion para programas Windows HINSTANCE IdAplicacion ; // Para guardar el identificador del programa HWND IdVentana ; // Para guardar el identificador de la ventana //-----------------------------------------------------------------// Funcion para controlar lo que ocurre en la ventana segun los eventos // que vienen de Windows. Mas tarde se asocia a la ventana que crearemos. // De momento solo interceptamos la tecla ESC para poder salir del // programa cuando queramos y el evento de destruccion de ventana con el // que terminamos la aplicacion LRESULT FAR PASCAL( ProcesaMensajes HWND Ventana, UINT Mensaje, WPARAM wParam, ) LPARAM lParam { switch ( Mensaje ) // Según { case WM_KEYDOWN : // Caso de mensaje de pulsació 5/8 2. El programa basico Windows Escrito por Vicengetorix // y segun el contenido de la variable wParam switch ( wParam { case VK_ESCAPE : // Funcion para enviar mensaje de cerrado a la ventana // y despues de la aplicacion PostMessage ( Ventana, WM_CLOSE, break ; } break ; // Mensaje de destrucción de la ventana (provocado por // nosotros al pulsar ESC o cerrar la ventana. case WM_DESTROY : PostQuitMessage ( 0 break ; } // Efectuar el proceso por defecto del mensaje (si viene // cualquier mensaje que no hemos usado, querremos que haga // lo que suele hacer) return DefWindowProc ( } // fin ProcesaMansajes //----------------------------------------------------------------- //-----------------------------------------------------------------// Funcion principal de un programa Windows // (como main en C normal, aqui WinMain) // el programa empieza a ejecutarse a partir de esta funcion. int PASCAL WinMain ( LPSTR lpszCmdLine,int nCmdShow { // Para que no moleste al compilar, no lo usamos. UNREFERENCED_PARAMETER ( lpszCmdLine // Guardo el identificador del programa, luego lo usamos. IdAplicacion = hInstance // Declaramos un tipo de ventana, el nuestro. WNDCLASS ClaseVentana ; //Definimos nuestro tipo de ventana... // Se redibujara si cambia el tamaño de la ventana // horizontal y verticalmente, y un solo DC (device context) // para cada ventana (para cuando empezemos con OpenGL) ) // ESC causa la salida del progr 0 , ) ; Ventana, Mensaje, wParam, ) lPa HINSTANCE hInstance, HINST ) ) ; ; 6/8 2. El programa basico Windows Escrito por Vicengetorix ClaseVentana. style = // La definimos antes para contolar // los mensajes como los del teclado. ClaseVentana. lpfnWndProc = // Sin memoria extra para la clase. ClaseVentana. cbClsExtra = // Sin memoria extra para la ventana. ClaseVentana. cbWndExtra = // Identificador del programa para asociar // esta ventana con este programa. ClaseVentana. hInstance = // De momento pasamos de icono. ClaseVentana. hIcon = // Flecha normal de raton. ClaseVentana. hCursor = // Por ahora ponemos el fondo blanco. ClaseVentana. hbrBackground = // Pasamos de menu. ClaseVentana. lpszMenuName = // Nombre de la clase (la "L" antes de la cadena es // por que solo admite cadenas de caracteres // unicode -LPCWSTR o TCHAR- y con la "L" se convierte). ClaseVentana. lpszClassName = // Registramos nuestro tipo de ventana. RegisterClass ( & // Funcion que crea la ventana. Guardamos el identificativo. IdVentana = CreateWindowEx WS_EX_APPWINDOW, // estilo extendido de ventana L "UnSitioWeb" , //(la "L" antes para convertir a UNICODE) L "Un Sitio Web" , // Parametros de como sera la ventana, // se pueden combinar varios. WS_POPUPWINDOW| WS_CAPTION 100 , // Posicion Horizontal. 100 , // Posicion Vertical. 600 , // Ancho de la ventana. 450 , // Alto de la ventana. ( HWND ) // No le damos un menu diferente al de la clase // (que es ninguno). ( HMENU ) // Identificador del programa al que pertenece // la ventana. Al empezar lo guardamos en una CS_HREDRAW | ProcesaMensajes ; 0 ; 0 ; IdAplicacion ; NULL ; LoadCursor ( ( HBRUS NULL ; L "UnSitio ClaseVentana ) ( // Nombre de la clase puesto an // Titulo que aparecera en la ven | WS_MIN NULL , NULL , 7/8 2. El programa basico Windows Escrito por Vicengetorix // variable para usarlo despues. IdAplicacion, // Puntero a "no se que" datos (pasamos del tema, // es para aplicaciones MIDI). ( LPVOID ) NULL ShowWindow ( IdVentana, SW_SHOW ) // La actualizo para que muestre lo que tenga que // mostrar (ahora nada). UpdateWindow ( IdVentana ) // Este es el bucle habitual de windows que se esta // ejecutando continuamente hasta que recibe el mensaje // de acabar (ya lo hemos preparado en la funcion // "ProcesaMensajes" asociada a la ventana, tambien // asociada a este programa atraves de su identificativo). // Varible para contener los mensajes que van llegando. MSG Mensaje ; while ( TRUE ) { // Exploramos la cola de mensajes. if ( PeekMessage ( { // procesándolos adecuadamente if ( ! GetMessage // En este caso terminamos. return ( int ) TranslateMessage ( & Mensaje DispatchMessage ( & Mensaje } // en caso contrario esperamos un mensaje. else WaitMessage ( ) } } // fin WinMain //----------------------------------------------------------------- ) ; ; // Se eje & ( Mensaje ) ) ; Seguiremos despues inicializando OpenGL en un programa Windows. 8/8