또 다른 방법은 PageControl 또는 TabControl의 OnDrawTab 이벤트를 사용하는 것입니다. 다시 그리기를 트리거하는 메커니즘이 필요하지만 탭의 캔버스에 직접 이미지를 그리거나 별표 또는 순환 점을 일련의 점으로 전환 할 수 있습니다. 이 접근 방식은 많은 유연성을 제공합니다. 다음은 정적 그라디언트로 탭을 그리는 것 이상의 작업을 수행하지 않는 OnTabDraw 이벤트입니다. 그것을 출발점으로 사용할 수 있습니다.
procedure TabDraw(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);
const
TCM_GETITEMRECT = $130A;
type
TRIVERTEX = packed record
X, Y: DWORD;
Red, Green, Blue, Alpha: Word;
end;
var
vert: array[0..1] of TRIVERTEX;
gRect: GRADIENT_RECT;
iHeight,
iWidth: Integer;
begin
with FTabControl.Canvas do begin
if Active then begin
Brush.Color := TAB_ACTIVECOLOUR;
FillRect(Rect);
end
else begin
vert[0] .x := Rect.Left;
vert[0] .y := Rect.Top;
vert[0] .Red := $ab00;
vert[0] .Green := $ab00;
vert[0] .Blue := $ab00;
vert[0] .Alpha := $ab00;
vert[1] .x := Rect.Right;
vert[1] .y := Rect.Bottom;
vert[1] .Red := $ef00;
vert[1] .Green := $ef00;
vert[1] .Blue := $fe00;
vert[1] .Alpha := $0000;
gRect.UpperLeft := 0;
gRect.LowerRight := 1;
GradientFill(FTabControl.Canvas.Handle, @vert, 2, @gRect, 1, GRADIENT_FILL_RECT_V);
end;
iHeight := (Rect.Bottom - Rect.Top) - TextHeight(FTabControl.Tabs[TabIndex]);
if not Active then
Inc(iHeight, 4);
iWidth := (Rect.Right - Rect.Left) - TextWidth(FTabControl.Tabs[TabIndex]);
Brush.Style := bsClear;
TextOut(Rect.Left + (iWidth div 2), Rect.Top + (iHeight div 2), FTabControl.Tabs[TabIndex]);
end;
end;
GIF는 '매우 간단하지 않습니다'. 왜 탭의 캡션 끝에 별표를 두는 것이 좋을까요? –
켄 이완 ... 각 질문이 다른 질문과 연결될 것으로 예상했기 때문에 분명히 어딘가에서 시작해야했습니다! 어쨌든, 나는 이것을하기위한 좋은 방법에 대한 제안을 찾고 있습니다. 나는 원래의 아이디어가 마음에 들었지만 파이프와 백 슬래시가 작동하지 않는 것처럼 작동하지 않을 것 같은 느낌이 들었습니다. 지금 어떤 방향으로 향해야 할지를 놓치지 않았습니다. – boileau
@AndreasRejbrand 나는 뭔가 움직이기를 원합니다. 어쨌든 저장되지 않은 변경 표시기로 별표를 사용하고 있으므로 생각하지 않아도됩니다. – boileau