別の方法として、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