Как настроить размер большого пальца Трекбара?
Я не могу настроить размер большого пальца 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;