Как настроить размер большого пальца Трекбара?


Я не могу настроить размер большого пальца TTrackBar на более высокий размер. Смотрите изображение:

Большой палец трекбара мал (слева)

У меня маленький большой палец слева, и я не могу сделать его больше (но не сам трек-бар).
Нужный размер большого пальца показан на изображении с красной областью.
Может быть, я смогу как-то использовать WINAPI? Приложения C++ часто имеют большой палец.

Вот для чего я на самом деле прыгаю:

Блокнот++ стиль Трекбара

2 2

2 ответа:

Похоже, что это невозможно сделать с помощью стандартного управления трекбаром. Действительно, я не вижу никакого стиля трекбара или сообщения трекбара, связанного с этим. Есть только то, что TBM_SETTHUMBLENGTH, к которому вы также можете получить доступ из VCL TTrackBar.ThumbLength, но это также влияет на высоту фонового утопленного прямоугольника.

Следствие состоит в том, что я сомневаюсь в наблюдении, что "приложения C++ часто имеют больший палец".

Конечно, вы всегда можете сделать свой собственный трекбар-подобный контроль .

Или вы хотите только уменьшить затонувший прямоугольник? Затем просто установите ShowSelRange в False в Инспекторе объектов. Но если темы включены, вы все равно не можете сделать большой палец больше, чем около 24.

Если вы находитесь на старой версии Delphi без TrackBar.ShowSelRange, вам нужно удалить стиль окна TBS_ENABLESELRANGE вручную. Вы можете сделать это в любое время, используя SetWindowLong, или вы можете сделать это в CreateParams подклассового элемента управления trackbar. Самым простым способом может быть использование ' interposer класс':

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 - это один из собственных элементов управления, поддерживающих пользовательскую рисовку. В принципе, когда темы включены, вы можете управлять различными аспектами рисования элемента управления, или вы можете сказать ОС, что вы обгоняете рисование деталей самостоятельно. Подробнее о пользовательском розыгрыше смотрите здесь.

Нам не нужно перегонять какой-либо рисунок, чтобы немного поиграть с размерами некоторых деталей. Именно 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;