NovaMonoFix
Errores PHP
X
Usuario
Password
0 FPS

Tutorial WINAPI C++ 1.2 (Creación de una ventana)

02 de Abril del 2010 por Josep Antoni Bover, 0 visitas, 0 comentarios, 0 votos
Categorías : Windows, Programación, C y C++.
La web está en segundo plano, animación en pausa.
Cargando animación...
Tutorial WINAPI C++ 1.2 (Creación de una ventana)

En este tutorial empezaremos a entrar en materia y crearemos nuestra primera ventana en C, de forma que podais ver basicamente que funciones intervienen en la creacion de una ventana

Para empezar una ventana no es más que un conjunto de datos que Windows utiliza internamente para definir una porción de la pantalla para que el usuario pueda interactuar con ella. Cuando un usuario realiza alguna acción encima de una ventana, dicha acción se envía en forma de mensaje a la función WindowProcedure de la ventana en cuestión. En esencia el WindowProcedure determina el comportamiento de una ventana cuando esta recibe algún evento / acción.

Hay 2 formas de crear ventanas, via código o usando el editor de recurso. En este tutorial solo tocaremos como crear ventanas via codigo ya que me parece mas dinamico y facil de entender, ademas utilizar el editor de recursos para hacer aplicaciones tipo base de datos con muchos controles puede ser util, pero para realizar el tipo de aplicaciones gráficas que me gusta hacer resulta mucho más confuso.

Para crear una ventana hay que seguir 3 pasos básicos :
1) En primer lugar debéis crear una función del tipo WindowProcedure, que se usara como esqueleto para recibir mensajes de nuestra ventana.

Archivo : Tutorial_CrearVentana.cpp
1
2
3
4
5
6
7
8
9
static LRESULT CALLBACK WindowProcedure( HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam ) {
switch (Msg) {
case WM_CLOSE :
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}

En este esqueleto básico se está mirando cuando la ventana recibe el mensaje WM_CLOSE. El mensaje WM_CLOSE nos dice que el usuario ha cerrado la ventana, en este caso al recibir dicho mensaje usamos la API PostQuitMessage para indicar a la aplicación que debe terminar. Una vez sale del switch, se debe retornar la API DefWindowProc, la cual procesara los mensajes por defecto.

Hay que destacar que el WindowProcedure es por donde pasaran todos los mensajes de la ventana, estos mensajes pueden referirse a eventos de cualquier tipo como cuando se mueve el mouse, cuando se hace click, cuando se presiona una tecla del teclado, etc… Además también podemos usar esta función para pasar datos de una ventana a otra.

2) En segundo lugar debéis registrar la clase ventana, para ello habrá que especificar un nombre de clase, y el WindowProcedure que se creó anteriormente.

Archivo : Tutorial_CrearVentana.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void RegistrarClaseVentana(const TCHAR *NombreClaseVentana, WNDPROC WndProc) {
WNDCLASSEX WinClass;
WinClass.cbSize = sizeof(WNDCLASSEX);
WinClass.style = 0;
WinClass.lpfnWndProc = WndProc;
WinClass.cbClsExtra = 0;
WinClass.cbWndExtra = 0;
WinClass.hInstance = GetModuleHandle(NULL);
WinClass.hIcon = NULL;
WinClass.hIconSm = NULL;
WinClass.hCursor = LoadCursor(0, IDC_ARROW);
WinClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
WinClass.lpszMenuName = 0;
WinClass.lpszClassName = NombreClaseVentana;
ATOM A = RegisterClassEx(&WinClass);
}

En este ejemplo utilizamos la función RegistrarClaseVentana a la que le pasamos el nombre para nuestra clase ventana, y el WindowProcedure que usara esta. Cuando registramos una clase ventana lo que estamos haciendo es registrar un modelo de ventana para que al crearla, windows sepa donde tiene que mandar sus mensajes y que atributos tiene. Para ello dentro de nuestra función RegistrarClaseVentana utilizamos la API RegisterClassEx pasandole una estructura WNDCLASSEX con los datos de la ventana.

Si por ejemplo registramos la clase "ClaseMiVentana", y dicha clase al recibir el mensaje WM_CLOSE termina la aplicación, podemos mostrar 50 ventanas, que solo con cerrar una de ellas terminara la aplicación y por consecuencia todas las demás ventanas de la misma instancia se cerraran.

3) Por último ya podemos utilizar la API CreateWindowEx para crear nuestra ventana.

Archivo : Tutorial_CrearVentana.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// Defino el nombre para mi clase ventana
TCHAR NombreClase[] = TEXT("NombreVentana");
// Registro la clase ventana
RegistrarClaseVentana(NombreClase, WindowProcedure);
// Creo la ventana
HWND hWnd = CreateWindowEx( NULL, NombreClase, TEXT("Ejemplo tutorial 1.2"), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 300, 300, NULL, NULL, hInstance, NULL );
// Bucle principal para obtener eventos de la ventana
MSG Mensaje;
while (TRUE == GetMessage(&Mensaje, NULL, 0, 0)) {
TranslateMessage(&Mensaje);
DispatchMessage(&Mensaje);
}
return 0;
}

Hay que remarcar que la función CreateWindowEx nos devuelve el identificador único de nuestra ventana, que necesitaremos para realizar cualquier tipo de operación sobre ella. Este identificador es un HWND, y no tiene nada que ver con la ID que le asignemos a la ventana, ya que esas ids no tienen porqué ser únicas, en cambio el HWND siempre lo es (Cada HWND tiene un valor distinto y nunca coincidira con otro HWND, y ademas no tiene porque tener el mismo valor que la ultima vez)

Ahora que ya sabéis lo más básico sobre las ventanas podéis pasar a ver como crear un objeto ventana que podáis re-utilizar en vuestras aplicaciones futuras : 1.3 - Creación de nuestro objeto ventana.

Descargar tutorial WinAPI completo Calculadora compilada