📄 bsskintabs.~pas
字号:
begin
Brush.Color := clBtnFace;
FillRect(ClientRect);
R := Self.DisplayRect;
InflateRect(R, 1, 1);
Frame3D(Cnvs, R, clBtnShadow, clBtnShadow, 1);
end;
end;
procedure TbsSkinTabControl.PaintSkinWindow;
var
TOff, LOff, Roff, BOff: Integer;
NewClRect, DR, R: TRect;
TBGOffX, TBGOffY, X, Y, XCnt, YCnt, w, h, rw, rh, XO, YO, w1, h1: Integer;
NewLTPoint, NewRTPoint, NewLBPoint, NewRBPoint: TPoint;
B, LB, RB, TB, BB, ClB: TBitMap;
SaveIndex: Integer;
begin
GetSkinData;
TOff := ClRect.Top;
LOff := ClRect.Left;
ROff := RectWidth(SkinRect) - ClRect.Right;
BOff := RectHeight(SkinRect) - ClRect.Bottom;
DR := Self.DisplayRect;
R := Rect(DR.Left - LOff, DR.Top - TOff, DR.Right + ROff, DR.Bottom + BOff);
XO := RectWidth(R) - RectWidth(SkinRect);
YO := RectHeight(R) - RectHeight(SkinRect);
NewLTPoint := LTPoint;
NewRTPoint := Point(RTPoint.X + XO, RTPoint.Y);
NewLBPoint := Point(LBPoint.X, LBPoint.Y + YO);
NewRBPoint := Point(RBPoint.X + XO, RBPoint.Y + YO);
NewCLRect := Rect(ClRect.Left, ClRect.Top, ClRect.Right + XO, ClRect.Bottom + YO);
// DrawBG
if BGPictureIndex <> -1
then
begin
B := TBitMap(FSD.FActivePictures.Items[BGPictureIndex]);
if (Width > 0) and (Height > 0)
then
begin
XCnt := Width div B.Width;
YCnt := Height div B.Height;
for X := 0 to XCnt do
for Y := 0 to YCnt do
Cnvs.Draw(X * B.Width, Y * B.Height, B);
end;
Exit;
end;
w := RectWidth(ClRect);
h := RectHeight(ClRect);
w1 := Width;
h1 := Height;
XCnt := w1 div w;
YCnt := h1 div h;
Clb := TBitMap.Create;
Clb.Width := w;
Clb.Height := h;
Clb.Canvas.CopyRect(Rect(0, 0, w, h), Picture.Canvas,
Rect(SkinRect.Left + ClRect.Left, SkinRect.Top + ClRect.Top,
SkinRect.Left + ClRect.Right,
SkinRect.Top + ClRect.Bottom));
SaveIndex := SaveDC(Cnvs.Handle);
IntersectClipRect(Cnvs.Handle, DR.Left, DR.Top, DR.Right, DR.Bottom);
for X := 0 to XCnt do
for Y := 0 to YCnt do
begin
Cnvs.Draw(X * w, Y * h, Clb);
end;
Clb.Free;
RestoreDC(Cnvs.Handle, SaveIndex);
// Draw frame around displayrect
LB := TBitMap.Create;
TB := TBitMap.Create;
RB := TBitMap.Create;
BB := TBitMap.Create;
CreateSkinBorderImages(LtPoint, RTPoint, LBPoint, RBPoint, ClRect,
NewLTPoint, NewRTPoint, NewLBPoint, NewRBPoint, NewClRect,
LB, TB, RB, BB, Picture, SkinRect, RectWidth(R), RectHeight(R), False, False, False, False);
Cnvs.Draw(R.Left, R.Top, TB);
Cnvs.Draw(R.Left, R.Top + TB.Height, LB);
Cnvs.Draw(R.Left + RectWidth(R) - RB.Width, R.Top + TB.Height, RB);
Cnvs.Draw(R.Left, R.Top + RectHeight(R) - BB.Height, BB);
LB.Free;
TB.Free;
RB.Free;
BB.Free;
end;
procedure TbsSkinTabControl.Loaded;
begin
inherited Loaded;
if FIndex = -1
then
begin
if TabHeight <= 0
then
SetItemSize(TabWidth, FDefaultItemHeight)
else
SetItemSize(TabWidth, TabHeight);
Change2;
ReAlign;
end;
end;
procedure TbsSkinTabControl.PaintBG;
var
C: TCanvas;
TabSheetBG: TBitMap;
X, Y, XCnt, YCnt, w, h, w1, h1: Integer;
R: TRect;
begin
if (Width <= 0) or (Height <=0) then Exit;
GetSkinData;
C := TCanvas.Create;
C.Handle := DC;
if (FSD <> nil) and (not FSD.Empty) and
(FIndex <> -1) and (BGPictureIndex <> -1)
then
begin
TabSheetBG := TBitMap(FSD.FActivePictures.Items[BGPictureIndex]);
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;
C.Free;
Exit;
end;
w1 := Width;
h1 := Height;
if FIndex <> -1
then
begin
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));
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);
TabSheetBG.Free;
end
else
with C do
begin
Brush.Color := clbtnface;
FillRect(Rect(0, 0, w1, h1));
end;
C.Free;
end;
procedure TbsSkinTabControl.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
Msg.Result := 1;
end;
procedure TbsSkinTabControl.WndProc(var Message:TMessage);
var
TOff, LOff, Roff, BOff: Integer;
begin
if Message.Msg = TCM_ADJUSTRECT
then
begin
inherited WndProc(Message);
TOff := 0;
LOff := 0;
ROff := 0;
BOff := 0;
if (FIndex <> -1) and (BGPictureIndex = -1)
then
begin
TOff := ClRect.Top;
LOff := ClRect.Left;
ROff := RectWidth(SkinRect) - ClRect.Right;
BOff := RectHeight(SkinRect) - ClRect.Bottom;
end;
case TabPosition of
tpLeft:
if FIndex <> -1
then
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left + LOff - 4;
PRect(Message.LParam)^.Right := ClientWidth - ROff;
{$IFNDEF VER130}
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 4 + TOff;
{$ELSE}
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 6 + TOff;
{$ENDIF}
PRect(Message.LParam)^.Bottom := ClientHeight - BOff;
end
else
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left - 3;
PRect(Message.LParam)^.Right := ClientWidth - 1;
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 5;
PRect(Message.LParam)^.Bottom := ClientHeight - 1;
end;
tpRight:
if FIndex <> -1
then
begin
PRect(Message.LParam)^.Left := LOff;
PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right - ROff + 4;
{$IFNDEF VER130}
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 4 + TOff;
{$ELSE}
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 6 + TOff;
{$ENDIF}
PRect(Message.LParam)^.Bottom := ClientHeight - BOff;
end
else
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left - 3;
PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right + 3;
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 5;
PRect(Message.LParam)^.Bottom := ClientHeight - 1;
end;
tpTop:
if FIndex <> -1
then
begin
PRect(Message.LParam)^.Left := LOff;
PRect(Message.LParam)^.Right := ClientWidth - ROff;
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 6 + TOff;
PRect(Message.LParam)^.Bottom := ClientHeight - BOff;
end
else
begin
PRect(Message.LParam)^.Left := 1;
PRect(Message.LParam)^.Right := ClientWidth - 1;
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 5;
PRect(Message.LParam)^.Bottom := ClientHeight - 1;
end;
tpBottom:
if FIndex <> -1
then
begin
PRect(Message.LParam)^.Left := LOff;
PRect(Message.LParam)^.Right := ClientWidth - ROff;
{$IFNDEF VER130}
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 4 + TOff;
{$ELSE}
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 6 + TOff;
{$ENDIF}
PRect(Message.LParam)^.Bottom := PRect(Message.LParam)^.Bottom + 4 - BOff;
end
else
begin
PRect(Message.LParam)^.Left := 1;
PRect(Message.LParam)^.Right := ClientWidth - 1;
PRect(Message.LParam)^.Top := 1;
PRect(Message.LParam)^.Bottom := PRect(Message.LParam)^.Bottom + 3;
end;
end;
end
else
if Message.Msg = TCM_GETITEMRECT
then
begin
inherited WndProc(Message);
if Style = tsTabs
then
case TabPosition of
tpLeft:
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left - 2;
PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right - 2;
end;
tpRight:
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left + 2;
PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right + 2;
end;
tpTop:
begin
if not MultiLine
then
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left - 2;
PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right - 2;
end;
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 2;
PRect(Message.LParam)^.Bottom := PRect(Message.LParam)^.Bottom - 2;
end;
tpBottom:
begin
if not MultiLine
then
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left - 2;
PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right - 2;
end;
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top + 2;
PRect(Message.LParam)^.Bottom := PRect(Message.LParam)^.Bottom + 2;
end;
end;
end
else
inherited WndProc(Message);
if (Message.Msg = WM_SIZE) and (not MultiLine)
then
begin
CheckScroll;
end;
end;
function TbsSkinTabControl.GetItemRect(index: integer): TRect;
var
R: TRect;
begin
SendMessage(Handle, TCM_GETITEMRECT, index, Integer(@R));
Result := R;
end;
procedure TbsSkinTabControl.SetItemSize;
begin
SendMessage(Handle, TCM_SETITEMSIZE, 0, MakeLParam(AWidth, AHeight));
end;
procedure TbsSkinTabControl.PaintWindow(DC: HDC);
var
SaveIndex: Integer;
C: TCanvas;
begin
GetSkinData;
SaveIndex := SaveDC(DC);
try
C := TCanvas.Create;
C.Handle := DC;
if FIndex = -1
then
PaintDefaultWindow(C)
else
PaintSkinWindow(C);
DrawTabs(C);
C.Handle := 0;
C.Free;
finally
RestoreDC(DC, SaveIndex);
end;
end;
procedure TbsSkinTabControl.DrawTabs;
var
i, j: integer;
IR: TRect;
w, h, XCnt, YCnt, X, Y, TOff, LOff, Roff, BOff: Integer;
R, DR: TRect;
Buffer, Buffer2: TBitMap;
begin
//
if Tabs.Count = 0 then Exit;
if FIndex = -1
then
begin
for i := 0 to Tabs.Count-1 do
begin
R := GetItemRect(i);
DrawTab(i, R, i = TabIndex, i = FActiveTab, Cnvs);
end;
Exit;
end;
//
GetSkinData;
TOff := ClRect.Top;
LOff := ClRect.Left;
ROff := RectWidth(SkinRect) - ClRect.Right;
BOff := RectHeight(SkinRect) - ClRect.Bottom;
Self.GetClientRect;
//
DR := ClientRect;
SendMessage(Handle, TCM_ADJUSTRECT, 0, Integer(@DR));
Inc(DR.Top, 2);
//
// DR := Self.GetDisplayRect;
R := Rect(DR.Left - LOff, DR.Top - TOff, DR.Right + ROff, DR.Bottom + BOff);
Buffer := TBitMap.Create;
case TabPosition of
tpTop:
begin
Buffer.Width := Width;
Buffer.Height := R.Top;
end;
tpBottom:
begin
Buffer.Width := Width;
Buffer.Height := Height - R.Bottom;
end;
tpRight:
begin
Buffer.Width := Width - R.Right;
Buffer.Height := Height;
end;
tpLeft:
begin
Buffer.Width := R.Left;
Buffer.Height := Height;
end;
end;
// draw tabsbg
w := RectWidth(TabsBGRect);
h := RectHeight(TabsBGRect);
XCnt := Buffer.Width div w;
YCnt := Buffer.Height div h;
Buffer2 := TBitMap.Create;
Buffer2.Width := w;
Buffer2.Height := h;
Buffer2.Canvas.CopyRect(Rect(0, 0, w, h), Picture.Canvas, TabsBGRect);
for X := 0 to XCnt do
for Y := 0 to YCnt do
begin
Buffer.Canvas.Draw(X * w, Y * h, Buffer2);
end;
Buffer2.Free;
//
j := -1;
for i := 0 to Tabs.Count - 1 do
begin
IR := GetItemRect(i);
case TabPosition of
tpTop:
begin
end;
tpBottom:
begin
OffsetRect(IR, 0, -R.Bottom);
end;
tpRight:
begin
OffsetRect(IR, - R.Right, 0);
end;
tpLeft:
begin
end;
end;
DrawTab(i, IR, i = TabIndex, i = FActiveTab, Buffer.Canvas);
end;
case TabPosition of
tpTop:
begin
Cnvs.Draw(0, 0, Buffer);
end;
tpBottom:
begin
Cnvs.Draw(0, Height - Buffer.Height, Buffer);
end;
tpRight:
begin
Cnvs.Draw(Width - Buffer.Width, 0, Buf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -