Delphi 如何调整轨迹栏拇指的大小?
我无法将Delphi 如何调整轨迹栏拇指的大小?,delphi,delphi-7,trackbar,Delphi,Delphi 7,Trackbar,我无法将TTrackBar拇指大小调整为更大的尺寸。如图所示: 我左边有一个小拇指,我不能把它变大(但轨迹栏本身不行)。 所需的拇指大小显示在带有红色区域的图像上。 也许我可以用WINAPI? C++应用程序的拇指通常更大。 这就是我真正想要的: 这似乎无法通过标准轨迹栏控件实现。事实上,我看不到任何与此相关的信息。只有,您也可以从VCL的TTrackBar.ThumbLength访问,但这也会影响背景凹陷矩形的高度 一个共同点是,我怀疑“C++应用程序通常有更大的拇指”这一观察结果 当然,你
TTrackBar
拇指大小调整为更大的尺寸。如图所示:
我左边有一个小拇指,我不能把它变大(但轨迹栏本身不行)。所需的拇指大小显示在带有红色区域的图像上。
也许我可以用WINAPI? C++应用程序的拇指通常更大。 这就是我真正想要的:
这似乎无法通过标准轨迹栏控件实现。事实上,我看不到任何与此相关的信息。只有,您也可以从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;
要在记事本++屏幕截图中获得外观,还应将TickMarks
设置为tmall
,并将TickStyle
设置为tsNone
不过,这并不能回答你的问题,那是关于让拇指变大的问题。这将使凹陷的矩形变小。。。但是,从您的屏幕截图来看,我猜这就是您想要的。轨迹栏是支持自定义绘图的本机控件之一。基本上,当启用主题时,您可以控制绘制控件的各个方面,或者您可以告诉操作系统您自己正在超越绘制部件。请参阅有关自定义绘图的详细信息 我们不必超越任何图纸来处理某些零件的尺寸。正是VCL绘制了通道(凹陷的跟踪背景)和刻度。对于记号,已经有了可以使用的属性。对于通道,我们可以稍微缩小矩形,VCL将从那里接管。拇指是通过默认窗口过程绘制的,但这并不重要,操作系统会将拇指绘制到修改后的矩形中 下面的示例(对于水平轨迹栏)截取发送到表单以执行这些修改的
WM_NOTIFY
通知。仅当轨迹栏直接放置在窗体上时,此操作才有效。如果不是这种情况,您可以派生一个从TTrackBar
派生的新控件来处理CN\u NOTIFY
,或将该控件或其父控件子类化为WM\u NOTIFY
。重要的是在实际绘图之前处理通知
下面是示例的外观:@科比克:这将使凹陷的矩形更薄,但对拇指没有影响,拇指将获得其默认大小(~24)。@Ingo:实现屏幕截图中显示的样式没有问题。在Delphi的现代版本中,只需将
ShowSelRange
设置为false
。如果TTrackBar.ShowSelRange
在您的版本中不可用,只需删除窗口样式TBS_ENABLESELRANGE
。我很确定第一个屏幕截图中的“所需拇指大小”大于第二个屏幕截图中的拇指…@Andreas,我想要的是这样的轨迹栏,记事本++风格--+1 p.s:NoShowSelRange
在D7中(OP在任何情况下都可以使用TBS_ENABLESELRANGE
),我还认为~24是它只有在使用XP主题时才能获得的最大大小。。。。当将记号设置为TM2时,实际上没有大小限制。我想你已经搞定了:)@kobik:是的,我刚才看到了。有趣。不过,OP提供的第二张截图表明,他实际上并不想放大拇指,而是想缩小凹陷的矩形…@Andreas,你猜到我的愿望了,我想要更小的凹陷矩形。已解决。+1。我完全忽略了这个选项(有点尴尬)。@Andreas-谢谢。对于这个问题,我也会选择你的解决方案。我通常对自定义绘图感到有点不安,我发现它有点不可预测。@SertacAkyuz:是的,它需要为每一个新的Windows版本更新,因为MS will(再次)已经改变了对默认样式的想法…@Marjan:嗯,根据我的噩梦,主要的问题是微软将在十年或二十年内完全放弃对Win32桌面应用程序的支持。毕竟,GDI和许多其他技术已经在MSDN上标记为“遗留”。
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;