Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何调整轨迹栏拇指的大小?_Delphi_Delphi 7_Trackbar - Fatal编程技术网

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:No
ShowSelRange
在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;