| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mi primer programa Este capítulo supone que tienes experiencia en. . . 2.1 IndicacionesVoy a comenzar con algo pequeño y verá lo fácil que es utilizar directamente la API de Windows. Aprenderá a mostrar un mensaje en pantalla y las características del código C++ en una aplicación en Windows. Para ello se seguirán estos 5 sencillos pasos:
#include <windows.h> int WINAPI WinMain(HINSTANCE p1, HINSTANCE p2, LPSTR p3, int p4) { MessageBox(NULL, "¡Bienvenido a la programación Windows!", "Ejemplo", MB_OK); return 0; }
¡Increíble! Ha sido capaz de mostrar un mensaje en pantalla completamente funcional como en la fig. 2.1.1. No estoy exagerando, ha sido un gran logro en su aprendizaje. Lo que ha hecho le hubiera tomado semanas enteras pero solo le ha tomado unos cuantos minutos gracias a que accede a funciones de la API. Dése cuenta que ha sido capaz de crear una ventana que cuenta con una barra de título (1), una etiqueta de texto (3) y dos botones (Aceptar 2 y Cerrar 4), el mensaje tiene buena apariencia, se puede mover por toda la pantalla, sin contar demás detalles, ¡esto pone interesante!.
En caso de haber errores: el compilador le mostrará un mensaje con una descripción (aunque a veces no sea de mucha ayuda). Todo varía dependiendo del tipo de compilador. El problema más común es que el compilador no este configurado para trabajar en un proyecto Windows y no encuentre la función 2.2 #include <windows.h>Esta es la primera línea del programa anterior y servirá para incluir el archivo de cabecera Si le ayuda, puede verlo como un equivalente a las librerías estándar utilizadas en las aplicaciones de consola (ej. iostream). El archivo de encabezado windows.h proporciona una ruta de acceso a más de mil declaraciones de constantes, declaraciones typedef y cientos de prototipos de funciones. 2.3 La función WinMain()Ésta es la tercera línea del programa (contando la línea en blanco). En las aplicaciones de consola se utilizan la función "main()" para indicar el punto de partida del programa. Esa función ya no resulta para aplicaciones Windows. La función Recorde cómo escribió esta función:
int WINAPI WinMain(HINSTANCE p1, HINSTANCE p2, LPSTR p3, int p4) { ... } Al finalizar la función WinMain(), se deberá devolver un número entero al sistema operativo, por lo que habremos de declararla como La constante La función Los dos primeros parámetros, El tercer parámetro El cuarto y último parámetro 2.4 AcuerdosCuando diseñaron Windows, se utilizó una metodología especial para nombrar variables, constantes, clases, estructuras, etc: la Notación Húngara. Se le llama así en honor a su inventor, Charles Simonyi, de origen húngaro. Él propuso que cada nombre debe llevar un prefijo que identifique al tipo de dato, así por ejemplo, un programador cualquiera puede saber fácilmente el tipo de variable que se trata sin tener que buscar su declaración. Aunque no es estrictamente necesario, es de mucha utilidad y es una práctica común al programar para Windows. No es un requisito que utilice estos prefijos, pero le será de mucha ayuda conocerlos. Aquí va una lista de prefijos más utilizados para nombrar constantes y variables:
Se utilizará a lo largo de todo el curso, así que no intente aprenderse toda la tabla... mejor tómela de referencia y ya verá que con el tiempo identificará casi inconscientemente su tipo. Generalmente se usa la primera letra o una abreviación del tipo de dato. Ejemplos: nEdad es un número entero de alguna edad; hInstance es un manipulador de instancia (después veremos a que se refiere con "manipulador de instancia"). Se pueden realizar combinaciones mientras sea válido, por ejemplo, lp para long pointer o dw para double word. Así, lpszNombre indica que es un puntero largo que apunta a una cadena de caracteres terminada en cero y que contiene un nombre (aunque algunos optan por nombrarlo lpNombre para no hacerlo muy grande, lo correcto es ponerlo completo). ¡Alto!, ¿lp o puntero largo? en realidad es un simple puntero y ya. Antiguamente existían dos tipos de punteros: cortos (de 2 bytes) y largos (de 4 bytes). A partir de Windows 95 se usan solo los punteros de 4 bytes y ha quedado la costumbre de seguirles llamando largos. Basado en esto, se rescribirá la función
int WINAPI WinMain(HINSTANCE hInstancia, HINSTANCE hInstanciaPrev, LPSTR lpszLineaCmd, int nEstadoVentana) { ... } 2.5 Tipo de datos y constantesEn la programación en Windows existen tipos de datos "nuevos". En nuestro programa anterior tuvimos la oportunidad de trabajar dos: Otra cosa, es muy común que las funciones trabajen y regresen números para indicar algo en específico, un ejemplo, el cuarto parámetro de la función WinMain(), Sabiendo esto y si así lo desea, puedes escribir el código de la siguiente manera:
#include <windows.h> int __stdcall WinMain(HINSTANCE hInstancia, HINSTANCE hInstanciaPrev, char* lpszLineaCmd, int nEstadoVentana) { MessageBox(0, "¡Bienvenido a la programación Windows!", "Ejemplo", 0); return 0; } No lo recomiendo, pero sí lo puede hacer. La desventaja es que el código será tarde o temprano quedará obsoleto si actualizan la API y perderá legibilidad. También se tendrá que recurrir a la documentación de Windows para averiguar que significa el 0 en el cuarto parámetro de Se estarán continuamente manejando esas constantes numéricas. Volviendo al cuarto parámetro de la función Si es curioso puede examinar los archivos de cabecera de windows.h, donde es posible encontrar sus siguientes declaraciones:
#define SW_SHOWNORMAL 1 #define SW_SHOWMINIMIZED 2 #define SW_SHOWMAXIMIZED 3 ¿Complicado? Las constantes se distinguen porque están escritas en MAYÚSCULAS, tienen un prefijo generalmente de dos letras (SW_, CS_, WM_, etc) y siempre es una buena idea usarlas. El prefijo indica la categoría o su finalidad como por ejemplo, SW_ que se refiere a Show Window (mostrar ventana). Con el tiempo irá memorizando las más comunes y de ahora en adelante sabrá que la documentación de Windows es un apoyo inseparable, como se verá en otro capítulo más avanzado, donde le diré cómo y dónde conseguirla. 2.6 La función MessageBox()Nuevamente, si se busca en el archivo windows.h (dentro de winuser.h) encontrá el prototipo de esta función:
int WINAPI MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT); #define MessageBox MessageBoxW La función Hasta ahora al cuarto parámetro le hemos indicado el valor MB_OK (que sabemos vale cero) porque ese número indica que quiere mostrar el botón Aceptar. Si al cuarto parámetro se le indica otro número, es posible mostrar un ícono de error o de pregunta, además de mostrar otros botones diferentes de "Aceptar". Esto no se hace al azar, ya he explicado que contamos con constantes numéricas para indicar qué botones y qué ícono mostraremos en pantalla. Aquí va una pequeña lista de constantes numéricas ya declaradas en windows.h y que puede combinar para mostrar diferentes mensajes:
// BOTONES #define MB_OK 0 //botón "Aceptar" #define MB_OKCANCEL 1 //botones "Aceptar" y "Cancelar" #define MB_ABORTRETRYIGNORE 2 //botones "Anular", "Reintentar", "Omitir" #define MB_YESNOCANCEL 3 //botones "Sí", "No" y "Cancelar" #define MB_YESNO 4 //botones "Sí" y "No" // ICONOS #define MB_ICONINFORMATION 64 //ícono de información #define MB_ICONEXCLAMATION 0x30 //ícono de alerta, signo de exclamación #define MB_ICONERROR 16 //ícono de error, alto, tacha roja #define MB_ICONQUESTION 32 //ícono de pregunta Para combinar dos constantes (ejemplo
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstancia, HINSTANCE hInstanciaPrev, LPSTR lpszCmd, int nEstadoVentana) { MessageBox(0,"¿Guardar cambios?", "Título", MB_YESNO | MB_ICONQUESTION); return 0; } Nota aclaratoria: Hay ocasiones en que la suma de las constantes (MB_YESNO + MB_ICONQUESTION) rinden el mismo resultado que utilizando el operador OR numérico (MB_YESNO | MB_ICONQUESTION). Algunos programadores suman las constantes y les funciona, pero no es lo mismo y no debe seguir sus pasos. Para evitar errores, le recomiendo utilizar siempre el operador OR numérico "|", nunca sume las constantes en sus códigos. 2.7 Ejercicios1. Profundizando en la función MessageBox. Deberá mostrar un mensaje en pantalla, con la función
2. Prueba de fuego. Esta es la prueba de fuego, supuestamente ahora es capaz de crear y entender este programa:
#include <windows.h> #include <string.h> int WINAPI WinMain(HINSTANCE hInstancia, HINSTANCE hInstanciaPrev, LPSTR lpszLineaCmd, int nEstadoVentana) { if (strcmp(lpszLineaCmd, "PASS:Windows") == 0) MessageBox(NULL, "¡Contraseña aceptada!", "Bienvenida", MB_OK | MB_ICONINFORMATION); else MessageBox(NULL, "Contraseña incorrecta", "Error", MB_OK | MB_ICONERROR); return 0; }
Pues sucede que si genera un ejecutable de ese programa, va a Menú Inicio / Ejecutar y teclea su ruta junto con la contraseña, como en la fig. 2.7.2, recibirá un mensaje como en la fig. 2.7.3. ¿Cómo ve? apenas estamos calentando motores y ya es capaz de implementar una sencilla restricción en sus programas.
En caso de haber errores: Si le muestra siempre el mensaje de contraseña incorrecta, es por eso, no ha introducido correctamente la contraseña. Este error no le debería de pasar en este curso a este nivel, pues sabe que la función 2.8 Resumiendo. . .Ya sabe que siempre hay que incluir el archivo de cabecera
Los nombres por sí mismos nos dan una gran referencia de su finalidad, aun sin embargo, estoy consciente de las dudas que crean los dos primeros parámetros (¿qué es un manipulador? ¿qué es una instancia?) por lo que en los dos siguientes capítulos abriré espacios para explicar detenidamente esos conceptos y básicamente incrementaremos el nivel del curso para que no se quejen los listos. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|