《Windows程序设计》- 消息处理机制

使用windows API创建窗口

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//消息处理函数

//入口函数
int WINAPI WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	PSTR szCmdLine,
	int iCmdShow)
{
	static TCHAR szAppName[] = TEXT("HelloWin");

	HWND   hwnd;//要创建的窗口句柄
	MSG    msg;//消息结构体
	/*
	typedef struct tagMSG {
	HWND   hwnd;消息发送给哪个句柄
	UINT   message;消息类型
	WPARAM wParam;
	LPARAM lParam;
	DWORD  time;
	POINT  pt;
	} MSG, *PMSG, *LPMSG;
	*/
	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,// initial x position

		CW_USEDEFAULT,// initial y position

		CW_USEDEFAULT,// initial x size

		CW_USEDEFAULT,// initial y size

		NULL,                 // parent window handle

		NULL,            // window menu handle

		hInstance,   // program instance handle

		NULL);      // creation parameters


	//设置窗口显示模式:最大化/最小化/正常
	ShowWindow(hwnd, iCmdShow);
	//显示
	UpdateWindow(hwnd);

	//从消息队列里面获取消息,填充到msg中
	while (GetMessage(&msg, NULL, 0, 0)){
		//将消息传给windows进行一些其他处理
		TranslateMessage(&msg);
		//windows将消息传给消息处理程序进行处理
		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:
		return 0;

	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		GetClientRect(hwnd, &rect);
		DrawText(hdc, TEXT("Hello, Windows 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);
}
当创建窗口类的时候,需要为此窗口创建消息处理函数。

windows为当前每个windows程序维护一个消息队列

GetMessage
此函数从消息队列中取出消息,注意消息体的结构,包含了窗口句柄,可以知道此消息是发给哪个窗口的。
DispatchMessage
此函数会使windows调用消息处理函数,并把消息体作为参数。

运行效果如下,可以拖动,可以关闭,可以最小化

《Windows程序设计》- 消息处理机制_第1张图片

你可能感兴趣的:(WINDOWS消息机制)