Delphi 如何制作滚动条';s拇指轨迹调整大小

Delphi 如何制作滚动条';s拇指轨迹调整大小,delphi,scroll,scrollbar,tcustomcontrol,Delphi,Scroll,Scrollbar,Tcustomcontrol,如果打开记事本,添加十行并调整编辑器大小,使其仅显示九行,则拇指轨迹(滚动条上的可拖动块)几乎是垂直滚动条的全长。如果添加几千行,拇指轨迹只有几个像素高 我想在TCustomControl子代中复制这个bahaviour,在那里我实现了一个水平滚动条。因此,我将WS_HSCROLL添加到我的窗口样式中(在CreateParams中),并为WM_HSCROLL实现了一个处理程序。在这个过程中,我使用SetScrollRange和SetScrollPos来管理拇指轨迹的范围和位置——但这个小家伙仍然

如果打开记事本,添加十行并调整编辑器大小,使其仅显示九行,则拇指轨迹(滚动条上的可拖动块)几乎是垂直滚动条的全长。如果添加几千行,拇指轨迹只有几个像素高

我想在TCustomControl子代中复制这个bahaviour,在那里我实现了一个水平滚动条。因此,我将WS_HSCROLL添加到我的窗口样式中(在CreateParams中),并为WM_HSCROLL实现了一个处理程序。在这个过程中,我使用SetScrollRange和SetScrollPos来管理拇指轨迹的范围和位置——但这个小家伙仍然是一个近乎完美的正方形


我缺少什么?

您可以使用
PageSize
属性影响拇指大小

例如:

ScrollBar1.Min      := 0;
ScrollBar1.Max      := 100;
ScrollBar1.Position := 70;
ScrollBar1.PageSize := 50;
将看起来像:

建议使用而不是
SetScrollRange
SetScrollPos

正如所指出的,您还需要设置页面大小。位置和范围告诉操作系统拇指中心的位置,但页面大小告诉操作系统拇指中心的可见范围,这就是拇指大小的决定因素。为此,您必须使用
setScrolInfo
;作为奖励,它允许您同时设置位置、范围和页面大小


TCustomControl
TWinControl
只有一个不同之处:它有一个画布
TScrollingWinControl
也只有一个不同之处:它有滚动条。将画布添加到
TScrollingWinControl
子体应该比将滚动条添加到
TCustomControl
子体容易得多-从VCL源代码复制和粘贴的代码更少。更改控件的基类,然后查看您的位置


即使这不是一个选项,您还是应该看看
TScrollingWinControl
tcontrollScrollbar
是如何协同工作的。

Cobus,您的代码示例对于获得帮助非常有用。@RRUZ:不,绝对不需要。如果您想了解如何不这样做,请查看VCL网格控件。如果您想了解如何做到这一点,请查看VirtualTree、SynEdit或任何其他正常工作的控件。它们的源代码是可用的。您好,这更多是一个相关的问题:您如何将滚动添加到控件本身,是否有TCustomControl子类的成员TScrollbar?+1,但我不确定从
TScrollingWinControl
继承从长远来看工作较少。至少在Win9X上,它还严重限制了可用的滚动范围(16位坐标)。即使在NT行上,它也会将行数限制为2^31
div
(行高)像素。我宁愿使用
setScrolInfo()
并用代码计算所有内容。我也不同意您答案中的TScrollingWinControl部分,部分原因是我的滚动需要相当复杂。但是我使用了SetScrolInfo,它非常有用,谢谢。这是在滚动条控件上吗?我正在处理窗口上的滚动条。