关于向上向下控件

上下控件是一对箭头按钮,用户可以单击它们来让值递增或递减,例如滚动位置或显示在伴随控件(称为合作者窗口)中的一个数字。

对用户来说,上下控件及其合作者窗口通常看起来像是一个单独的控件。 可以指定上下控件自动定位到其合作者窗口旁边,并自动将合作者窗口的描述文字设置为其当前位置。 例如,可以将上下控件与编辑控件一起用来提示用户输入数字。 下图显示了一个上下控件,其合作者窗口是一个编辑控件,这种组合有时被称为微调控件。

screen shot showing a short, wide rectangular control with up and down arrows at the right edge

以下是本节中要讨论的主题。

向上向下控件样式

使用窗口样式,可以操作上下控件的特性,例如如何相对于其合作者窗口定位、是否设置其合作者窗口的文本,以及是否处理上箭头下箭头键。

具有 UDS_ALIGNLEFTUDS_ALIGNRIGHT 样式的上下控件会与其合作者窗口的左或右边缘对齐。 好友窗口的宽度会减小,以适应上下控件的宽度。

具有 UDS_SETBUDDYINT 样式的上下控件会在当前位置发生变化时设置其合作者窗口的描述文字。 除非指定 UDS_NOTHOUSANDS 样式,否则控件会在十进制字符串的每三位数字之间插入一个千位分隔符。 如果好友窗口是一个列表框,则上下控件会设置其当前选择而不是描述文字。

可以指定 UDS_ARROWKEYS 样式,以便为上下控件提供键盘界面。 如果指定了此样式,则控件将处理上箭头键和下箭头键。 该控件还会对合作者窗口进行子类化,以便在合作者窗口拥有焦点时处理这些键。

如果使用上下控件进行水平滚动,则可以指定 UDS_HORZ 样式。 此样式会使上下控件的箭头指向左右,而不是上下。

默认情况下,如果用户尝试让当前位置超出其最大值或最小值,则当前位置不会变化。 可以使用 UDS_WRAP 样式来改变此行为,从而使位置“覆盖”到相反方向的极端位置。 例如,如果增量超出上限,则位置就会回到下限。

位置和加速度

在创建上下控件后,可以通过发送消息来更改控件的当前位置、最小位置和最大位置。 还可以更改用于在合作者窗口中显示当前位置的基数,以及单击上箭头或下箭头时当前位置的变化速率。

要检索上下控件的当前位置,请使用 UDM_GETPOS 消息。 对于带有合作者窗口的上下控件,当前位置就是合作者窗口描述文字中的数字。 由于描述文字可能已经更改(例如,用户可能已经编辑了编辑控件的文本),因此上下控件会检索当前描述文字并相应更新其当前位置。

合作者窗口的描述文字可以是十进制字符串,也可以是十六进制字符串,具体取决于上下控件的基数(即基数 10 或 16)。 可以使用 UDM_SETBASE 消息来设置基数,并使用 UDM_GETBASE 消息来检索基数。

UDM_SETPOS 消息用于设置合作者窗口的当前位置。 请注意,与滚动条不同,上下箭头控件会在单击上下箭头时自动更改其当前位置。 因此,应用程序在处理 WM_VSCROLLWM_HSCROLL 消息时无需设置当前位置。

可以使用 UDM_SETRANGE 消息来更改上下控件的最小和最大位置。 最大位置可能小于最小值,在此情况下,单击上箭头按钮就会减小当前位置。 换而言之,向上意味着向最大位置移动。 要检索上下控件的最小和最大位置,请使用 UDM_GETRANGE 消息。

可以通过设置上下控件的加速度来控制用户按住箭头按钮时位置变化的速率。 加速度由 UDACCEL 结构数组定义。 每个结构都会指定一个时间间隔,以及在该时间间隔结束时递增或递减的单位数。 要设置加速度,请使用 UDM_SETACCEL 消息。 要检索加速度信息,请使用 UDM_GETACCEL 消息。

默认上下控件消息处理

本节将介绍由上下控件处理的标准 Windows 消息。

Message 已执行的处理
WM_CREATE 分配并初始化一个专用数据结构,并将其地址保存为窗口数据。
WM_DESTROY 释放在 WM_CREATE 处理过程中分配的数据。
WM_ENABLE 使窗口失效。
WM_KEYDOWN 如果是上箭头键或下箭头键,则更改当前位置。
WM_KEYUP 完成位置更改。
WM_LBUTTONDOWN 捕获鼠标。 如果合作者窗口是编辑控件或列表框,则会将焦点设置为合作者窗口。 如果鼠标放在向上或向下按钮上,它就会开始改变位置并设置计时器。
WM_LBUTTONUP 完成位置更改,如果上下左右控件已捕获到鼠标,则释放鼠标捕获。 如果合作者窗口是一个编辑控件,则它会选择编辑控件中的所有文本。
WM_PAINT 绘制上下控件。 如果 wParam 参数为非 NULL,则控件假定该值为 HDC,并使用该设备上下文进行绘制。
WM_TIMER 如果鼠标按住一个按钮且时间间隔足够长,则更改当前位置。