TTrackBar
親指のサイズを大きいサイズに調整できません。画像を参照してください。
左に小さな親指があり、それを大きくすることはできません (ただし、トラックバー自体はできません)。
希望の親指のサイズは、赤い領域の画像に表示されます。
どうにかして WINAPI を使用できますか? C++ アプリは親指の方が大きいことがよくあります。
これは私が実際に望んでいるものです:
これは、標準のトラックバーコントロールでは実行できないようです。確かに、これに関連するトラックバーのスタイルやトラックバーのメッセージは表示されません。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 ++スクリーンショットの外観を取得するには、およびに設定TickMarks
する必要があります。tmBoth
TickStyle
tsNone
ただし、これは親指を大きくすることに関する質問には答えません。これにより、沈んだ長方形が小さくなります...ただし、スクリーンショットから、これが必要なものだと思います。
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;