スクロールバーのサムトラックのサイズを変更するにはどうすればよいですか
-
05-07-2019 - |
質問
メモ帳を開いて10行追加し、エディターのサイズを変更して9行のみを表示すると、サムトラック(スクロールバーのドラッグ可能なブロック)はほぼ垂直スクロールバーの長さになります。数千行追加した場合、サムトラックの高さはわずか数ピクセルです。
この動作を、水平スクロールバーを実装したTCustomControlの子孫に複製したいと思います。そこで、WS_HSCROLLを(CreateParamsの)ウィンドウスタイルに追加し、WM_HSCROLLのハンドラーを実装しました。途中で、SetScrollRangeとSetScrollPosを使用して、サムトラックの範囲と位置を管理しますが、小さなバグはほぼ完全な正方形のままです。
不足しているものは何ですか?
解決
ドキュメントでは、 SetScrollRange
および SetScrollInfo
> SetScrollPos 。
Wouterの回答が指摘しているように、ページサイズも設定する必要があります。位置と範囲は、親指の中心がどこにあるかをOSに伝えますが、ページサイズは範囲のどれだけの範囲が見えるかを示し、それが親指のサイズを決定するものです。そのためには SetScrollInfo
を使用する必要があります。ボーナスとして、位置、範囲、ページサイズを一度に設定できます。
TCustomControl
は TWinControl
とは1つの点で異なります。キャンバスがあります。 TScrollingWinControl
も1つの点で異なります。スクロールバーがあります。キャンバスを TScrollingWinControl
の子孫に追加する方が、スクロールバーを TCustomControl
の子孫に追加するよりもはるかに簡単です— VCLソースコードからコピーして貼り付けるコードが少なくなります。コントロールの基本クラスを変更して、現在地を確認します。
それがオプションではない場合でも、 TScrollingWinControl
と TControlScrollBar
がどのように連携するかを確認することをお勧めします。
他のヒント
PageSize
プロパティを使用して、つまみのサイズに影響を与えることができます。
例:
ScrollBar1.Min := 0;
ScrollBar1.Max := 100;
ScrollBar1.Position := 70;
ScrollBar1.PageSize := 50;
次のようになります: