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

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

2 ответа:
Похоже, что это невозможно сделать с помощью стандартного управления трекбаром. Действительно, я не вижу никакого стиля трекбара или сообщения трекбара, связанного с этим. Есть только то, что
TBM_SETTHUMBLENGTH, к которому вы также можете получить доступ из VCLTTrackBar.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;
