트랙볼은 사용자 지정 그리기를 지원하는 네이티브 컨트롤 중 하나입니다. 기본적으로 테마가 활성화되면 컨트롤 그리기의 다양한 측면을 제어 할 수 있습니다. 또는 자신이 드로잉 파트를 추월하는 것을 OS에 알릴 수 있습니다. 사용자 정의 드로도 here에 대해 자세히 알아보십시오.
일부 부품의 크기를 약간만 사용하여 재생하려면 도면을 추월 할 필요가 없습니다. 채널 (움푹 패인 추적 배경) 및 틱을 그리는 것은 VCL입니다. 진드기에는 이미 사용할 수있는 속성이 있습니다. 채널의 경우 사각형을 조금씩 수축시켜 VCL을 대신 사용합니다. 엄지 손가락은 기본 윈도우 절차에 의해 그려지지만, 상관 없습니다. OS는 수정 된 사각형에 엄지 손가락을 그립니다.
아래 예제 (가로 트랙 바용)는 이러한 수정 작업을 수행하기 위해 양식에 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;
@kobik을 :
이 예제는 모습입니다 즉, 침몰 한 사각형 훨씬 얇은 것, 그러나 (기본 크기를 얻을 것이다 엄지 손가락에 아무런 영향을주지 않습니다 ~ 24). –
@Ingo : 스크린 샷에 표시된 스타일을 달성하는 데 아무런 문제가 없습니다. 최신 버전의 Delphi에서는'ShowSelRange'를'false'로 설정하기 만하면됩니다. 자신의 버전에서'TTrackBar.ShowSelRange'를 사용할 수 없다면 단순히 창 스타일'TBS_ENABLESELRANGE'을 제거하십시오. –
첫 번째 스크린 샷의 '원하는 크기'가 두 번째 스크린 샷의 엄지 손가락보다 큽니다. ... –