- 窗口类注册了,窗口创建并显示在屏幕上了,整个程序也进入了消息循环开始从消息队列中取消息了。MainWndProc 仅选择了WM_PAINT 和WM_DESTROY 两个消息进行处理。一般情况下,消息处理函数结构化为:
- switch(uMsg)
- {
- case WM_PAINT:
- 【处理WM_PAINT 消息】
- return 0;
- case WM_DESTROY:
- 【处理WM_DESTROY 消息】
- return 0;
- }
- return ::DefWindowProc(hwnd, message, wParam, lParam);
- WM_PAINT 消息通知应用程序窗口客户区有一块或者全部变成无效,必须刷新。这意味着窗口客户区的内容必须被重画。处理WM_PAINT 消息时总是以调用BeginPaint 函数开始。这两个函数中,第一个参数是窗口句柄,第二个参数是指向PAINTSTRUCT 结构的指针,这个结构包含了一些可以在重画客户区时使用的信息。
- hdc = ::BeginPaint (hwnd, &ps) ;
- // 以一个EndPaint 函数调用结束
- ::EndPaint (hwnd, &ps) ;
- ( 在调用BeginPaint 函数的时候,如果客户区的背景还没有被擦掉的话,Windows 将擦除它,擦除背景时使用的刷子由WNDCLASSEX 结构的hbrBackground 成员指定。对BeginPaint 函数的调用将使整个客户区有效,然后返回设备环境句柄。在窗口的客户区显示图形和文字时,需要使用这个设备环境句柄(详细介绍请参考4.4.1 小节)。使用BeginPaint 函数返回的设备环境句柄,不能在客户区外进行绘画。EndPaint 函数负责释放设备环境句柄,使它变得不再能用。)
- 必须要把所有不处理的消息交给 DefWindowProc 函数默认处理,也要把它的返回值返回给Windows,否则Windows 就失去了与应用程序通信的途径,也就不能再控制窗口的行为了,这是不合法的。
- 客户区无效的情况介绍:
- 窗口第一次创建
- 窗口大小改变 (在填写WNDCLASSEX 结构的style 成员时,将它设置为CS_HREDRAW 和CS_VREDRAW)
- 最小化最大化窗口
- 移动窗口
- 每当客户区变成无效,消息处理函数WndProc 都会收到一个新的WM_PAINT 消息。响应此消息的代码取得设备环境句柄后,再一次将 szText 的内容显示在指定位置。
- WM_DESTROY 是窗口函数必须处理的消息。当用户关闭窗口,而且此窗口已经响应了用户的请求正在关闭时,消息处理函数就会收到一个WM_DESTROY 消息。当接受到这个消息的时候,说明窗口正在销毁。MainWndProc 函数调用 PostQuitMessage 函数来响应此消息。PostQuitMessage(0) 向程序的消息队列中插入一个WM_QUIT 消息。在以前已经提到,GetMessage 函数如果从消息队列中取得的消息是WM_QUIT,它将返回0。
Windows 图形界面笔记(2) - 处理消息
最新推荐文章于 2023-05-02 22:02:29 发布