自定义滚动条库版本 1.1






4.87/5 (35投票s)
2001年5月1日
21分钟阅读

732553

18251
如何使用酷炫滚动条库
版本 1.2 中的新功能
TreeView
问题已修复,感谢 Diego Tártara- 其他一些小问题也已修复
版本 1.1 中的新功能
- 支持所有类型的窗口(仅限 Windows NT、2000 和 XP)
- 简化了演示应用程序
- MFC 演示应用程序也已包含
- 增加了对从右到左阅读窗口的支持
- 将 API 的调用约定更改为 WINAPI (
__stdcall
) - 完全独立(无需 C 运行时)
引言
酷滚动条是我编写的一个库,用于自定义窗口的标准滚动条。请注意,此库仅支持标准窗口滚动条。不支持单独的滚动条控件。如果要自定义滚动条控件,则必须设计自己的方法。
与其解释这个库的工作原理,不如我来描述如何在您的应用程序中使用它。酷滚动条的行为与窗口中的普通滚动条完全相同。然而,与标准滚动条不同,酷滚动条可以高度自定义。该库完全用 C 编程语言编写,可以编译成一个微小的 14kb!启用所有功能后,会增加到大约 20kb。对于如此复杂的功能来说,这是一个相当小的开销。尽管此库不需要任何外部库,例如 MFC、ATL、WTL 等,但您绝对可以在这些类型的项目中使用此库。
特点
- 更改窗口滚动条的大小
- 在滚动条区域插入按钮
- 在插入的按钮上使用标准位图或图元文件
- 为所有插入的按钮启用工具提示
- 启用平面样式和热跟踪滚动条
- 自定义绘制,因此您可以用自己的位图绘制滚动条
从酷滚动条库的 1.1 版本开始,引入了一个新功能,即使您无法访问源代码,也可以为程序中的任何窗口添加酷滚动条。这包括标准 Windows 控件(编辑框、列表框)和通用控件(ListView
、TreeView
等)。
不幸的是,此功能仅在程序运行于 Windows NT、2000 和 XP 下时可用。这是因为 Windows 9x 和 NT 操作系统将 DLL 映射到进程地址空间的方式不同。这种差异阻止了进程在 Windows 9x 下运行时挂钩 API 调用,这就是此功能仅在 NT 下可用的原因。
也许酷滚动条库的后续版本会解决这个问题。然而,在此之前,必须在 Windows 95、98 或 ME 下运行的程序只能在其源代码可用的窗口上拥有酷滚动条。
为任何窗口启用酷滚动条(版本 1.1 新增)
酷滚动条下载现在包含一个额外的库,它使程序能够为该程序中的任何窗口启用酷滚动条。这个库(coolsb_detours
)使用一种称为二进制重写的技术来挂钩和拦截 USER32.DLL 中所有标准滚动条 API 调用。coolsb_detours
库实际上依赖于 research.microsoft.com 提供的卓越的 Detours
包。
要使用 coolsb_detours
,您必须访问 Microsoft 的研究网站并下载 Detours
包。您实际上只需要一个文件,但 Detours
许可证协议阻止我自行分发此文件。您可以从下面的链接访问 Detours
页面
您从该包中唯一需要的文件是 lib\detours.lib。只需在尝试编译之前将此文件复制到 coolsb_detours 目录中。请在开始之前阅读 Microsoft 的此包许可协议 - 它包含一些重要信息。
下载 Detours
包后,您必须将 coolsb_detours
项目以及标准 coolsb
项目添加到您的工作区。如果您不需要它提供的新功能,则不必包含 coolsb_detours
。
有两个新的酷滚动条 API 调用,用于启用和禁用对所有类型窗口的支持。
BOOL CoolSB_InitializeApp(void);
CoolSB_InitializeApp
允许您的程序将酷滚动条应用于由您的程序创建的任何窗口。请注意,CoolSB_InitializeApp
本身不启用酷滚动条 - 这仍然是通过 InitializeCoolSB
API 调用实现的(见下文)。您通常会在程序开始时调用 CoolSB_InitApp
。
BOOL CoolSB_UninitializeApp(void);
CoolSB_UninitializeApp
必须在您的程序退出之前调用(假设您也调用了 CoolSB_InitializeApp
)
只有当程序在 Windows NT、2000 或 XP 下运行时,这两个函数才会成功返回。
向窗口添加酷滚动条
要向窗口添加酷滚动条,请调用 InitializeCoolSB
,并传递窗口句柄。除非您在 Windows NT/2000/XP 下使用 coolsb_detours
包,否则您必须将所有标准滚动条函数(例如 SetScrollInfo
或 GetScrollInfo
)替换为等效的 CoolSB_xxx
版本。每个标准滚动条 API 调用都有一个酷滚动条函数调用。这些函数的行为与标准 API 调用完全相同。如果窗口未启用酷滚动条,酷滚动条函数将自动默认为标准 API 调用。这允许您打开和关闭酷滚动条,而无需编写条件代码。
除了标准滚动条功能外,酷滚动条还提供了一些额外的功能,以及一组用于操作这些功能的 API 调用。
注意:如果您使用 coolsb_detours
库,则无需使用 CoolSB_xxx
滚动条函数。
更改滚动条的大小
CoolSB_SetSize
允许更改水平滚动条、垂直滚动条或两者的大小。您应该非常确定您真的想更改滚动条的大小,因为它可能会惹恼已经将系统滚动条大小设置为其所需确切大小的用户。
BOOL CoolSB_SetSize(HWND hwnd, int wBar, int nLength, int nWidth);
通过使用此 API 调用,您可以更改滚动条的两个尺寸。
wBar
可以是以下值之一:SB_HORZ
、SB_VERT
或SB_BOTH
。nLength
指的是水平滚动条箭头的宽度,或垂直滚动条箭头的高度。我选择“长度”一词是因为您可以将长度视为实际箭头的长度,指向其指向的方向。nWidth
指的是水平滚动条箭头的高度,或垂直滚动条箭头的宽度。此参数可能是大多数人在想到滚动条“大小”时想到的那个,因为它不仅改变了箭头的宽度,还改变了滚动条边距和滑块宽度。
通过指定一个非负整数,您可以以像素为单位指定滚动条箭头的大小。滚动条大小将不受系统滚动条设置的影响,即使用户在您的程序运行时更改这些设置也是如此。
重要:通过指定负数,您可以将滚动条尺寸设置为系统滚动条大小的倍数。值 -1
或 SYSTEM_METRIC
将导致滚动条大小与普通滚动条完全相同。值 -2
将导致滚动条大小是标准滚动条的两倍,依此类推。通过使用负值,酷滚动条将始终根据系统滚动条度量进行大小调整。您不必在用户每次更改滚动条系统度量时都调用此函数。
您应该尝试为长度和宽度分配相同的数字。如果您使用不同的值,那么您的滚动条在一个维度上会显得被挤压。
制作平面滚动条
酷滚动条库支持平面滚动条,就像通用控件库中发现的种类一样。与 Microsoft 平面滚动条不同,酷滚动条只支持两种类型的平面滚动条。它们是标准的平面外观滚动条,没有“热跟踪”,以及启用了“热跟踪”的普通平面滚动条。热跟踪是当鼠标移到滚动条的某个部分时,该部分会突出显示的功能。
CoolSB_SetFlatMode
API 允许您为启用了酷滚动条的窗口提供平面滚动条。
BOOL CoolSB_SetFlatMode(HWND hwnd, int wBar, UINT nFlatMode);
您必须使用 wBar
参数指定窗口的哪个滚动条将显示为平面滚动条。如果希望两个滚动条都变为平面外观,则可以是 SB_HORZ
、SB_VERT
或 SB_BOTH
。nFlatMode
参数可以是三个值之一。
CSBS_FLAT | 普通外观的平面滚动条 |
CSBS_HOTTRACKED | 热跟踪平面滚动条 |
CSBS_NORMAL | 移除平面外观 |
在酷滚动条中插入按钮
有四个函数可用于在滚动条中插入按钮。您可以在水平滚动条的左侧或右侧插入按钮,并在垂直滚动条的上方或下方插入按钮。
所有这些函数都使用 SCROLLBUT 结构来指定每个按钮的属性。您必须使用 fMask
成员来指定 SCROLLBUT
结构的哪些成员包含有效信息。
BOOL CoolSB_InsertButton(HWND hwnd, int wSBflags, UINT nPos, SCROLLBUT *psb);
wSBflags
必须是SB_HORZ
或SB_VERT
nPos
是一个整数值,指定插入按钮的位置。可以为零,将按钮插入到所有其他按钮之前,或者为-1
,将按钮插入到所有其他按钮之后。psb
是SCROLLBUT
结构的地址,该结构指定按钮属性。
其余的按钮函数都处理已经插入到滚动条中的按钮。
BOOL CoolSB_ModifyButton(HWND hwnd, int wSBflags, UINT uItem, BOOL fByCmd,
SCROLLBUT *psb);
BOOL CoolSB_RemoveButton(HWND hwnd, int wSBflags, UINT uItem, BOOL fByCmd);
BOOL CoolSB_GetButton (HWND hwnd, int wSBflags, UINT uItem, BOOL fByCmd,
SCROLLBUT *psb);
wSBflags
必须是SB_HORZ
或SB_VERT
- 如果
fByCmd
为TRUE
,则uItem
是按钮的命令标识符,该标识符在插入按钮时由SCROLLBUT
结构的uCmdId
成员指定。
如果fByCmd
为FALSE
,则uItem
是一个非负整数,指定要修改/移除的按钮的位置。 psb
是SCROLLBUT
结构的地址。
插入的按钮将接收鼠标点击通知。鼠标按下事件将发送 NM_CLICK
消息,鼠标抬起事件将发送正常的 WM_COMMAND
消息。NM_CLICK
消息(以 WM_NOTIFY
的形式发送)使用 NMCOOLBUTMSG 结构,该结构包含有用的信息,例如按钮的坐标。
插入按钮的工具提示
当在 userdefs.h 文件中定义 COOLSB_TOOLTIPS
时,如果鼠标悬停在其中一个插入的按钮上,将向窗口发送工具提示通知。通过忽略这些消息,将不会显示工具提示。然而,通过正确处理 WM_NOTIFY
消息,可以简单地为任何插入的按钮添加工具提示。
您只需要响应标准的 TTN_GETDISPINFO
通知即可显示工具提示。按钮的命令标识符将在 NMTTDISPINFO
结构的 hdr.idFrom
成员中指定。下面是支持工具提示所需的示例代码。
case WM_NOTIFY:
{
NMTTDISPINFO *ttdi;
ttdi = (NMTTDISPINFO *)lParam;
if(ttdi->hdr.code == TTN_GETDISPINFO)
{
wsprintf(ttdi->lpszText, "This is button %d", ttdi->hdr.idFrom);
ttdi->hinst = hInst;
}
return 0;
}
自定义绘制滚动条
酷滚动条库支持自定义绘制的一个子集,这是 Windows 附带的许多通用控件中存在的功能。自定义绘制允许应用程序完全接管窗口滚动条的绘制,并将滚动条图形替换为完全用户定义的外观。
就像标准自定义绘制功能一样,绘制请求通过 WM_NOTIFY
消息发送到启用了酷滚动条的窗口。
使用 NMCSBCUSTOMDRAW 结构通知您绘制操作。
并非所有自定义绘制功能都已为酷滚动条实现。只有三个通知会发送到窗口——CDDS_PREPAINT
(检查您是否要自定义绘制)、CDDS_POSTPAINT
(绘制完成后)和 CDDS_ITEMPREPAINT
(针对每个滚动条项)。每当需要绘制滚动条时,会为每个滚动条发送一个预绘制和后绘制通知。当需要绘制滚动条手柄(死区)时,不会发送这两个通知;在这种情况下,只会发送一个项预绘制通知。
需要注意的是,CDDS_ITEMPREPAINT
通知返回的值目前未使用。假定如果启用了自定义绘制(通过在预绘制步骤中返回 CDRF_SKIPDEFAULT
),那么整个滚动条都将进行自定义绘制,因此,如果您想绘制任何部分,就必须绘制滚动条的所有部分。
移除酷滚动条
如果出于某种奇怪的原因您想关闭酷滚动条,只需调用 UninitializeCoolSB
API,并传递窗口的句柄。您无需在窗口销毁时调用此函数,因为酷滚动条在此情况下会自动移除自己。
关于源代码的说明
此库完全用 C 语言编写,除了标准 win32 API 外,不使用任何其他库。为了封装代码,需要将所有实现代码打包到一个文件中,所有函数都赋予静态链接,这样它们就不会与您项目中的其他函数冲突。这是使用 C 语言的一个缺点。最好将源代码拆分成单独的文件,分别处理特定的滚动条功能——例如,一个文件处理绘图代码,另一个文件处理鼠标代码等等。然而,这将需要使用命名空间来封装库,而命名空间仅在 C++ 中可用。我认为在这种情况下,覆盖更广泛的受众更重要,但请随意使用您的 C++ 编译器。
我也应该借此机会为我在 C 项目中使用 C++ 风格注释进行辩护。我的理由是:我发现使用 C 风格注释很乏味。此外,我尝试过的所有用于 Windows 的 C 编译器都毫无问题地接受 C++ 注释。事实上,新的 C99 标准允许使用 C++ 风格注释,但该项目在旧编译器上也能正常编译。就这样。
重要提示
有一个名为 userdefs.h 的文件,可用于包含或排除酷滚动条库的某些功能。例如,如果您不想支持插入按钮,那么您可以 #undef
INCLUDE_BUTTONS
定义,这将导致更小的代码大小。有许多功能可以通过这种方式进行更改,并且它们都在此文件中完整记录。
为什么不能自定义标准 Windows 控件
(仅适用于 Windows 95,98,ME)
肯定有人会抱怨他们无法将酷滚动条添加到树形视图控件或编辑控件中,所以我会解释为什么这不可能。
首先,自定义绘制标准窗口上的滚动条是完全可能的。毕竟,您只需调用 InitializeCoolSB
。然而,在内部,标准窗口都使用标准的滚动条函数,例如 SetScrollInfo
和 SetScrollPos
。这是一个问题,因为这些函数会导致窗口的滚动条重新绘制,并且这种重新绘制不是通过 WM_NCPAINT
消息执行的。每当您调整标准窗口的大小,或在其中上下滚动时,都会调用标准滚动条 API,这将导致您绘制精美的自定义滚动条被覆盖。因此,除非您拥有窗口或控件的源代码,否则您无法将酷滚动条库应用于它,因为您必须调用 CoolSB_xxx
API 函数来执行所有滚动操作。
还没被说服?好吧,理论上有一种方法可以克服这些问题,并在任何窗口上使用 coolscrollbar 库,但这不适合胆小的人。可以拦截程序中的任何 Windows API 调用,并执行诸如用另一个用户定义调用替换函数调用之类的任务。例如,您可以拦截程序进行的所有滚动条 API 调用,并将它们转发给 CoolSB_xxx
版本。
网上有很多关于 API 拦截的资料。以下是我会考虑的两种技术
- 导入地址表 (IAT) 修补
此技术可用于通用控件库,因为该库包含一个 thunk 表,其中包含指向 USER32.DLL 中滚动条函数的指针。IAT 可以重写,以便所有滚动条 API 调用都被重定向到
CoolSB_xxx
函数。 - 目标函数的二进制重写
这更复杂,涉及到覆盖 USER32.DLL 内部每个滚动条函数的开头。如果您想在编辑或列表控件上使用酷滚动条,就必须使用此技术。这是因为这些控件是在 USER32.DLL 内部实现的,您无法修补 USER32 的 IAT,仅仅因为它不导入自己的 API 调用。因此,您必须拦截 USER32 本身内部的滚动条 API 调用。
新的 coolsb_detours
库使用上述第二种技术来克服此问题,但这仅在您的程序运行于 Windows NT 下时才有效。如果您使用的是 Windows 9x 系列操作系统,那么您就只能靠自己了。
结论
酷滚动条库现在发布了第二个版本(版本 1.1)。尽管我解决了一些小问题并引入了一些新功能,但您在使用此库时仍需小心。我可能忽略了您的项目中可能存在的错误或不兼容性。我已经用我自己的项目彻底测试了该库,但它是否完全正确还有待观察。感谢您的反馈!
SCROLLBUT
指定已插入窗口滚动条中的按钮的属性。此结构由 CoolSB_InsertButton
、CoolSB_ModifyButton
和 CoolSB_RemoveButton
API 调用使用。
typedef struct
{
UINT <a href="#fMask">fMask</a>; /* which members are in use */
UINT <a href="#uPlacement">uPlacement</a>; /* which side of the scrollbar to insert */
UINT <a href="#uCmdId">uCmdId</a>; /* command identifier (WM_COMMAND value to send)*/
UINT <a href="#uButType">uButType</a>; /* type of button to insert */
UINT <a href="#uState">uState</a>; /* what state the button is in (i.e. pressed) */
int <a href="#nSize">nSize</a>; /* size in pixels. -1 for autosize */
HBITMAP <a href="#hBmp">hBmp</a>; /* handle to a bitmap to use as the button face*/
HENHMETAFILE <a href="#hEmf">hEmf</a>; /* handle to an enhanced metafile */
HCURSOR <a href="#hCurs">hCurs</a>; /* handle to a mouse cursor to use */
int <a href="#nMinSize">nMinSize</a>; /* minimum size of a resizable button */
int <a href="#nMaxSize">nMaxSize</a>; /* maximum size of a resizable button */
} SCROLLBUT;
成员
fMask
是一组通过逻辑或运算符组合的标志,指定 SCROLLBUT
结构中哪些成员包含有效信息。此成员可以设置以下一个或多个值
SBBF_TYPE | nButType 成员包含有效数据 |
SBBF_ID | nCmdId 成员包含按钮的有效命令标识符 |
SBBF_STATE | nState 成员包含有效的状态标识符 |
SBBF_PLACEMENT | nPlacement 成员包含有效数据 |
SBBF_SIZE | nSize 成员包含有效数据 |
SBBF_BITMAP | hBmp 成员是位图资源的有效句柄 |
SBBF_ENHMETAFILE | hEmf 成员是增强型图元文件的有效句柄 |
SBBF_CURSOR | hCurs 成员是光标资源的有效句柄 |
SBBF_BUTMINMAX | nMinSize 和 nMaxSize 成员包含有效的滑块大小 |
uButType
指定将插入到滚动条中的按钮类型。此成员只能设置为以下值之一
SBBT_PUSHBUTTON | 按钮是一个标准按钮,其外观和感觉与普通滚动条按钮箭头相同。 |
SBBT_TOGGLEBUTTON | 按钮可以在向上和向下状态之间切换 |
SBBT_FIXED | 按钮不响应鼠标点击 |
SBBT_FLAT | 按钮没有 3D 外观 |
SBBT_BLANK | 按钮是一个空白区域,不响应点击 |
SBBT_DARK | 另一种空白区域,但颜色较深 |
SBBT_OWNERDRAW | NM_CUSTOMDRAW 消息将发送到窗口以绘制按钮。 |
除了上述按钮类型外,您还可以通过与按钮类型进行“或”运算来包含以下按钮类型修饰符之一
SBBM_RECESSED | 按钮按下时具有凹陷外观 |
SBBM_LEFTARROW | 按钮具有标准的左箭头位图 |
SBBM_RIGHTARROW | 按钮具有标准的右箭头位图 |
SBBM_UPARROW | 按钮具有标准的上箭头位图 |
SBBM_DOWNARROW | 按钮具有标准的下箭头位图 |
SBBM_RESIZABLE | 按钮可以用鼠标调整大小 |
SBBM_TYPE2 | 按钮使用不同的 3D 外观 |
SBBM_TYPE3 | 按钮使用不同的 3D 外观 |
uCmdId
指定一个命令标识符,该标识符以 WM_COMMAND
消息的形式使用,当鼠标点击按钮时发送。
uState
指定按钮的初始状态,如果它是按钮或切换按钮。有效值在下面定义。
SBBS_NORMAL | 按钮处于其默认的未按下状态。 |
SBBS_PUSHED | 按钮处于按下或“点击”状态。 |
nSize
指定按钮的大小。对于插入到水平滚动条中的按钮,nSize
表示按钮的宽度,以像素为单位。对于插入到垂直滚动条中的按钮,nSize
表示按钮的高度。非负值用于指定确切的大小,以像素为单位。负数可用于指定标准滚动条按钮大小的倍数。值 -1
生成与滚动条箭头大小相同的按钮。值 -2
生成大小为滚动条按钮两倍的按钮,依此类推。
uPlacement
指定按钮应插入到滚动条的哪一侧。它可以是以下值之一。如果未指定 nPlacement
,则默认为 SBBP_LEFT
或 SBBP_ABOVE
。
SBBP_LEFT | 按钮插入到水平滚动条的左侧。 |
SBBP_RIGHT | 按钮插入到水平滚动条的右侧。 |
SBBP_ABOVE | 按钮插入到垂直滚动条的上方。 |
SBBP_BELOW | 按钮插入到垂直滚动条的下方。 |
hBmp
是位图的句柄,用作按钮的图像。位图在按钮中居中。如果未定义位图,则按钮留空。位图的所有权由用户负责。
hEmf
是增强型图元文件的句柄,当未提供位图时,用作按钮的图像。图元文件的所有权由用户负责。
hCurs
是鼠标光标的句柄。当鼠标经过按钮时,将使用此光标。如果未指定光标,则使用标准鼠标光标。
nMinSize
是可调整大小按钮的最小尺寸(以像素为单位)。uButType
成员必须包含 SBBM_RESIZABLE
标志。
hCurs
是可调整大小按钮的最大尺寸(以像素为单位)。uButType
成员必须包含 SBBM_RESIZABLE
标志。
备注
此结构在酷滚动条库的未来版本中可能会发生变化。
NMCOOLBUTMSG
指定插入滚动条按钮上的鼠标事件通知。目前,仅支持 NM_CLICK
通知。
typedef struct
{
NMHDR hdr; /* standard WM_NOTIFY header */
RECT rect; /* window-relative coordinates of button */
POINT pt; /* coordinates of the mouse cursor */
UINT uCmdId; /* command identifier of the button */
UINT uState; /* item state (clicked / disable etc) */
UINT nBar; /* which scrollbar (SB_HORZ / SB_VERT) */
} NMCSBCUSTOMDRAW;
成员
hdr
是所有 WM_NOTIFY
消息中使用的标准 NMHDR
结构。此结构的 code
成员在此消息类型中将为 NMCUSTOMDRAW
。
rect
指定要绘制项的坐标。这些坐标相对于窗口非客户区的左上角。
pt
指定光标的屏幕坐标,以像素为单位。
uCmdId
指定滚动条按钮的命令标识符。
uState
此成员目前未使用。
nBar
指定按钮属于窗口的两个滚动条中的哪一个。这可以是 SB_HORZ
或 SB_VERT
。
备注
此结构在酷滚动条库的未来版本中可能会发生变化。
NMCSBCUSTOMDRAW
指定特定于酷滚动条库的自定义绘制结构。
typedef struct
{
NMHDR hdr; /* standard WM_NOTIFY header */
DWORD dwDrawStage; /* PREPAINT / POSTPAINT etc */
HDC hdc; /* handle to a device context to draw into */
RECT rect; /* window-relative coordinates of item to draw */
UINT uItem; /* item id to draw */
UINT uState; /* item state (clicked / disable etc) */
UINT nBar; /* which scrollbar (SB_HORZ / SB_VERT) */
} NMCSBCUSTOMDRAW;
成员
hdr
是所有 WM_NOTIFY
消息中使用的标准 NMHDR
结构。此结构的 code
成员在此消息类型中将为 NMCUSTOMDRAW
。
dwDrawStage
指定自定义绘制的当前阶段。酷滚动条库支持此成员的三个可能值
CDDS_PREPAINT | 滚动条即将被绘制。只有 nBar 和 hdc 成员包含有效信息。例如,您可以使用此消息选择调色板到设备上下文中。您可以返回 |
CDDS_POSTPAINT | 滚动条已完成绘制。只有 nBar 和 hdc 成员包含有效信息。如果您在其中选择了任何调色板,则应将设备上下文恢复到其原始状态。此消息的返回值未使用。 |
CDDS_ITEMPREPAINT | 一个项目需要绘制。一个项目可以是滚动条箭头、滚动滑块或滚动条边距。目前,如果 CDRF_SKIPDEFAULT 在预绘制消息中返回,则酷滚动条库期望所有项目都由用户绘制。因此,此消息的返回值目前未使用。 |
目前,没有发送其他绘制阶段通知。
hdc
指定应绘制到的设备上下文。此设备上下文未定义任何剪裁区域。
rect
指定要绘制项的坐标。这些坐标相对于窗口非客户区的左上角。
uItem
指定需要绘制的滚动条项目。这可以是以下值之一
HTSCROLL_LEFT / HTSCROLL_UP | 左或上箭头按钮,取决于 nBar 的值 |
HTSCROLL_RIGHT / HTSCROLL_DOWN | 右或下箭头按钮 |
HTSCROLL_PAGELEFT / HTSCROLL_PAGEUP | 滚动滑块之前的左或上滚动条边距 |
HTSCROLL_PAGERIGHT / HTSCROLL_PAGEDOWN | 右或下滚动条边距 |
HTSCROLL_THUMB | 滚动条滑块 |
uState
定义要绘制项的当前状态。这可以是以下值之一
CDIS_HOT | 该项目当前在鼠标指针下(“热”)。 |
CDIS_DISABLED | 该项目已禁用。 |
CDIS_SELECTED | 该项目正在被鼠标激活(被点击)。 |
CDIS_DEFAULT | 该项目处于正常状态。 |
nBar
指定该项目属于窗口的两个滚动条中的哪一个。这将是四个值之一。SB_HORZ
和 SB_VERT
分别标识要绘制的项目是水平或垂直滚动条的一部分。
当需要绘制滚动条死区(大小抓取区域)时,使用 SB_BOTH
值。当需要绘制抓取区域时,不会发送预绘制或后绘制通知,因为这始终是一次性消息。
最后,当需要绘制插入的按钮时,使用 SB_INSBUT
值。在这种情况下,uItem
成员指定插入按钮的命令标识符。仅发送 CDDS_ITEMPREPAINT
通知,并且插入的按钮必须设置 SBBT_OWNERDRAW
类型。
备注
此结构在酷滚动条库的未来版本中可能会发生变化。
历史
- 2003年5月9日:初始版本
许可证
本文档未附带明确许可,但可能在文章文本或下载文件中包含使用条款。如有疑问,请通过下方讨论区联系作者。作者可能使用的许可列表可在此处找到:这里。