我无法将TTrackBar
拇指大小调整为更大的大小。看图片:
我在左边有个小拇指,我不能把它变大(但不是 TrackBar 本身)。
所需的拇指大小显示在带有红色区域的图像上。
也许我可以以某种方式使用 WINAPI?C++ 应用程序通常有更大的拇指。
这就是我真正想要的:
使用标准的轨迹栏控件似乎无法做到这一点。事实上,我看不到任何与此相关的轨迹栏样式或轨迹栏消息。只有TBM_SETTHUMBLENGTH
,您也可以从 VCL 访问TTrackBar.ThumbLength
,但这也会影响背景凹陷矩形的高度。
一个推论是我怀疑“C++ 应用程序经常有更大的拇指”的观察。
当然,您始终可以制作自己的类似轨迹栏的控件。
还是您只想缩小凹陷的矩形?然后只需在对象检查器中设置ShowSelRange
为。False
但是,如果打开主题,您仍然不能使拇指大于 24 左右。
如果您在旧版本的 Delphi 上没有TrackBar.ShowSelRange
,则需要TBS_ENABLESELRANGE
手动删除窗口样式。您可以随时使用 执行此操作SetWindowLong
,也可以在CreateParams
子类化的轨迹栏控件中执行此操作。最简单的方法可能是使用“插入器类”:
type
TTrackBar = class(ComCtrls.TTrackBar)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
...
implementation
{ TTrackBar }
procedure TTrackBar.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style and not TBS_ENABLESELRANGE;
end;
要获得 Notepad++ 屏幕截图中的外观,您还应该设置TickMarks
为tmBoth
和TickStyle
。tsNone
但是,这并不能回答您的问题,即关于使拇指变大的问题。这将使凹陷的矩形更小......但是,从您的屏幕截图中,我猜这就是您想要的。
Trackbar 是支持自定义绘制的原生控件之一。基本上,启用主题后,您可以控制绘制控件的各个方面,或者您可以告诉操作系统您正在超越自己的绘图部分。在此处查看有关自定义绘图的更多信息。
我们不必超越任何绘图来稍微调整某些部分的大小。绘制通道(凹陷的跟踪背景)和刻度的是 VCL。对于刻度,已经有我们可以使用的属性。对于通道,我们可以将矩形缩小一点,VCL 将从那里接管。拇指是由默认窗口程序绘制的,但没关系,操作系统会将拇指绘制到修改后的矩形。
下面的示例(对于水平轨迹栏)拦截WM_NOTIFY
发送到表单的通知以执行这些修改。这仅在将轨迹栏直接放置在表单上时才有效。如果不是这种情况,您可以派生一个新控件,该控件继承自TTrackBar
处理CN_NOTIFY
,或子类化该控件或其父级WM_NOTIFY
。重要的是在执行实际绘图之前处理通知。
这是示例的外观:
type
TForm1 = class(TForm)
Button1: TButton;
TrackBar1: TTrackBar;
procedure FormCreate(Sender: TObject);
protected
procedure WMNotify(var Msg: TWMNotify); message WM_NOTIFY;
end;
...
uses
themes, commctrl, xpman;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
if ThemeServices.ThemesEnabled and
(TrackBar1.Orientation = trHorizontal) then begin
TrackBar1.TickMarks := tmBoth;
TrackBar1.TickStyle := tsNone;
TrackBar1.ThumbLength := 38;
end;
end;
procedure TForm1.WMNotify(var Msg: TWMNotify);
begin
if ThemeServices.ThemesEnabled and
(TrackBar1.Orientation = trHorizontal) then begin
if (Msg.IDCtrl = Longint(TrackBar1.Handle)) and
(Msg.NMHdr.code = NM_CUSTOMDRAW) and
(PNMCustomDraw(Msg.NMHdr).dwDrawStage = CDDS_ITEMPREPAINT) then begin
case PNMCustomDraw(Msg.NMHdr).dwItemSpec of
TBCD_THUMB: InflateRect(PNMCustomDraw(Msg.NMHdr).rc, -4, 0);
TBCD_CHANNEL:
with PNMCustomDraw(Msg.NMHdr).rc do begin
Top := Bottom div 2 + 2;
Bottom := Top + 5;
Inc(Left, 4);
Dec(Right, 4);
end;
end;
end;
end;
inherited;
end;