第4章,[标签 Win32] :SysMets2 的绘制代码的结构

第4章,[标签 Win32] :SysMets2 的绘制代码的结构 专栏导航上一篇第4章[标签 Win32] SysMets2 初步讲解回到目录下一篇第4章[标签 Win32] 升级版滚动条及其信息函数本节前言对于本节所讲解的知识有可能你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点请你自行查阅。我呢也会提到一部分的参考课节。但是呢你不应该依赖于我的主动提及。最好呢你自己能够多去了解和查看本专栏目录。本节内容主要来自对佩措尔德原教材的大段抄录。我们开始本节的学习。一. 本节内容SysMets2 的窗口过程并没有在处理滚动条消息时直接绘制客户区。相反地它调用 InvalidateRect 函数使客户区无效。这导致 Windows 将一条 WM_PAINT 消息放置在消息队列里。这是最好的办法。程序应该把所有的客户区绘制工作都限制在处理 WM_PAINT 消息时。因为程序必须能够在收到 WM_PAINT 消息时绘制整个客户区因而在处理其他消息时进行绘制很可能就是在重复 WM_PAINT 消息处理的代码。在一开始你可能对这种绕弯的处理方式很不习惯。在 Windows 的早期很多程序员觉得这种概念很难理解因为这与字符模式下的程序大不一样。而且就像我早先提到的程序可能会需要在处理键盘或鼠标输入时立刻绘制一些东西。这样会很方便有效但在大多数情况下是没有必要的。掌握了 “所有的绘制都在处理 WM_PAINT 消息时进行” 的概念后你会很满意其结果。就像 SysMets2 演示的应用程序经常会需要在处理非 WM_PAINT 消息时重绘一个特定的部分。这是 InvalidateRect 函数发挥作用的地方。你可以用它来将客户区的一个特定矩形区域或者整个客户区无效化。简单的通过将窗口的一部分无效化来生成 WM_PAINT 消息在某些情况下也许不太令人满意。在调用 InvalidateRect 函数后Windows 在消息队列中放置一条 WM_PAINT 消息而窗口过程最终会处理它。但是Windows 将 WM_PAINT 消息作为低优先级消息处理。这样当系统中有很多其他事情发生时你的窗口过程可能会要等一会儿才会收到 WM_PAINT 消息。大家都见到过关闭一个对话框后在等待窗口重绘时屏幕上留下的空白。如果你想立刻更新无效区域则可以在调用 InvalidateRect 函数后调用 UpdateWindow 函数。UpdateWindow (hwnd);如果客户区有任何一部分是无效的UpdateWindow 函数将使窗口过程立刻收到一条 WM_PAINT 消息。如果整个客户区是有效的UpdateWindow 将不会调用窗口过程。当客户区中存在无效部分因而 UpdateWindow 函数促使窗口过程立刻收到一条 WM_PAINT 消息时这时WM_PAINT 消息将越过消息队列而直接由 Windows 调用窗口过程。当窗口过程完成绘制后便返回然后 UpdateWindow 函数将控制权返回给调用它的代码。这里的 UpdateWindow 函数和在 WinMain 函数中生成第一条 WM_PAINT 消息的是同一个函数。当一个窗口刚创建时它的整个客户区都是无效的UpdateWindow 函数调用窗口过程来绘制客户区。专栏导航上一篇第4章[标签 Win32] SysMets2 初步讲解回到目录下一篇第4章[标签 Win32] 升级版滚动条及其信息函数