📄 xppages.pas
字号:
// call the DrawItem method
procedure TxpPageControl.CNDrawItem (var Msg : TWMDrawItem);
var
State: TOwnerDrawState;
begin
with Msg.DrawItemStruct^ do
begin
//State := TOwnerDrawState (WordRec (LongRec (itemState).Lo).Lo);
//!!
FCanvas.Handle := hDC;
FCanvas.Font := Font;
FCanvas.Brush := Brush;
if integer (itemID) >= 0 then
DrawItem (itemID, rcItem, State)
else
FCanvas.FillRect (rcItem);
FCanvas.Handle := 0
end;
end;
// default DrawItem method
procedure TxpPageControl.DrawItem (Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
if Assigned(FOnDrawItem) then
FOnDrawItem (Self, Index, FCanvas, Rect, State)
else begin
//FCanvas.FillRect (Rect);
GradientFillRect (FCanvas, Rect, clWhite, RGB (220,220,220), fdVerticalFromCenter, (Rect.Bottom - Rect.Top) div 2);
FCanvas.Brush.Style := BSCLEAR;
if odSelected in State then
FCanvas.TextOut (Rect.Left + 16, Rect.Top + (Rect.Bottom - Rect.Top - FCanvas.TextHeight ('A')) div 2, Tabs[Index])
else
FCanvas.TextOut (Rect.Left + 12, Rect.Top + (Rect.Bottom - Rect.Top - FCanvas.TextHeight ('A')) div 2, Tabs[Index])
end
end;
procedure TxpPageControl.WMAdjasment (var Msg : TMessage);
begin
inherited;
if Msg.WParam = 0 then
begin
InflateRect(PRect(Msg.LParam)^, 3, 3);
Dec(PRect(Msg.LParam)^.Top, 1);
end;
end;
procedure TxpPageControl.WMNCPaint (var Message : TWMNCPaint);
var
NCCanvas : TCanvas;
begin
inherited;
{NCCanvas := TCanvas.Create;
try
NCCanvas.Handle := GetWindowDC (Handle);
NCCanvas.Brush.Color := clRed;
NCCanvas.Brush.Style := bsClear;
NCCanvas.Pen.Color := clSilver;
NCCanvas.Rectangle (0, 30, Width-1, Height-1);
finally
NCCanvas.Free;
end;}
end;
procedure TxpPageControl.DrawHotTrackTab (ATabIndex : Integer; AHotTrack : Boolean);
var
ItemRect : TRect;
DrawRect : TRect;
StartColor : TColor;
EndColor : TColor;
begin
if SendMessage (Handle, TCM_GETITEMRECT, ATabIndex, LongInt (@ItemRect)) <> 0 then
begin
DrawRect := ItemRect;
case TabPosition of
tpTop: begin
DrawRect.Left := ItemRect.Left + 2;
DrawRect.Right := ItemRect.Right - 3;
DrawRect.Bottom := ItemRect.Top + 1;
if AHotTrack then
begin
StartColor := $2C8BE6;
EndColor := $3CC7FF;
end
else
begin
StartColor := FBorderColor;
EndColor := MakeDarkColor ((Pages[ATabIndex] as TxpTabSheet).Color, 5);
end;
end;
tpBottom: begin
DrawRect.Top := ItemRect.Bottom - 3;
DrawRect.Bottom := ItemRect.Bottom - 2;
DrawRect.Left := ItemRect.Left + 2;
DrawRect.Right := ItemRect.Right - 3;
if AHotTrack then
begin
StartColor := $3CC7FF;
EndColor := $2C8BE6;
end
else
begin
StartColor := MakeDarkColor ((Pages[ATabIndex] as TxpTabSheet).Color, 20);
EndColor := FBorderColor;
end;
end;
tpLeft: begin
DrawRect.Left := ItemRect.Left;
DrawRect.Top := ItemRect.Top+2;
DrawRect.Bottom := ItemRect.Bottom - 3;
DrawRect.Right := ItemRect.Left+1;
if AHotTrack then
begin
StartColor := $3CC7FF;
EndColor := $2C8BE6;
end
else
begin
StartColor := FBorderColor;
EndColor := MakeDarkColor ((Pages[ATabIndex] as TxpTabSheet).Color, 20);
end;
end;
tpRight: begin
DrawRect.Left := ItemRect.Right-1;
DrawRect.Top := ItemRect.Top+2;
DrawRect.Bottom := ItemRect.Bottom - 3;
DrawRect.Right := ItemRect.Right;
if AHotTrack then
begin
StartColor := $3CC7FF;
EndColor := $2C8BE6;
end
else
begin
StartColor := FBorderColor;
EndColor := MakeDarkColor ((Pages[ATabIndex] as TxpTabSheet).Color, 20);
end;
end;
end;
FCanvas.Handle := GetWindowDC (Handle);
case TabPosition of
tpTop, tpBottom:
begin
FCanvas.Pen.Color := StartColor;
FCanvas.MoveTo (DrawRect.Left, DrawRect.Top );
FCanvas.LineTo (DrawRect.Right, DrawRect.Top );
FCanvas.Pen.Color := EndColor;
FCanvas.MoveTo (DrawRect.Left, DrawRect.Bottom);
FCanvas.LineTo (DrawRect.Right, DrawRect.Bottom);
end;
tpLeft,tpRight:
begin
FCanvas.Pen.Color := StartColor;
FCanvas.MoveTo (DrawRect.Left, DrawRect.Top );
FCanvas.LineTo (DrawRect.Left, DrawRect.Bottom);
FCanvas.Pen.Color := EndColor;
FCanvas.MoveTo (DrawRect.Right, DrawRect.Top);
FCanvas.LineTo (DrawRect.Right, DrawRect.Bottom);
end;
end;
end;
end;
procedure TxpPageControl.DrawItemInside (AIndex : Integer; ACanvas : TCanvas; ARect : TRect);
var
dX : Integer;
ACaption : String;
AFormat : Integer;
DrawRect : TRect;
begin
ACanvas.Brush.Style := BSCLEAR;
ACanvas.Font.Assign (Self.Pages[AIndex].Font);
If Assigned (FImageList) then dX := FImageList.Width + 6 else dX := 0;
DrawRect := ARect;
InflateRect (DrawRect, -2, -2);
DrawRect.Left := DrawRect.Left + dX;
ACaption := Self.Pages[AIndex].Caption;
AFormat := DT_VCENTER or DT_END_ELLIPSIS or DT_SINGLELINE;
case FTabTextAlignment of
taLeftJustify: AFormat := AFormat or DT_LEFT;
taRightJustify: AFormat := AFormat or DT_RIGHT;
taCenter: AFormat := AFormat or DT_CENTER;
end;
ACanvas.Font.Color := MakeDarkColor ( (TxpTabSheet(Self.Pages[AIndex]).Color), 30);
OffsetRect (DrawRect, 1, 1);
DrawText (ACanvas.Handle, PChar (ACaption), Length(ACaption), DrawRect, AFormat);
ACanvas.Font.Color := Self.Pages[AIndex].Font.Color;
OffsetRect (DrawRect, -1,-1);
DrawText (ACanvas.Handle, PChar (ACaption), Length(ACaption), DrawRect, AFormat);
if Assigned (FImageList) then
begin
FImageList.Draw (ACanvas, ARect.Left + 3,
(ARect.Top + ARect.Bottom - FImageList.Height) div 2,
(Self.Pages[AIndex] as TxpTabSheet).ImageIndex);
end;
end;
//============================================================================//
//===================== Tabs drawing procedures =============================//
//============================================================================//
//====================== Draw top tabs =============================//
procedure TxpPageControl.DrawTopTab (TabRect : TRect; ACanvas : TCanvas; AIndex, AVisibleIndex : Integer);
var
AActiveTab : Boolean;
ATabColor : TColor;
begin
Dec (TabRect.Bottom,2);
AActiveTab := (SendMessage (Handle, TCM_GETCURSEL, 0, 0) = AVisibleIndex);
ATabColor := (Self.Pages [AIndex] as TxpTabSheet).Color;
if AActiveTab then
begin
Dec (TabRect.Top, 2);
Dec (TabRect.Left, 2);
Inc (TabRect.Right, 1);
end
else
begin
Dec (TabRect.Right);
Dec (TabRect.Bottom);
ATabColor := MakeDarkColor (ATabColor, 5);
end;
Inc (TabRect.Bottom, 1);
ACanvas.Brush.Color := ATabColor;
ACanvas.Pen.Color := FBorderColor;
ACanvas.Rectangle (TabRect.Left, TabRect.Top + 6, TabRect.Right, TabRect.Bottom);
ACanvas.RoundRect (TabRect.Left, TabRect.Top, TabRect.Right, TabRect.Bottom - 7, 6, 6);
ACanvas.FillRect (Rect (TabRect.Left+1, TabRect.Top + 5, TabRect.Right-1, TabRect.Bottom));
if AActiveTab then
begin
ACanvas.Brush.Color := ATabColor;
ACanvas.Pen.Color := ATabColor;
ACanvas.Rectangle (TabRect.Left+1, TabRect.Bottom-1, TabRect.Right-1, TabRect.Bottom+2);
if HotTrack then
begin
FCanvas.Pen.Color := $2C8BE6;
FCanvas.MoveTo (TabRect.Left + 2, TabRect.Top );
FCanvas.LineTo (TabRect.Right - 2, TabRect.Top );
FCanvas.Pen.Color := $3CC7FF;
FCanvas.MoveTo (TabRect.Left + 2, TabRect.Top + 1);
FCanvas.LineTo (TabRect.Right - 2, TabRect.Top + 1);
end;
end
else
begin
//Draw tab vertical right shadow line
ACanvas.Pen.Color := MakeDarkColor (ATabColor, 20);
ACanvas.Brush.Color := ATabColor;
ACanvas.MoveTo (TabRect.Right-2, TabRect.Top+2);
ACanvas.LineTo (TabRect.Right-2, TabRect.Bottom-1);
ACanvas.Pen.Color := MakeDarkColor (ATabColor, 10);
ACanvas.MoveTo (TabRect.Right-3, TabRect.Top+4);
ACanvas.LineTo (TabRect.Right-3, TabRect.Bottom-2);
//Draw tab horizontal bottom shadow line
ACanvas.Pen.Color := MakeDarkColor (ATabColor, 20);
ACanvas.Brush.Color := ATabColor;
ACanvas.MoveTo (TabRect.Left+2, TabRect.Bottom-1);
ACanvas.LineTo (TabRect.Right-2, TabRect.Bottom-1);
ACanvas.Pen.Color := MakeDarkColor (ATabColor, 10);
ACanvas.MoveTo (TabRect.Left + 3, TabRect.Bottom - 2);
ACanvas.LineTo (TabRect.Right-3, TabRect.Bottom-2);
end;
//Draw text and image
DrawItemInside (AIndex, ACanvas, TabRect);
end;
//====================== Draw bottom tabs =============================//
procedure TxpPageControl.DrawBottomTab (TabRect : TRect; ACanvas : TCanvas; AIndex, AVisibleIndex : Integer);
var
AActiveTab : Boolean;
ATabColor : TColor;
begin
Dec (TabRect.Bottom,2);
AActiveTab := (SendMessage (Handle, TCM_GETCURSEL, 0, 0) = AVisibleIndex);
ATabColor := (Self.Pages [AIndex] as TxpTabSheet).Color;
if AActiveTab then
begin
Inc (TabRect.Bottom, 1);
Dec (TabRect.Left, 2);
Inc (TabRect.Right, 1);
end
else
begin
Dec (TabRect.Right);
Inc (TabRect.Top);
ATabColor := MakeDarkColor (ATabColor, 5);
end;
Inc (TabRect.Bottom, 1);
ACanvas.Brush.Color := ATabColor;
ACanvas.Pen.Color := FBorderColor;
ACanvas.Rectangle (TabRect.Left, TabRect.Top, TabRect.Right, TabRect.Bottom - 6);
ACanvas.RoundRect (TabRect.Left, TabRect.Top+6, TabRect.Right, TabRect.Bottom, 6, 6);
ACanvas.FillRect (Rect (TabRect.Left+1, TabRect.Top+6, TabRect.Right-1, TabRect.Bottom-3));
if AActiveTab then
begin
ACanvas.Brush.Color := ATabColor;
ACanvas.Pen.Color := ATabColor;
ACanvas.Rectangle (TabRect.Left+1, TabRect.Top-1, TabRect.Right-1, TabRect.Top+2);
if HotTrack then
begin
FCanvas.Pen.Color := $2C8BE6;
FCanvas.MoveTo (TabRect.Left + 2, TabRect.Bottom -1);
FCanvas.LineTo (TabRect.Right - 2, TabRect.Bottom -1);
FCanvas.Pen.Color := $3CC7FF;
FCanvas.MoveTo (TabRect.Left + 2, TabRect.Bottom);
FCanvas.LineTo (TabRect.Right - 2, TabRect.Bottom);
end;
end
else
begin
//Draw tab vertical right shadow line
ACanvas.Pen.Color := MakeDarkColor (ATabColor, 20);
ACanvas.Brush.Color := ATabColor;
ACanvas.MoveTo (TabRect.Right-2, TabRect.Top+2);
ACanvas.LineTo (TabRect.Right-2, TabRect.Bottom-2);
ACanvas.Pen.Color := MakeDarkColor (ATabColor, 10);
ACanvas.MoveTo (TabRect.Right-3, TabRect.Top+4);
ACanvas.LineTo (TabRect.Right-3, TabRect.Bottom-3);
//Draw tab horizontal bottom shadow line
ACanvas.Pen.Color := MakeDarkColor (ATabColor, 20);
ACanvas.Brush.Color := ATabColor;
ACanvas.MoveTo (TabRect.Left+2, TabRect.Bottom-2);
ACanvas.LineTo (TabRect.Right-2, TabRect.Bottom-2);
ACanvas.Pen.Color := MakeDarkColor (ATabColor, 10);
ACanvas.MoveTo (TabRect.Left + 3, TabRect.Bottom - 3);
ACanvas.LineTo (TabRect.Right-3, TabRect.Bottom-3);
end;
//Draw text and image
DrawItemInside (AIndex, ACanvas, TabRect);
end;
//====================== Draw left tabs =============================//
procedure TxpPageControl.DrawLeftTab (TabRect : TRect; ACanvas : TCanvas; AIndex, AVisibleIndex : Integer);
var
AActiveTab : Boolean;
ATabColor : TColor;
begin
Dec (TabRect.Bottom,2);
AActiveTab := (SendMessage (Handle, TCM_GETCURSEL, 0, 0) = AVisibleIndex);
ATabColor := (Self.Pages [AIndex] as TxpTabSheet).Color;
if AActiveTab then
begin
Dec (TabRect.Left, 2);
Dec (TabRect.Top, 1);
Inc (TabRect.Bottom, 1);
end
else
begin
Dec (TabRect.Right);
ATabColor := MakeDarkColor (ATabColor, 5);
end;
Inc (TabRect.Bottom, 1);
ACanvas.Brush.Color := ATabColor;
ACanvas.Pen.Color := FBorderColor;
ACanvas.Rectangle (TabRect.Left+6, TabRect.Top, TabRect.Right, TabRect.Bottom);
ACanvas.RoundRect (TabRect.Left, TabRect.Top, TabRect.Left+8, TabRect.Bottom, 6, 6);
ACanvas.FillRect (Rect (TabRect.Left+5, TabRect.Top + 1, TabRect.Right-1, TabRect.Bottom-1));
if AActiveTab then
begin
if HotTrack then
begin
FCanvas.Pen.Color := $2C8BE6;
FCanvas.MoveTo (TabRect.Left, TabRect.Top + 2);
FCanvas.LineTo (TabRect.Left, TabRect.Bottom -2);
FCanvas.Pen.Color := $3CC7FF;
FCanvas.MoveTo (TabRect.Left + 1, TabRect.Top + 1);
FCanvas.LineTo (TabRect.Left + 1, TabRect.Bottom - 1);
end;
end
else
begin
//Draw tab vertical right shadow line
ACanvas.Pen.Color := MakeDarkColor (ATabColor, 20);
ACanvas.Brush.Color := ATabColor;
ACanvas.MoveTo (TabRect.Right-2, TabRect.Top+2);
ACanvas.LineTo (TabRect.Right-2, TabRect.Bottom-1);
ACanvas.Pen.Color := MakeDarkColor (ATabColor, 10);
ACanvas.MoveTo (TabRect.Right-3, TabRect.Top+4);
ACanvas.LineTo (TabRect.Right-3, TabRect.Bottom-2);
//Draw tab horizontal bottom shadow line
ACanvas.Pen.Color := MakeDarkColor (ATabColor, 20);
ACanvas.Brush.Color := ATabColor;
ACanvas.MoveTo (TabRect.Left+2, TabRect.Bottom-2);
ACanvas.LineTo (TabRect.Right-2, TabRect.Bottom-2);
ACanvas.Pen.Color := MakeDarkColor (ATabColor, 10);
ACanvas.MoveTo (TabRect.Left + 3, TabRect.Bottom - 3);
ACanvas.LineTo (TabRect.Right-3, TabRect.Bottom-4);
end;
//Draw text and image
DrawItemInside (AIndex, ACanvas, TabRect);
end;
//====================== Draw right tabs =============================//
procedure TxpPageControl.DrawRightTab (TabRect : TRect; ACanvas : TCanvas; AIndex, AVisibleIndex : Integer);
var
AActiveTab : Boolean;
ATabColor : TColor;
begin
Dec (TabRect.Bottom,2);
AActiveTab := (SendMessage (Handle, TCM_GETCURSEL, 0, 0) = AVisibleIndex);
ATabColor := (Self.Pages [AIndex] as TxpTabSheet).Color;
if AActiveTab then
begin
Inc (TabRect.Right, 2);
Dec (TabRect.Top, 1);
Inc (TabRect.Bottom, 1);
end
else
begin
Inc (TabRect.Left);
ATabColor := MakeDarkColor (ATabColor, 5);
end;
Inc (TabRect.Bottom, 1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -