我无法将TTrackBar
拇指尺寸调整到更高的尺寸。见图:
左边有一个小拇指,我不能让它变大(但不是TrackBar本身)。
所需的拇指尺寸显示在带有红色区域的图像上
也许我可以用某种方式使用WINAPI?
C ++应用经常有更大的拇指。
这就是我实际上的目的:
答案 0 :(得分:10)
使用标准轨迹栏控件似乎无法做到这一点。实际上,我看不到与此相关的任何trackbar style或trackbar message。只有TBM_SETTHUMBLENGTH
,您也可以从VCL的TTrackBar.ThumbLength
访问,但这也会影响背景凹陷矩形的高度。
一个讽刺的是,我怀疑“C ++应用经常有更大的拇指”的观察结果。
当然,您始终可以your own trackbar-like control。
或者你只想缩小凹陷的矩形?然后在Object Inspector中将ShowSelRange
设置为False
。但如果主题开启,你仍然无法使拇指大于24。
如果您使用的是没有TrackBar.ShowSelRange
的旧版Delphi,则需要手动删除窗口样式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
。
这不能回答你的问题,这是关于让拇指更大。这将使凹陷的矩形更小 ...但是,从你的截图中,我猜这就是你想要的。
答案 1 :(得分:8)
Trackbar是支持自定义绘制的本机控件之一。基本上,当启用主题时,您可以控制绘制控件的各个方面,或者您可以告诉操作系统您自己超越了绘图部件。详细了解自定义绘制here。
我们没有必要超越任何图纸以稍微调整某些部件的尺寸。正是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;