Трекбар — это один из собственных элементов управления, поддерживающих пользовательское рисование. По сути, когда темы включены, вы можете управлять различными аспектами рисования элемента управления или можете сообщить ОС, что вы сами рисуете детали. Подробнее о пользовательском рисовании см. здесь.
Нам не нужно перегонять какой-либо рисунок, чтобы немного поиграть с размерами некоторых деталей. Именно 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;
person
Sertac Akyuz
schedule
19.02.2013
ShowSelRange
вfalse
. ЕслиTTrackBar.ShowSelRange
недоступен в вашей версии, просто удалите стиль окнаTBS_ENABLESELRANGE
. - person Andreas Rejbrand   schedule 19.02.2013