从0开始学习《Windows程序设计》:窗口过程!
一、客户区和非客户区
非客户区的操作是由系统管理的,而客户区则是交给用户的。
二、窗口过程
问题: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;
}
接下来,我们添加代码,在用户按下鼠标左键后,弹起时,弹出窗口。效果如下!