Hola Complicado Mundo OpenGL-Win32

CREAR LA VENTANA WIN32

Para crear la ventana es necesario llenar el WNDCLASS, registrarlo y finalmente crear la ventana. El WNDCLASS


WNDCLASS	Cwnd;

hInstance		= GetModuleHandle(NULL);
Cwnd.style		= CS_OWNDC;
Cwnd.lpfnWndProc    = (WNDPROC) WndProc;
Cwnd.cbClsExtra	      = 0;
Cwnd.cbWndExtra	    = 0;
Cwnd.hInstance	      = hInstance;
Cwnd.hIcon	 	= NULL;
Cwnd.hCursor	        = LoadCursor(NULL, IDC_ARROW);
Cwnd.hbrBackground   = NULL;
Cwnd.lpszMenuName   = NULL;
Cwnd.lpszClassName   = "OpenGL";

RegisterClass(&Cwnd);

hWnd=CreateWindow(
"OpenGL",
	"Hola Mundo",
	WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS |	WS_CLIPCHILDREN
	,100, 100,
	VENTANA_ANCHO,
	VENTANA_ALTO,
	NULL,
	NULL,
	hInstance,
	NULL);

La función GetModuleHandle() obtiene un identificador para la aplicación actual.

Los datos de la estructura WNDCLASS son los siguientes:

WNDCLASSS
{
UINT style : Estilo de la aplicación, en este caso se quiere un DC propio (CS_OWNDC)
WNDPROC lpfnWndProc : Manejador de mensajes
int cbClsExtra : Bytes extra para la estructura
int cbWndExtra : Bytes extra para la clase
HINSTANCE hInstance : Instancia de la aplicación que crea la ventana
HICON hIcon : Icono de la ventana, al ser NULL, windows provee el icono por defecto.
HCURSOR hCursor : Cursor usado al pasar sobre la ventana, LoadCursor(NULL,IDI_ARROW) es el icono por defecto
HBRUSH hbrBackground : Color del fondo de la ventana,debido a que todo el espacio de la ventana va a estar ocupado por la ventana, este valor se provee como NULL
LPCTSTR lpszMenuName : Nombre del recurso que identifica el menú de la aplicación, es NULL ya que no se utiliza menú.
LPCTSTR lpszClassName : Nombre de la clase que se usara al registrarla.
}

El manejador de mensajes al que hace referencia es en este caso uno muy simple:

LRESULT CALLBACK WndProc(HWND	hWnd,UINT uMsg,WPARAM wParam,LPARAM	lParam)
{
	switch (uMsg)
	{
		case WM_CLOSE:
		{
			PostQuitMessage(0);
			return 0;
		}
	}
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

Las entradas de esta función son:

HWND hWnd : Identificador de la ventana que recibe el mensaje
UINT uMsg : El mensaje
WPARAM wParam : Información adicional sobre el mensaje
LPARAM lParam : Información adicional sobre el mensaje

Esta función solo intercepta un mensaje, aquel que es enviado por el sistema para indicar a la aplicación que debe cerrarse (WM_CLOSE) y si es cualquier otro mensaje lo envía al DefWindowProc().

RegisterClass() registra una clase ventana, con los parámetros dados por un WNDCLASS, en este caso CWnd.

Es hora de crear una ventana a partir de la clase creada con el RegisterClass(), para esto se utiliza la función CreateWindow() cuyos parámetros son los siguientes:

HWND CreateWindow
(
LPCTSTR lpClassName : Nombre de la clase a partir de la cual se crea la ventana
LPCTSTR lpWindowName : Titulo de la ventana.
DWORD dwStyle : Estilo de la ventana, en este caso con titulo y borde (WS_OVERLAPED)
int x, : Posición x de la ventana
int y : Posición y de la ventana
int nWidth : Ancho de la ventana
int nHeight : Alto de la ventana
HWND hWndParent : Identificador de la ventana “padre”, en este caso NULL, ya que no tiene
HMENU menú : Identificador del menú de la ventana, en este caso NULL, ya que no tiene
HINSTANCE hInstance : Identificador de la aplicación poseedora de la ventana, en NT/2000/XP este valor es ignorado
LPVOID lpParam : Cadena con el parámetro a pasar al llamar el mensaje WM_CREATE. En este NULL, ya que no hay ningun parámetro a pasar
)

1 2 3 4

Compartir esta entrada

DiggReddit
  • http://http.//dedolog.blogspot.com Debor

    Está chido pero no lo leí todo llevo prisa, pero si cae mal que pasen por tu log y no comenten 😉

  • http://dedolog.blogspot.com Debor

    Por cierto ando programando en luinux pero quiero exportar a win32 o 64 espero poder

  • Martin_395

    Muy completo y interesante, pero lleva tiempo entender todo(menos mal que soy joven y tengo tiempo).
    Gracias por el tutorial.

  • miguel365

    :O interesante, muy completo el post, desde hace tiempo he querido escribir una aplicacion sencilla de opengl pero que me permita manejar botones, menus etc. pero no encuentro un manual. Sabes si puedo preparar el contexto de opengl utlizando un picturebox de windows forms? agradezco tu respuesta por favor.