4

我无法将TTrackBar拇指大小调整为更大的大小。看图片:

Trackbar 拇指小(在左侧)

我在左边有个小拇指,我不能把它变大(但不是 TrackBar 本身)。
所需的拇指大小显示在带有红色区域的图像上。
也许我可以以某种方式使用 WINAPI?C++ 应用程序通常有更大的拇指。

这就是我真正想要的:

NotePad++ TrackBar 风格

4

2 回答 2

10

使用标准的轨迹栏控件似乎无法做到这一点。事实上,我看不到任何与此相关的轨迹栏样式轨迹栏消息。只有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++ 屏幕截图中的外观,您还应该设置TickMarkstmBothTickStyletsNone

但是,这并不能回答您的问题,即关于使拇指变大的问题。这将使凹陷的矩形更小......但是,从您的屏幕截图中,我猜这就是您想要的。

于 2013-02-18T18:42:20.990 回答
8

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;
于 2013-02-19T00:13:43.310 回答