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

一、客户区和非客户区
从0开始学习《Windows程序设计》:窗口过程!
非客户区的操作是由系统管理的,而客户区则是交给用户的。

二、窗口过程
问题:DispatchMessage 带着消息去找操作系统,然后由操作系统调用WinProc这个窗口过程,那操作系统怎么知道WinProc这和窗口的地址呢?
是我们告诉操作系统的。
从0开始学习《Windows程序设计》:窗口过程!
函数名相当于函数指针,这里我们把函数指针给了窗口类结构。
创建完之后,窗口类函数就知道我们的函数在哪里了。

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论坛。

从0开始学习《Windows程序设计》:窗口过程!
当用户点下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;
	}

接下来,我们添加代码,在用户按下鼠标左键后,弹起时,弹出窗口。效果如下!
从0开始学习《Windows程序设计》:窗口过程!