window窗口与消息(一)窗口创建

要创建一个窗口首先要注册一个窗口类,而窗口类又需要通过窗口过程来处理窗口消息。窗口过程是由用户自定义的函数,该函数被window调用,而这个函数的参数 描述了window向窗口发送并由该函数接收的特定消息。下面一段代码举例说明怎么创建一个窗口:

#include<windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
#pragma comment(lib,"WINMM.lib")
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance ,PSTR szCmdLine,int nShowCmd)
{
	static TCHAR szAppName[] = TEXT("HelloWin");
	HWND hWnd;
	MSG msg;
	WNDCLASS wndclass;
	wndclass.style = CS_HREDRAW|CS_VREDRAW;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;
	if (!RegisterClass(&wndclass))
	{
		MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
		return 0;
	}
	hWnd = CreateWindow(szAppName,          //window class name
		               TEXT("The Hello Program"),  //window caption
					   WS_OVERLAPPEDWINDOW,        //window style
					   CW_USEDEFAULT,              //initail x position
					   CW_USEDEFAULT,              //initail y position 
					   CW_USEDEFAULT,              //initail x size 
					   CW_USEDEFAULT,              //initail y size
					   NULL,                       //parent window handle
					   NULL,                       //window menu handle
					   hInstance,                  //program instance handle
					  NULL);                       //creation parameters 
	ShowWindow(hWnd,SW_SHOWNORMAL);
	UpdateWindow(hWnd);  //窗口自绘
	while (GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	switch (message)
	{
	case WM_CREATE:
		PlaySound(TEXT("hellowin.wav"),NULL,
SND_FILENAME|SND_ASYNC);//采用异步的方式播放声音,即不用等声音播放完,函数立即返回。
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hWnd,&ps);
		GetClientRect(hWnd,&rect);
		DrawText(hdc,TEXT("Hello,Window 98!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
		EndPaint(hWnd,&ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hWnd,message,wParam,lParam);
}



程序首先声明了一个回调函数WndProc(HWND hWnd,UNIT message ,WPARARM wParam,LPARAM lParam);这个函数就是所谓的窗口过程。参数hWnd表示一个接收消息窗口的窗口句柄(即CreateWindow的返回值),message 表示Window发给窗口的消息类型,后两个参数根据消息的不同而不同。当窗口过程对消息进行处理后,都应该返回0值。所有窗口不进行处理的消息都必须传給名称为DefWindowProc的Windows函数。DefWindowProc的返回值必须从窗口过程返回。

RegisterClass注册了一个窗口类。CreateWindow函数创建一个窗口。ShowWindow函数显示窗口。UpdateWindow函数向窗口发送一个WM_PAINT消息。

GetMessage从消息队列中取一条消息,后3个参数为NULL或者0,表示该窗口接收改程序创建的所有窗口的窗口消息。当GetMessage从消息队列中取到一条WM_QUIT消息时程序返回0值,否则返回非0值。TranslateMessage将消息返还给windows以进行某些键盘消息的转换。DispatchMessage将消息返还给windows,windows再将消息

分发给合适的窗口过程。




你可能感兴趣的:(window窗口与消息(一)窗口创建)