Windows 图形界面笔记(2) - 处理消息

接上文:Windows 图形界面笔记(1) - 窗口的显示

  • 窗口类注册了,窗口创建并显示在屏幕上了,整个程序也进入了消息循环开始从消息队列中取消息了。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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值