关于跟踪条控件

跟踪条是一个窗口,其中包含通道中的滑块(有时称为 thumb)和可选的刻度线。 当用户使用鼠标或方向键移动滑块时,跟踪条会发送通知信息以指示变化。

当需要用户选择一个离散的无符号整数值或一个范围内的一组连续的无符号整数值时,跟踪条非常有用。 例如,用户可以使用跟踪条通过将滑块移动到给定的刻度线来设置键盘的重复速率。 下图展示了典型的跟踪条。

screen shot of a trackbar with labels at the ends for slow and fast

跟踪条中的滑块会以创建时指定的增量进行移动。 此范围内的数值被称为逻辑单位。 例如,如果指定跟踪条的逻辑单位范围为 0 至 5,则滑块就只能占据六个位置:跟踪条左侧的一个位置和范围内每个增量的一个位置。 通常情况下,每个位置都由一条刻度线标识;但是,刻度线的数量是任意的,并且可以少于逻辑位置的数量。

跟踪条可以通过使用 CreateWindowEx 函数并指定 TRACKBAR_CLASS 窗口类来创建。 在创建跟踪条后,可以使用跟踪条信息来设置和检索其多项属性。 可进行的更改包括设置滑块的最小和最大位置、绘制刻度线、设置选择范围以及重新定位滑块。

选择范围

如果使用 TBS_ENABLESELRANGE 样式来创建跟踪条,则可以指定选择范围。 跟踪条会突出显示选择范围,并在开始和结束处显示三角形刻度线,如下图所示。

screen shot of a trackbar with a range highlighted

跟踪条的选择范围不会对其功能产生任何影响。 具体范围的实现由应用程序决定。 可以通过以下方式之一来执行此操作:

  • 使用选择范围可让用户为某些参数设置最大值和最小值。 例如,用户可以将滑块移到某个位置,然后单击标有“Max”的按钮。 然后,应用程序会设置选择范围,以显示用户选择的值。
  • 通过处理 WM_HSCROLLWM_VSCROLL 通知并禁止在选择范围之外的任何移动,将滑块的移动限制在控件内预定的子范围内。 例如,如果用户可使用的数值范围会因用户做出的其他选择或可用资源而发生变化,就可以执行此操作。

跟踪条消息

跟踪条的逻辑单位是跟踪条可以表示的连续数值的集合。 可能的值范围通常是在创建跟踪条后通过 TBM_SETRANGE 消息来指定。 应用程序可以使用 TBM_SETRANGETBM_SETRANGEMAXTBM_SETRANGEMIN 动态来更改范围。

要检索滑块的位置(即用户选择的值),请使用 TBM_GETPOS 消息。 要设置滑块的位置,请使用 TBM_SETPOS 消息。

除非指定 TBS_NOTICKS 样式,否则跟踪条会自动在开始和结束位置显示刻度线。 (在 Microsoft Visual Studio 资源编辑器中,这意味着将 Tick Marks 属性设置为 False)。可以使用 TBS_AUTOTICKS 样式在跟踪条上以固定间隔自动显示额外的刻度线。 默认情况下,TBS_AUTOTICKS 跟踪条会在跟踪条范围的每个增量处显示一条刻度线。 要指定不同的自动刻度线间隔,请向跟踪条发送 TBM_SETTICFREQ 消息。 例如,可以使用此信息在 1 到 100 的范围内仅显示 10 条刻度线。

要设置单条刻度线的位置,请发送 TBM_SETTIC 消息。 跟踪条会维护一个 DWORD 值数组,用于存储每条刻度线的位置。 该数组不包括第一条和最后一条刻度线,它们将由跟踪条自动创建。 在发送 TBM_GETTIC 消息以获取相应刻度线的位置时,可以指定该数组中的索引。 或者,也可以发送 TBM_GETPTICS 消息来获取指向数组的指针。 数组中元素的数量比 TBM_GETNUMTICS 消息返回的刻度计数少两个。 这是因为 TBM_GETNUMTICS 返回的计数包括了第一条和最后一条刻度线,而数组中未包括这两条刻度线。 要以跟踪条窗口的客户坐标为单位获取刻度线的物理位置,请发送 TBM_GETTICPOS 消息。 TBM_CLEARTICS 消息会删除跟踪条上除第一条和最后一条刻度线之外的所有刻度线。

跟踪条的线条大小决定了滑块在键盘输入箭头键(如右箭头键或下箭头键)时的移动距离。 要检索或设置行大小,请发送 TBM_GETLINESIZETBM_SETLINESIZE 消息。 当用户按下箭头键时,跟踪条还会向其父窗口发送 TB_LINEUP 和 TB_LINEDOWN 通知代码。

跟踪条的页面大小决定了滑块响应键盘输入(如 PAGE UP 或 PAGE DOWN 键)或鼠标输入(如单击跟踪条通道)时的移动距离。 要检索或设置页面大小,请发送 TBM_GETPAGESIZETBM_SETPAGESIZE 消息。 当跟踪条接收到滚动页面的键盘或鼠标输入时,也会向其父窗口发送 TB_PAGEUP 和 TB_PAGEDOWN 通知代码。 有关详细信息,请参阅跟踪条通知消息

应用程序可以发送信息来获取跟踪条的尺寸。 TBM_GETTHUMBRECT 消息将检索滑块的边界矩形。 TBM_GETTHUMBLENGTH 消息将检索滑块的长度。 TBM_GETCHANNELRECT 消息将检索跟踪条通道的边界矩形,即滑块移动的区域。 它包含选择范围时的突出显示内容。 如果跟踪条具有 TBS_FIXEDLENGTH 样式,则可以发送 TBM_SETTHUMBLENGTH 消息来更改滑块的长度。

可以通过向跟踪条发送信息来检索或设置选择范围。 使用 TBM_SETSEL 消息可设置选择的起始和终止位置。 要只设置选择的起始位置或结束位置,请发送 TBM_SETSELSTARTTBM_SETSELEND 消息。 要检索选择范围的起始或终止位置,请发送 TBM_GETSELSTARTTBM_GETSELEND 消息。 要清除选择范围并将跟踪条恢复到原来的范围,请发送 TBM_CLEARSEL 消息。

注意

应用程序要负责确保用户不能选择选择范围之外的值。 控件本身不会阻止用户将滑块移出范围。

 

跟踪条通知消息

跟踪条会通过向父窗口发送 WM_HSCROLLWM_VSCROLL 消息来通知其父窗口的用户操作。 具有 TBS_HORZ 样式的跟踪条会发送 WM_HSCROLL 消息。 具有 TBS_VERT 样式的跟踪条会发送 WM_VSCROLL 消息。 WM_HSCROLLWM_VSCROLLwParam 参数的低位字将包含通知代码。 对于 TB_THUMBPOSITION 和 TB_THUMBTRACK 通知代码,wParam 参数的高位字将指定滑块的位置。 对于所有其他通知代码,高位字为零;发送 TBM_GETPOS 消息可确定滑块位置。 lParam 参数是跟踪条的句柄。

只有当用户使用键盘与跟踪条交互时,系统才会发送 TB_BOTTOM、TB_LINEDOWN、TB_LINEUP 和 TB_TOP 通知代码。 TB_THUMBPOSITION 和 TB_THUMBTRACK 通知代码只会在用户使用鼠标时发送。 在这两种情况下,都会发送 TB_ENDTRACK、TB_PAGEDOWN 和 TB_PAGEUP 通知代码。 下表列出了跟踪条通知代码以及导致发送虚拟键代码通知的事件(虚拟按键代码或鼠标事件)。

通知代码 发送的原因
TB_BOTTOM VK_END
TB_ENDTRACK WM_KEYUP(用户发布了发送相关虚拟键代码的键)
TB_LINEDOWN VK_RIGHTVK_DOWN
TB_LINEUP VK_LEFTVK_UP
TB_PAGEDOWN VK_NEXT(用户单击了滑块下方或右侧的通道)
TB_PAGEUP VK_PRIOR(用户单击了滑块上方或左侧的通道)
TB_THUMBPOSITION WM_LBUTTONUP 紧随 TB_THUMBTRACK 通知代码后
TB_THUMBTRACK 滑块移动(用户拖动了滑块)
TB_TOP VK_HOME

 

默认跟踪条消息处理

本节介绍跟踪条执行的窗口消息处理。

Message 已执行的处理
WM_CAPTURECHANGED 如果在 WM_LBUTTONDOWN 处理过程中设置了计时器,则关闭该计时器并在必要时发送 TB_THUMBPOSITION 通知代码。 它总是会发送 TB_ENDTRACK 通知代码。
WM_CREATE 执行其他初始化,例如将行大小、页面大小和刻度线频率设置为默认值。
WM_DESTROY 释放资源。
WM_ENABLE 重新绘制跟踪条窗口。
WM_ERASEBKGND 使用跟踪条的当前背景颜色擦除窗口背景。
WM_GETDLGCODE 返回 DLGC_WANTARROWS 值。
WM_KEYDOWN 处理方向键并酌情发送 TB_TOP、TB_BOTTOM、TB_PAGEUP、TB_PAGEDOWN、TB_LINEUP 和 TB_LINEDOWN 通知代码。
WM_KEYUP 如果按键是某个方向键,则发送 TB_ENDTRACK 通知代码。
WM_KILLFOCUS 重新绘制跟踪条窗口。
WM_LBUTTONDOWN 将焦点和鼠标捕获设置为跟踪条。 在必要时,它会设置一个计时器,当用户在窗口中按住鼠标键时,计时器会决定滑块向鼠标光标移动的速度。
WM_LBUTTONUP 释放鼠标捕获并终止计时器(如果在 WM_LBUTTONDOWN 处理过程中设置了计时器)。 如有必要,它会发送 TB_THUMBPOSITION 通知代码。 它总是会发送 TB_ENDTRACK 通知代码。
WM_MOUSEMOVE 移动滑块并在跟踪鼠标时发送 TB_THUMBTRACK 通知代码(请参阅 WM_TIMER)。
WM_PAINT 绘制跟踪条。 如果 wParam 参数为非 NULL,则控件假定该值为 HDC,并使用该设备上下文进行绘制。
WM_SETFOCUS 重新绘制跟踪条窗口。
WM_SIZE 设置跟踪条的尺寸,如果没有足够的空间显示滑块,则将其删除。
WM_TIMER 检索鼠标位置并更新滑块位置。 (只有当用户拖动滑块时才会收到它。)
WM_WININICHANGE 初始化滑块尺寸。

 

跟踪条工具提示

使用 TBS_TOOLTIPS 样式创建的跟踪条具有默认的工具提示控件。 当用户使用鼠标拖动滑块时,工具提示保持可见并显示当前值。

可以通过发送 TBM_SETTOOLTIPS 消息来为跟踪条分配新的工具提示控件。 要检索已分配工具提示控件的句柄,请使用 TBM_GETTOOLTIPS 消息。