滚动条控件
滚动条控件
滚动条控件是一个与其它控件有些不同的家伙。通常滚动条是绑定在窗口的侧边,用来控制窗口里数据的显示的。实际上,诸如编辑框和列表框等窗口控件都内部使用了滚动条控件。正是因为这种和父窗口的紧密关系,使得滚动条的接口与其它控件的有所不同。
滚动条使用WM_VSCROLL和WM_HSCROLL消息而不是WM_COMMAND消息来报告行为。垂直滚动条会发送WM_VSCROLL消息,水平滚动条会发送WM_HSCROLL消息。另外,不使用SB_SETPOSITION消息来设置滚动条的位置,而是有专用的函数来完成。下面来看一下这个独特的接口。
滚动条消息
一旦用户点击垂直滚动条来改变其位置的时候,WM_VSCROLL消息会发送到垂直滚动条的拥有者上。WM_HSCROLL则是当用户点击水平滚动条的时候发送到其拥有者上的。对这两个消息来说,wParam和lParam参数是一样的。wParam的低字位包含的代码指出为什么会发送该消息。图4-1显示了水平和垂直滚动条以及如何在滚动条不同位置点击来产生不同的消息。wParam的高字位包含滑块的位置,但仅仅在您处理SB_THUMBPOSITION和SB_THUMBTRACK代码(后面将简单介绍它们)时,这个值才是有效的。如果发送消息的滚动条是独立的没有绑定到窗口的控件,那么lParam参数则包含有滚动条的窗口句柄。
图4-1(略):滚动条和其热点。
滚动条发送的消息代码允许程序对滚动条支持的所有用户行为作出响应。表4-1列出了每个代码对应的行为。
表4-1:滚动代码
SB_LINExxx和SB_PAGExxx代码是相当易懂的。每次您可以将滚动位置移动一行或者一页。SB_THUMBPOSITION和SB_THUMBTRACK可以用两种方式之一来处理。当用户拖动滚动条滑块时,滚动条会发送SB_THUMBTRACK代码,这样程序可以交互地跟踪滑块的拖动。如果您的应用程序足够快,您就可以只处理SB_THUMBTRACK代码并交互的更新显示。如果您填写了SB_THUMBTRACK代码,但是您的应用程序必须快到足以重绘显示,这样滑块在拖动过程中不会出现停顿。在运行Windows CE的较慢设备上,这会是一个问题。
如果您的应用程序(或者操作系统)太慢,不能为每个SB_THUMBTRACK代码进行快速更新显示,您可以忽略掉SB_THUMBTRACK,并等待在用户拖动滚动条滑块时发出的SB_THUMBPOSITION代码。这样在用户移动完滑块后,您只需要更新显示一次即可。
配置滚动条
要使用滚动条,应用程序首先应该设置滚动范围的最小值和最大值以及初始位置。和桌面系统里的滚动条一样,Windows CE滚动条支持按比例调整滑块大小,这可以给用户提供反馈,了解当前看到的页占整个滚动范围的比例。要设置这些参数,Windows CE应用程序可以使用SetScrollInfo函数,其原型如下:
int SetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi, BOOL fRedraw);
第一个参数可以是包含滚动条的窗口的句柄,也可以是滚动条自身的窗口句柄。第二个参数fnBar是一个标志位,用于判断窗口句柄的用法。该标志位可以是下面三个值之一:SB_HORZ用于窗口中标准水平滚动条;SB_VERT用于窗口中标准垂直滚动条;SB_CTL用于独立的滚动条控件。除非滚动条是控件,否则窗口句柄是包含滚动条的窗口的句柄。在句柄是滚动条控件自身的句柄时,使用SB_CTL。最后一个参数时fRedDraw,一个布尔值,指出是否在调用完成后重新绘制滚动条。第三个参数是指向SCROLLINFO结构的指针,该结构定义如下:
typedef struct tagSCROLLINFO
{
UINT cbSize;
UINT fMask;
int nMin;
int nMax;
UINT nPage;
int nPos;
int nTrackPos;
} SCROLLINFO
该结构允许您完整的指定滚动条参数。cbSize必须设置成SCROLLINFO结构的大小。fMask是标志位,指出结构中其它域包含什么样的有效数据。nMin和nMax包含滚动条的最小和最大滚动值。如果fMask参数包含SIF_RANGE标志,Windows就会在这两个域中查找这些值。同样地,如果fMask包含SIF_POS标志,nPos在预定义的范围内设置滚动条位置。
nPage域允许程序定义屏幕当前可视区域相对于整个滚动区域的大小。这可以给用户一个大致印象,整个滚动区域中当前有多少是可视的。只有当fMask中包含SIF_PAGE标志的时候这个域才有用。SCROLLINFO结构的最后一个成员是nTrackPos,但SetScrollInfo不使用并忽略掉它了。
fMask最后一个标志是SIF_DISABLENOSCROLL,可以让滚动条失效但可视。当整个滚动范围在可视区域内可视且不再需要滚动的时候,用这个方法是很方便的。在这种情况下,使滚动条失效比简单的移去整个滚动条更好一些。
细心的读者一定会注意到SCROLLINFO结构中域的宽度问题。nMin,nMax和nPos是整型,在Windows CE中是32位宽。而另一方面,WM_HSCROLL和WM_VSCROLL消息只能在WParam参数的高字位中返回一个16位的位置数据。如果您使用的滚动范围超过65,535,那么可以使用GetScrollInfo函数,其原型如下:BOOL GetScrollInfo (HWND hwnd, int fnBar, LPSCROLLINFO lpsi);
和SetScrollInfo一样,fnBar中的标志位用来指出传递给函数的窗口句柄种类。SCROLLINFO结构同SetScrollInfo中的一样。在传给GetScrollInfo之前,必须先用结构的大小来始化cbSize。应用程序必须通过设置fMask中的适当标志,来指明希望函数返回什么数据。fMask中使用的标志同SetScrollInfo中使用的一样,同时增加了两个。现在可以传递SIF_TRACKPOS标志来让滚动条返回当前滑块位置。在WM_xSCROLL消息期间调用时,nTrackPos包含实时位置,而nPos包含的是开始拖动滑块时的滚动条位置。
滚动条是与众不同的控件,因为只要简单指定窗口风格,就可以很容易地把滚动条添加到窗口中;另外它是放置在窗口客户区域外边地。原因是应用程序普遍需要滚动条,所以Windows的开发者就尽量使绑定滚动条到窗口的工作更容易。
