4

TTrackBar親指のサイズを大きいサイズに調整できません。画像を参照してください。

トラックバーのつまみが小さい (左側)

左に小さな親指があり、それを大きくすることはできません (ただし、トラックバー自体はできません)。
希望の親指のサイズは、赤い領域の画像に表示されます。
どうにかして WINAPI を使用できますか? C++ アプリは親指の方が大きいことがよくあります。

これは私が実際に望んでいるものです:

NotePad++ トラックバー スタイル

4

2 に答える 2

10

これは、標準のトラックバーコントロールでは実行できないようです。確かに、これに関連するトラックバーのスタイルトラックバーのメッセージは表示されません。TBM_SETTHUMBLENGTHVCLからもアクセスできる、のみがあります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 ++スクリーンショットの外観を取得するには、およびに設定TickMarksする必要があります。tmBothTickStyletsNone

ただし、これは親指を大きくすることに関する質問には答えません。これにより、沈んだ長方形が小さくなります...ただし、スクリーンショットから、これが必要なものだと思います。

于 2013-02-18T18:42:20.990 に答える
8

Trackbar は、カスタム ドローをサポートするネイティブ コントロールの 1 つです。基本的に、テーマが有効になっている場合は、コントロールの描画のさまざまな側面を制御したり、自分で描画部分を追い越していることを OS に伝えたりすることができます。カスタム ドローの詳細については、こちらを参照してください。

一部のパーツのサイズを少しいじるために、図面を追い越す必要はありません。チャネル(くぼんだ追跡背景) と目盛りを描画するのは VCL です。ティックについては、使用できるプロパティが既にあります。チャネルについては、長方形を少し収縮させることができ、VCL がそこから引き継ぎます。つまみは既定のウィンドウ プロシージャによって描画されますが、OS は変更された四角形につまみを描画します。

以下の例 (水平トラックバーの場合)WM_NOTIFYは、フォームに送信された通知をインターセプトして、これらの変更を実行します。これは、トラックバーがフォーム上に直接配置されている場合にのみ機能します。そうでない場合は、 から派生した新しいコントロールTTrackBarを handleCN_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 に答える