📄 skintabs.pas
字号:
if CanClose
then
begin
I.TabVisible := False;
if FFreeOnClose then I.Free;
if Assigned(FOnAfterClose) then FOnAfterClose(Self);
end;
if CanClose = False
then
begin
GetCursorPos(P);
if Windows.WindowFromPoint(P) <> Self.Handle
then
begin
TspSkinCustomTabSheet(I).ButtonMouseIn := False;
TspSkinCustomTabSheet(I).ButtonMouseDown := False;
DrawTabs(Canvas);
end;
end;
end;
procedure TspSkinPageControl.DrawCloseButton(Cnvs: TCanvas; R: TRect;
I, W, H: Integer);
var
Buffer: TBitMap;
CIndex: Integer;
BtnSkinPicture: TBitMap;
BtnLtPoint, BtnRTPoint, BtnLBPoint, BtnRBPoint: TPoint;
BtnCLRect: TRect;
BSR, ABSR, DBSR, R1: TRect;
CIX, CIY, X, Y, XO, YO: Integer;
ButtonData: TspDataSkinButtonControl;
ButtonR, R2: TRect;
begin
if FIndex = -1
then
begin
X := R.Left;
Y := R.Top + RectHeight(R) div 2 - CLOSE_SIZE div 2;
ButtonR := Rect(X, Y, X + CLOSE_SIZE, Y + CLOSE_SIZE);
CIX := ButtonR.Left + 2;
CIY := ButtonR.Top + 2;
if TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseDown and
TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseIn
then
DrawCloseImage(Cnvs, CIX, CIY, clWhite)
else
if TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseIn
then
begin
DrawCloseImage(Cnvs, CIX, CIY, clWhite)
end
else
begin
DrawCloseImage(Cnvs, CIX, CIY, clBlack);
end;
//
TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := ButtonR;
if TabPosition = tpLeft
then
begin
R1 := TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect;
R2 := Rect(R1.Top, W - R1.Right, R1.Bottom, W - R1.Left);
TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := R2;
end
else
if TabPosition = tpRight
then
begin
R1 := TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect;
R2 := Rect(H - R1.Bottom, R1.Left, H - R1.Top, R1.Right);
TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := R2;
end;
Exit;
end;
if not IsNullRect(CloseButtonRect)
then
begin
if TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseDown and
TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseIn
then
R1 := CloseButtonDownRect
else
if TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseIn
then
R1 := CloseButtonActiveRect
else
R1 := CloseButtonRect;
X := R.Left;
Y := R.Top + RectHeight(R) div 2 - RectHeight(R1) div 2;
ButtonR := Rect(X, Y, X + RectWidth(R1), Y + RectHeight(R1));
if ButtonTransparent
then
begin
Buffer := TBitMap.Create;
Buffer.Width := RectWidth(R1);
Buffer.Height := RectHeight(R1);
Buffer.Canvas.CopyRect(Rect(0, 0, Buffer.Width, Buffer.Height),
Picture.Canvas, R1);
Buffer.Transparent := True;
Buffer.TransparentMode := tmFixed;
Buffer.TransparentColor := ButtonTransparentColor;
Cnvs.Draw(ButtonR.Left, ButtonR.Top, Buffer);
Buffer.Free;
end
else
Cnvs.CopyRect(ButtonR, Picture.Canvas, R1);
//
TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := ButtonR;
if TabPosition = tpLeft
then
begin
R1 := TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect;
R2 := Rect(R1.Top, W - R1.Right, R1.Bottom, W - R1.Left);
TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := R2;
end
else
if TabPosition = tpRight
then
begin
R1 := TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect;
R2 := Rect(H - R1.Bottom, R1.Left, H - R1.Top, R1.Right);
TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := R2;
end;
Exit;
end;
ButtonData := nil;
CIndex := FSD.GetControlIndex('resizetoolbutton');
if CIndex <> -1
then
ButtonData := TspDataSkinButtonControl(FSD.CtrlList[CIndex]);
if ButtonData = nil then Exit;
//
ButtonR := Rect(0, 0, FCloseSize, FCloseSize);
//
Buffer := TBitMap.Create;
Buffer.Width := RectWidth(ButtonR);
Buffer.Height := RectHeight(ButtonR);
//
with ButtonData do
begin
XO := RectWidth(ButtonR) - RectWidth(SkinRect);
YO := RectHeight(ButtonR) - RectHeight(SkinRect);
BtnLTPoint := LTPoint;
BtnRTPoint := Point(RTPoint.X + XO, RTPoint.Y);
BtnLBPoint := Point(LBPoint.X, LBPoint.Y + YO);
BtnRBPoint := Point(RBPoint.X + XO, RBPoint.Y + YO);
BtnClRect := Rect(CLRect.Left, ClRect.Top,
CLRect.Right + XO, ClRect.Bottom + YO);
BtnSkinPicture := TBitMap(SkinData.FActivePictures.Items[ButtonData.PictureIndex]);
BSR := SkinRect;
ABSR := ActiveSkinRect;
DBSR := DownSkinRect;
if IsNullRect(ABSR) then ABSR := BSR;
if IsNullRect(DBSR) then DBSR := ABSR;
//
if TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseDown and
TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseIn
then
begin
CreateSkinImage(LTPoint, RTPoint, LBPoint, RBPoint, CLRect,
BtnLtPoint, BtnRTPoint, BtnLBPoint, BtnRBPoint, BtnCLRect,
Buffer, BtnSkinPicture, DBSR, Buffer.Width, Buffer.Height, True,
LeftStretch, TopStretch, RightStretch, BottomStretch,
StretchEffect, StretchType);
Buffer.Canvas.Font.Color := DownFontColor;
end
else
if TspSkinCustomTabSheet(Self.Pages[I]).ButtonMouseIn
then
begin
CreateSkinImage(LTPoint, RTPoint, LBPoint, RBPoint, CLRect,
BtnLtPoint, BtnRTPoint, BtnLBPoint, BtnRBPoint, BtnCLRect,
Buffer, BtnSkinPicture, ABSR, Buffer.Width, Buffer.Height, True,
LeftStretch, TopStretch, RightStretch, BottomStretch,
StretchEffect, StretchType);
Buffer.Canvas.Font.Color := ActiveFontColor;
end
else
begin
CreateSkinImage(LTPoint, RTPoint, LBPoint, RBPoint, CLRect,
BtnLtPoint, BtnRTPoint, BtnLBPoint, BtnRBPoint, BtnCLRect,
Buffer, BtnSkinPicture, BSR, Buffer.Width, Buffer.Height, True,
LeftStretch, TopStretch, RightStretch, BottomStretch,
StretchEffect, StretchType);
Buffer.Canvas.Font.Color := FontColor;
end;
end;
CIX := Buffer.Width div 2 - 5;
CIY := Buffer.Height div 2 - 5;
DrawCloseImage(Buffer.Canvas, CIX, CIY, Buffer.Canvas.Font.Color);
X := R.Left;
Y := R.Top + RectHeight(R) div 2 - Buffer.Height div 2;
TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := Rect(X, Y,
X + Buffer.Width, Y + Buffer.Height);
if TabPosition = tpLeft
then
begin
R1 := TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect;
R2 := Rect(R1.Top, W - R1.Right, R1.Bottom, W - R1.Left);
TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := R2;
end
else
if TabPosition = tpRight
then
begin
R1 := TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect;
R2 := Rect(H - R1.Bottom, R1.Left, H - R1.Top, R1.Right);
TspSkinCustomTabSheet(Self.Pages[I]).ButtonRect := R2;
end;
Cnvs.Draw(X, Y, Buffer);
Buffer.Free;
end;
procedure TspSkinPageControl.SetShowCloseButtons(Value: Boolean);
begin
if FShowCloseButtons <> Value
then
begin
FShowCloseButtons := Value;
if FShowCloseButtons
then
begin
if TabPosition in [tpTop, tpBottom]
then
FTempImages.Width := FTempImages.Width + FCloseSize
else
FTempImages.Height := FTempImages.Height + FCloseSize
end
else
begin
if TabPosition in [tpTop, tpBottom]
then
FTempImages.Width := FTempImages.Width - FCloseSize
else
FTempImages.Height := FTempImages.Height - FCloseSize;
end;
end;
Invalidate;
end;
procedure TspSkinPageControl.SetImages(value: TCustomImageList);
begin
if FImages <> nil then
begin
if TabPosition in [tpTop, tpBottom] then
FTempImages.Width := FTempImages.Width - FImages.Width
else
FTempImages.Height := FTempImages.Height - FImages.Height;
end;
FImages := Value;
if FImages <> nil then
begin
if TabPosition in [tpTop, tpBottom] then
FTempImages.Width := FTempImages.Width + FImages.Width
else // tpLeft, tpRight
FTempImages.Height := FTempImages.Height + FImages.Height;
end;
Invalidate;
end;
procedure TspSkinPageControl.WMCHECKPARENTBG;
begin
if TabsBGTransparent then RePaint;
end;
procedure TspSkinPageControl.DrawEmptyBackGround(DC: HDC);
var
C: TCanvas;
TabSheetBG, Buffer2: TBitMap;
X, Y, XCnt, YCnt, w, h, w1, h1: Integer;
begin
if (Width <= 0) or (Height <=0) then Exit;
C := TCanvas.Create;
C.Handle := DC;
if BGPictureIndex <> -1
then
begin
TabSheetBG := TBitMap(FSD.FActivePictures.Items[BGPictureIndex]);
if StretchEffect and (Width > 0) and (Height > 0)
then
begin
case StretchType of
spstFull:
begin
C.StretchDraw(Rect(0, 0, Width, Height), TabSheetBG);
end;
spstVert:
begin
Buffer2 := TBitMap.Create;
Buffer2.Width := Width;
Buffer2.Height := TabSheetBG.Height;
Buffer2.Canvas.StretchDraw(Rect(0, 0, Buffer2.Width, Buffer2.Height), TabSheetBG);
YCnt := Height div Buffer2.Height;
for Y := 0 to YCnt do
C.Draw(0, Y * Buffer2.Height, Buffer2);
Buffer2.Free;
end;
spstHorz:
begin
Buffer2 := TBitMap.Create;
Buffer2.Width := TabSheetBG.Width;
Buffer2.Height := Height;
Buffer2.Canvas.StretchDraw(Rect(0, 0, Buffer2.Width, Buffer2.Height), TabSheetBG);
XCnt := Width div Buffer2.Width;
for X := 0 to XCnt do
C.Draw(X * Buffer2.Width, 0, Buffer2);
Buffer2.Free;
end;
end;
end
else
if (Width > 0) and (Height > 0)
then
begin
XCnt := Width div TabSheetBG.Width;
YCnt := Height div TabSheetBG.Height;
for X := 0 to XCnt do
for Y := 0 to YCnt do
C.Draw(X * TabSheetBG.Width, Y * TabSheetBG.Height, TabSheetBG);
end;
end
else
begin
w1 := Width;
h1 := Height;
TabSheetBG := TBitMap.Create;
TabSheetBG.Width := RectWidth(ClRect);
TabSheetBG.Height := RectHeight(ClRect);
TabSheetBG.Canvas.CopyRect(Rect(0, 0, TabSheetBG.Width, TabSheetBG.Height),
Picture.Canvas,
Rect(SkinRect.Left + ClRect.Left, SkinRect.Top + ClRect.Top,
SkinRect.Left + ClRect.Right,
SkinRect.Top + ClRect.Bottom));
if StretchEffect and (Width > 0) and (Height > 0)
then
begin
case StretchType of
spstFull:
begin
C.StretchDraw(Rect(0, 0, Width, Height), TabSheetBG);
end;
spstVert:
begin
Buffer2 := TBitMap.Create;
Buffer2.Width := Width;
Buffer2.Height := TabSheetBG.Height;
Buffer2.Canvas.StretchDraw(Rect(0, 0, Buffer2.Width, Buffer2.Height), TabSheetBG);
YCnt := Height div Buffer2.Height;
for Y := 0 to YCnt do
C.Draw(0, Y * Buffer2.Height, Buffer2);
Buffer2.Free;
end;
spstHorz:
begin
Buffer2 := TBitMap.Create;
Buffer2.Width := TabSheetBG.Width;
Buffer2.Height := Height;
Buffer2.Canvas.StretchDraw(Rect(0, 0, Buffer2.Width, Buffer2.Height), TabSheetBG);
XCnt := Width div Buffer2.Width;
for X := 0 to XCnt do
C.Draw(X * Buffer2.Width, 0, Buffer2);
Buffer2.Free;
end;
end;
end
else
begin
w := RectWidth(ClRect);
h := RectHeight(ClRect);
XCnt := w1 div w;
YCnt := h1 div h;
for X := 0 to XCnt do
for Y := 0 to YCnt do
C.Draw(X * w, Y * h, TabSheetBG);
end;
TabSheetBG.Free;
end;
C.Free;
end;
procedure TspSkinPageControl.SetTabsBGTransparent(Value: Boolean);
begin
if FTabsBGTransparent <> Value
then
begin
FTabsBGTransparent := Value;
Invalidate;
end;
end;
procedure TspSkinPageControl.UpDateTabs;
begin
if FIndex <> -1
then
begin
if TabHeight <= 0
then
SetItemSize(TabWidth, RectHeight(TabRect))
else
SetItemSize(TabWidth, TabHeight);
end
else
begin
if TabHeight <= 0
then
SetItemSize(TabWidth, FDefaultItemHeight)
else
SetItemSize(TabWidth, TabHeight);
end;
if MultiLine and (FSkinUpDown <> nil)
then
HideSkinUpDown;
ReAlign;
end;
procedure TspSkinPageControl.CMMouseLeave;
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -