WIN32学习——Windows消息机制(一)

1、Win32窗口程序采用的是事件驱动方式执行,也就是消息机制,当系统通知窗口工作时,就是采用消息的方式派发给窗口,通过调用窗口处理函数进行对消息对处理。

2、消息MessageBox结构体:

int MessageBox(

HWND hWnd, //父窗口句柄

LPCTSTR lpText, //显示在消息框中的文字

LPCTSTR lpCaption, //显示在标题栏中的文字

UINT uType //消息框中的按钮、图标显示类型

); //返回点击的按钮ID

3、每一个窗口都有窗口处理函数,例如:

LRESULT CALLBACK WindowProc(

HWND hwnd, //窗口句柄

UINT uMsg, //消息ID

WPARAM wParam, //消息参数

LPARAM lParam //消息参数

);

当系统通知窗口时,会调用窗口处理函数同时,会将消息ID和消息参数传递给窗口处理函数,在窗口处理函数中,没有手动处理的消息会使用缺省的窗口处理函数DefWindowProc()。

4、消息相关函数:

GetMessage();

TranslateMessage();

DispatchMessage();

5、常见消息:

WM_DESTROY:窗口被销毁时的消息,无消息参数(wParam、lParam),常用于在窗口被销毁之前,做相应的善后处理,例如资源、内存等

WM_SYSCOMMAND:系统命令消息,当点击窗口的最大化、最小化、关闭等命令时,收到这个消息。常用在窗口关闭时,提示用户处理。

WM_CREATE:在窗口创建成功还未显示之前,收到这个消息。常用于初始化窗口的参数、资源等,包括子窗口的创建。

WM_SIZE:在窗口大小发生变化后,会收到这个消息。常用于窗口大小变化后,调节窗口内各个部分的布局。其中,该消息的附加数据:WPARAM表示窗口大小变化的原因,LPARAM表示变化后窗口客户区大小,通过调用LOWORD获取变化后宽度,HIWORD获取变化后高度。

WM_QUIT:用于结束消息循环处理。

WM_PAINT:绘图消息。

另外还有键盘消息、鼠标消息、定时器消息等,以后研究。


附练习代码:


/*
功能:在点击关闭窗口按钮时,提示是否关闭窗口,YES关闭窗口,NO取消关闭窗口
		WM_SYSCOMMAND:
		WM_CREATE:
		WM_SIZE:
		以上消息的使用
*/

#include <Windows.h>

HINSTANCE g_hInstance;
HWND childWnd;

void OnCreate(HWND hParent)
{
	childWnd = CreateWindowEx(0,__TEXT("edit"),NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,0,0,100,100,hParent,NULL,g_hInstance,NULL);
}

void OnSize(HWND hWnd,LPARAM lParam)
{
	int nWidth = LOWORD(lParam);
	int nHight = HIWORD(lParam);
	MoveWindow(childWnd,0,0,nWidth,nHight,TRUE);
}

//窗口处理函数
LRESULT CALLBACK WinProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch(uMsg)
	{
		/*
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
		*/
	case WM_SIZE:
		OnSize(hWnd,lParam);
		break;
	case WM_CREATE:
		OnCreate(hWnd);
		break;
	case WM_SYSCOMMAND:
		if (SC_CLOSE == wParam)
		{
			if(IDYES == MessageBox(hWnd,__TEXT("确定是否关闭窗口"),__TEXT("提示"),MB_YESNO))
			{
				PostQuitMessage(0);
			}
			//不加else处理,程序会执行DefWindowProc,窗口进程不能关闭
			else
				return 0;
		}
	break;
	}
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
//注册窗口类
BOOL Register(LPCWSTR className)
{
	WNDCLASSEX wc = {0};
	wc.cbClsExtra = 0;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hIconSm = NULL;
	wc.hInstance = g_hInstance;
	wc.lpfnWndProc = WinProc;
	wc.lpszClassName = className;
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	return RegisterClassEx(&wc);
}
//创建窗口
HWND CreateWin(LPCWSTR className,LPCWSTR winName)
{
	return CreateWindowEx(0,className,winName,WS_OVERLAPPEDWINDOW,100,100,600,600,NULL,NULL,g_hInstance,NULL);
}
//显示和更新窗口
void ShowWin(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}
//消息循环
void Message()
{
	MSG ms = {0};
	while (GetMessage(&ms,NULL,0,0))
	{
		TranslateMessage(&ms);
		DispatchMessage(&ms);
	}
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	g_hInstance = hInstance;
	Register(__TEXT("Main"));
	HWND hWnd = CreateWin(__TEXT("Main"),__TEXT("This is test"));
	ShowWin(hWnd);
	Message();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/bimabushihaodongxi/article/details/70808136
今日推荐