2. El programa basico Windows

Anuncio
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
Descargar