如何调整滚动条的拇指大小?

3
如果您打开记事本,添加十行并调整编辑器大小以仅显示九行,则滑块轨道(滚动条上可拖动的块)几乎占用垂直滚动条的整个长度。如果您添加了几千行,则滑块轨道高度只有几个像素。
我想在一个TCustomControl子类中复制这种行为,其中我实现了一个水平滚动条。因此,我在CreateParams中添加了WS_HSCROLL到我的窗口样式,并实现了WM_HSCROLL的处理程序。在此过程中,我使用SetScrollRange和SetScrollPos来管理滑块轨道的范围和位置,但是那个小家伙仍然是一个近乎完美的正方形。
我错过了什么?

Cobus,提供你的代码示例将有助于你获得帮助。 - RRUZ
@RRUZ:不需要,绝对不需要。如果你想看看如何不做,那就看看VCL网格控件。如果你想看看如何做,那就看看VirtualTree、SynEdit或其他任何正常工作的控件。它们的源代码是可用的。 - mghie
嗨,这更像是一个相关的问题:您如何将滚动添加到控件本身?您的TCustomControl派生类中是否有TScrollbar成员? - wmercer
2个回答

7
您可以使用PageSize属性来影响缩略图的大小。
例如:
ScrollBar1.Min      := 0;
ScrollBar1.Max      := 100;
ScrollBar1.Position := 70;
ScrollBar1.PageSize := 50;

将会是这个样子:

页面大小


该图片展示的是页面大小。

这是关于滚动条控件的吗?我正在处理窗口上的滚动条。 - Cobus Kruger

4

文档 建议使用 SetScrollInfo 而不是 SetScrollRangeSetScrollPos

正如Wouter的回答指出的那样,您还需要设置页面大小。位置和范围告诉操作系统滑块中心在哪里,但页面大小告诉它可见范围有多大,而且这决定了滑块的大小。您必须使用 SetScrollInfo 来实现;作为奖励,它允许您同时设置位置、范围和页面大小。


TCustomControlTWinControl 只有一个区别:它有画布。TScrollingWinControl 的区别也只有一个:它有滚动条。将画布添加到 TScrollingWinControl 的后代应该比将滚动条添加到 TCustomControl 的后代更容易——从 VCL 源代码中复制和粘贴的代码更少。更改控件的基类,然后看看您在哪里。

即使这不是一个选项,您仍然应该好好看看 TScrollingWinControlTControlScrollBar 如何协同工作。


+1,但我不确定从TScrollingWinControl继承是否在长期内更少工作。至少在Win9X上,它还严重限制了可用的滚动范围(16位坐标)。即使在NT线上,它也会将行数限制为2 ^ 31 div(行高)以像素为单位。我宁愿使用SetScrollInfo()并在代码中计算所有内容。 - mghie
我也不同意你答案中关于TScrollingWinControl的部分,部分原因是我的滚动需求比较复杂。但我使用了SetScrollInfo,效果很好,谢谢。 - Cobus Kruger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接