从0开始学习《Windows程序设计》:窗口过程!

本文深入讲解Windows编程中窗口过程的概念,解释如何通过DispatchMessage与操作系统交互,以及如何定义和使用WndProc函数处理WM_PAINT、WM_LBUTTONUP和WM_DESTROY等消息。

一、客户区和非客户区
在这里插入图片描述
非客户区的操作是由系统管理的,而客户区则是交给用户的。

二、窗口过程
问题:DispatchMessage 带着消息去找操作系统,然后由操作系统调用WinProc这个窗口过程,那操作系统怎么知道WinProc这和窗口的地址呢?
是我们告诉操作系统的。
在这里插入图片描述
函数名相当于函数指针,这里我们把函数指针给了窗口类结构。
创建完之后,窗口类函数就知道我们的函数在哪里了。

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
typedef struct tagMSG {
    HWND        hwnd;
    UINT        message;
    WPARAM      wParam;
    LPARAM      lParam;
    DWORD       time;
    POINT       pt;
    }
    //该函数的四个参数正是我们消息结构的前四个成员。

所以呢,我们可以理解为,当DispatchMessage 带着消息去找操作系统,操作系统保留了后面两个消息,然后使用这个消息结构的前四个成员作为参数,直接来调用我们的窗口过程。

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;//用户来存放绘制窗口所需要的一些参数
	RECT rect;

	switch (message)
	{
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);//获取设备环境。返回一个设备环境句柄
		GetClientRect(hwnd, &rect);//获得客户区的位置、坐标信息
		DrawText(hdc, TEXT("大家好,这是我的第一个窗口程序!"), -1, &rect,
			DT_SINGLELINE | DT_CENTER | DT_VCENTER);//调用DrawText绘制。
		EndPaint(hwnd, &ps);
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}

	return DefWindowProc(hwnd, message, wParam, lParam);
}

这三个函数的详细信息在BeginPaint 、GetClientRect 、DrawText。在这个链接查找 https://fishc.com.cn/forum.php?mod=forumdisplay&fid=255&filter=typeid&typeid=420。转自鱼C论坛。

在这里插入图片描述
当用户点下x时,发送WM_DESTROY消息,让后让开发者在里面在部署代码, 让后在调用PostQuitMessage(0),发送WM_QUIT消息,实现窗口退出。

	switch (message)
	{
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		GetClientRect(hwnd, &rect);
		DrawText(hdc, TEXT("大家好,这是我的第一个窗口程序!"), -1, &rect,
			DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		EndPaint(hwnd, &ps);
		return 0;
	case WM_LBUTTONUP:
		MessageBox(hwnd, TEXT("哎呀,我被按了一下"), TEXT("好舒服"), MB_OK);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}

接下来,我们添加代码,在用户按下鼠标左键后,弹起时,弹出窗口。效果如下!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值