如何调整TrackBar拇指尺寸?

时间:2013-02-18 18:16:01

标签: delphi delphi-7 trackbar

我无法将TTrackBar拇指尺寸调整到更高的尺寸。见图:

Trackbar thumb is small (on the left)

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

这就是我实际上的目的:

NotePad++ TrackBar style

2 个答案:

答案 0 :(得分:10)

使用标准轨迹栏控件似乎无法做到这一点。实际上,我看不到与此相关的任何trackbar styletrackbar 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创建子类。重要的是在执行实际绘图之前处理通知。

这是示例的样子:
enter image description here

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;