第4章,[标签 Win32] :SysMets2 初步讲解
专栏导航上一篇第4章[标签 Win32] 加入滚动条的 SysMets回到目录下一篇第4章[标签 Win32] SysMets2 的绘制代码的结构本节前言对于本节所讲解的知识有可能你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点请你自行查阅。我呢也会提到一部分的参考课节。但是呢你不应该依赖于我的主动提及。最好呢你自己能够多去了解和查看本专栏目录。本节内容主要来自对佩措尔德原教材的大段抄录。我们开始本节的学习。一. 本节内容SysMets2 中的 CreateWindow 函数调用通过在第三个参数中设定了 WS_VSCROLL 风格从而在窗口中包括了垂直滚动条。WS_OVERLAPPEDWINDOW | WS_VSCROLL在窗口过程 WndProc 中处理 WM_CREATE 消息的代码有两行新的代码来设定垂直滚动条的范围和初始位置。SetScrollRange(hwnd, SB_VERT, 0, NUMLINES - 1, FALSE); SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);在结构数组 sysmetrics 中有 NUMLINES 行文字所以滚动条的范围设定为 0 ~ NUMLINES - 1 。滚动条的每个位置对应在客户区顶部显示的一行文字。如果滚动条的位置是 0则第一行文字显示在客户区的顶部。如果位置是其他值则其他行会显示在顶部。如果位置是 NUMLINES - 1则最后一行显示在客户区的顶部。为了处理 WM_VSCROLL 消息在窗口过程中定义了一个静态变量 iVscrollPos 。这个变量是滑块的当前位置。对 SB_LINEUP 和 SB_LINEDOWN我们只将这个变量调整 1 。对于 SB_PAGEUP 和 SB_PAGEDOWN我们需要移动一屏的文字所以这个变量需要调整【cyClient / cyChar】。对于 SB_THUMBPOSITION新的滑块位置就是 wParam 的高位字。SB_ENDSCROLL 和 SB_THUMBTRACK 消息没有被处理。在程序根据 WM_VSCROLL 消息的类别计算了新的 iVscrollPos 的值后首先使用 min 和 max 宏来保证这个值仍然在滚动条的范围之内。然后通过调用 GetScrollPos 函数获取先前的位置再与 iVscrollPos 比较。如果滚动条的位置变化了就调用 SetScrollPos 函数来更新位置然后调用 InvalidateRect 函数使整个窗口无效。InValidateRect 函数会生成 WM_PAINT 消息在最初的 SysMets1 程序处理 WM_PAINT 消息时每一行的 y 坐标是如下计算的cyChar * i而在 SysMets2 中y 坐标的公式如下y cyChar * (i - iVscrollPos);循环语句依旧显示 NUMLINES 行文字但是当 i 小于 iVscrollPos 时这个值是负的。程序实际上是把这些行输出到客户区的外面。Windows 当然不会将这些文字显示在屏幕上所以一切看上去都很漂亮。我提到了这是一个最简单的实现。这里的代码并没有考虑效率。很快我们将进一步改进它。但是首先我们来看怎样在收到 WM_VSCROLL 消息后更新客户区。结束语不知道大家看了这个 SysMets2感觉如何。实际上SysMets2 里面所涉及的滚动条代码它还是比较直观和好理解一些的。在后面的程序 SysMets3 中所涉及的滚动条代码则是晦涩了一些。所以呢在这里我的建议是请大家务必先将 SysMets2 中所涉及的滚动条代码给理解好。具备了 SysMets2 中的滚动条代码的基础之后你还得准备好去迎接难度较高的 SysMets3 的滚动条代码的挑战任务的。希望大家能够学好 SysMets2 。专栏导航上一篇第4章[标签 Win32] 加入滚动条的 SysMets回到目录下一篇第4章[标签 Win32] SysMets2 的绘制代码的结构