4.3 滚动条

        摘录于《Windows程序(第5版,珍藏版).CHarles.Petzold 著》P82

        滚动条是图形用户界面中最好的特性之一。它们很容易使用,并且提供了很好的视觉效果。当需要显示的内容超过窗口的客户区时,不管是文字、图像、表格、数据库记录或者是网页,都可以使用滚动条。

        滚动条既可以垂直放置(将内容上下移动),也可以水平放置(左右移动)。你既可以用鼠标单击滚动条两端的箭头,也可以单击箭头之间的区域。一个“滑块”在滚动条中移动,表明当前显示的内容在整个文档中的大概位置。你也可以用鼠标拖动滑块到特定的位置。图 4-7 显示了垂直滚动条的使用方式。


        由于程序员和用户看待滚动条的角度不同,有时候他们会错误理解一些名词。当用户向下滚动时,他们希望将文件中下面的部分显示出来。但实际上,程序需要将文件相对于显示窗口向上移动。Windows 文档和头文件的标识符都是从用户的角度出发:向上滚动意味着移向文档的开始,而向下滚动意味着移向文档的结束。

        在应用程序的窗口包括滚动条相当容易。只需在 CreateWindow 的第三个参数中包括窗口风格标识符 WS_VSCROLL(垂直滚动条)或 WS_HSCROLL(水平滚动条),或者同时包括两者。在 CreateWindow 函数中指定的滚动条总是出现在窗口的右边和底部,而且总是伸展到整个客户区的宽度和高度。客户区并不包含滚动条所占用的空间。对于特定的显示驱动和显示分辨率,垂直滚动条的宽度和水平滚动条的高度都是固定的,如果需要,可以通过调用 GetSystemMetrics 函数来获取它们的值。

        Windows 负责处理滚动条中的所有鼠标消息。但是,滚动条并没有自动对应的键盘接口。如果想将方向键对应到滚动条上,则必须显式地提供相应的对应关系。

4.3.1 滚动条的范围和位置

        每个滚动条都有相应的“范围”和“位置”。滚动条的范围是一对整数,分别代表滚动条的最小值和最大值。位置是指滑块在范围中所处的值。当滑块在滚动条的顶端(或最左)时,滑块的位置是范围的最小值。相应的,当滑块在滚动条的底部(或最右)时,滑块的位置是范围的最小值。相应的,当滑块在滚动条的地步(或最右)时,位置是范围的最大值。

        在默认状态下,滚动条的范围是0~100。不过通过下面的函数调用,可以很方便的把范围改成对程序更有意义的值。

SetScrollRange (hwnd, iBar, iMin, iMax, bRedraw);
这里的 iBar 参数要么是 SB_VERT,要么是 SB_HORZ,而 iMin 和 iMax 分别对应范围的最小值和最大值。需要 Windows 根据新的范围来重绘滚动条时,请将 bRedraw 参数设为 TRUE。(如果在调用 SetScrollRange 函数之后还将调用其他函数来调整滚动条的显示时,最好将 bRedraw 设为 FLASE 以避免过多的重绘。)

        滑块的位置总是一个离散的整数值。例如,一个范围是 0~4 的滚动条有 5 个滑块位置,如图 4-8 所示。

        通过如下 SetScrollPos 函数调用即可指定滑块在滚动条范围中的位置:

SetScrollPos (hwnd, iBar, iPos, bRedraw);

这里的参数 iPos 是滑块的新位置,它必须在 iMin 和 iMax 之间。Windows 提供了两个类似的函数(GetScrollRange 和 GetScrollPos)用于获取滚动条的当前范围和位置。

        在程序中使用滚动条时,程序需要和 Windows 共同负责维护滚动条以及滑块在滚动条中的位置。Windows 负责如下任务:

  • 处理滚动条中的所有鼠标消息。
  • 当用户单击滚动条时,提供一种反向显示的闪烁。
  • 当用户拖动滑块时,在滚动条内移动滑块。
  • 向拥有滚动条的窗口的窗口过程发送滚动条消息。

        程序需要负责如下任务:

  • 初始化滚动条的范围和位置。
  • 处理传送给窗口过程的滚动条消息。
  • 更新滑块的位置。
  • 根据滚动条的变化更新客户区的内容。

        和往常一样,研究代码是加深理解的最好办法。

4.3.2 滚动条消息

        当用户单击滚动条或拖动滑块时,Windows 向窗口过程发送 WM_VSCROLL 消息(垂直滚动)或 WM_HSCROLL 消息(水平滚动)。在滚动条上的任何鼠标动作会产生至少两条消息:一条在鼠标键按下时,另一条在鼠标键松开时。

        就像所有消息一样,WM_VSCROLL 和 WM_HSCROLL 消息都伴随着 wParam 和 lParam 消息参数。当滚动条是窗口的一部分时,可以忽略 lParam 参数:他只用于滚动条是子窗口时,通常是在对话框中。

        wParam 参数被分为低位字和高位字。wParam 的低位字代表了鼠标在滚动条上的动作。这个值被称为“通知码”,由一个以 SB 开头的标识符定义(SB 代表滚动条)。

        含有 LEFT、RIGHT 的标识符用于水平滚动条中,而含有UP、DOWN、TOP、BOTTOM的标识符用于垂直滚动条中。图 4-9 显示了鼠标在滚动条的不同位置单击时相应的通知码。

    

        如果在滚动条的不同部分按住鼠标键不放,程序可能收到多条滚动条消息。当松开鼠标键时,程序会收到一条带有 SB_ENDSCROLL 通知码的消息。程序通常可以忽略带有 SB_ENDSCROLL 的消息。Windows 并不会自己改变滑块的位置,应用程序需要调用 SetScrollPos 函数来改变它。

        将鼠标放在滑块上然后按下鼠标键时,可以移动滑块。这将会生成带 SB_THUMBTRACK 和 SB_THUMBPOSITION 通知码的滚动条消息。当 wParam 的低位字是 SB_THUMBTRACK 时,wParam 的高位字是用户拖动滑块的当前位置。这个位置处于滚动条范围的最小值和最大值之间。当 wParam 的低位字是 SB_THUMBPOSITION 时,wParam 的高位字是用户松开鼠标键时滑块的最终位置。对于其他的滚动条动作,wParam 的高位字应被忽略。

        为了给用户一些视觉反馈,当用户用鼠标拖动滚动条滑块时,Windows 会在你的程序收到 SB_THUMBTRACK 消息的同时移动滑块。但是除非程序在处理 SB_THUMBTRACK 或者 SB_THUMBPOSITION 时调用 SetScrollPos 函数,否则滑块会在用户松开鼠标键的时候回到原来的位置。

        程序可以处理 SB_THUMBTRACK 或者 SB_THUMBPOSITION 消息,但很少会同时处理两者。如果处理 SB_THUMBTRACK 消息,则需要在用户拖动滑块时移动客户区的内容。相对而言处理 SB_THUMBTRACK 消息更好些,当然实现也就困难些;在某些情况下,你的程序可能会来不及处理新产生的消息。

        你也许已经看到了,在 WINUSER.H 头文件中定义了通知码 SB_TOP、SB_BOTTOM、SB_LEFT 和 SB_RIGHT。这些通知码表示滚动条已经到了最小或最大的位置。但是,如果滚动条是应用程序窗口的一部分,就不会收到这些通知码。

        使用 32 位整数作为滚动条的范围虽然并不常见,但是是完全可行的。但是由于 wParam 的高位字是一个 16 位的整数,在 SB_THUMBTRACK 和 SB_THUMBPOSITION 消息中它就不能正确表示滑块的位置。这时,需要通过调用 GetScrollInfo 函数来获取这个信息。

相关文章
相关标签/搜索