📄 bsskintabs.pas
字号:
Font.Height := 14;
FSkinUpDown := nil;
FSkinDataName := 'tab';
FDefaultFont := TFont.Create;
FDefaultFont.Name := 'Arial';
FDefaultFont.Style := [];
FDefaultFont.Color := clBtnText;
FDefaultFont.Height := 14;
FDefaultItemHeight := 20;
FActiveTab := -1;
FOldActiveTab := -1;
FActiveTabIndex := -1;
FOldActiveTabIndex := -1;
FUseSkinFont := True;
end;
destructor TbsSkinPageControl.Destroy;
begin
FDefaultFont.Free;
inherited Destroy;
end;
procedure TbsSkinPageControl.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 TbsSkinPageControl.CMMouseLeave;
var
R: TRect;
begin
if (FOldActiveTabIndex <> - 1) and (FOldActiveTabIndex <> TabIndex) and
(FOldActiveTabIndex < PageCount)
then
begin
R := GetItemRect(FOldActiveTabIndex);
DrawTab(FOldActiveTab, R, False, False, Canvas);
FOldActiveTabIndex := -1;
FOldActiveTab := -1;
end;
if (FActiveTabIndex <> - 1) and (FActiveTabIndex <> TabIndex) and
(FActiveTabIndex < PageCount)
then
begin
R := GetItemRect(FActiveTabIndex);
DrawTab(FActiveTab, R, False, False, Canvas);
FActiveTabIndex := -1;
FActiveTab := -1;
end;
end;
procedure TbsSkinPageControl.MouseDown;
begin
inherited;
if (Button = mbLeft) and not (csDesigning in ComponentState)
then
TestActive(X, Y);
end;
procedure TbsSkinPageControl.MouseMove;
begin
inherited;
if not (csDesigning in ComponentState)
then
TestActive(X, Y);
end;
procedure TbsSkinPageControl.SetDefaultItemHeight;
begin
FDefaultItemHeight := Value;
if FIndex = -1
then
begin
SetItemSize(TabWidth, FDefaultItemHeight);
Change;
ReAlign;
end;
end;
procedure TbsSkinPageControl.SetDefaultFont;
begin
FDefaultFont.Assign(Value);
end;
procedure TbsSkinPageControl.OnUpDownChange(Sender: TObject);
begin
FSkinUpDown.Max := GetInVisibleItemCount;
SendMessage(Handle, WM_HSCROLL,
MakeWParam(SB_THUMBPOSITION, FSkinUpDown.Position), 0);
end;
function TbsSkinPageControl.GetPosition: Integer;
var
i, j: Integer;
R: TRect;
begin
j := 0;
for i := 0 to PageCount - 1 do
begin
R := GetItemRect(i);
if R.Right <= 0 then inc(j);
end;
Result := j;
end;
function TbsSkinPageControl.GetInVisibleItemCount;
var
i, j, k: Integer;
R: TRect;
Limit: Integer;
begin
if FSkinUpDown = nil
then
Limit := Width - 3
else
Limit := Width - FSkinUpDown.Width - 3;
j := 0;
k := -1;
for i := 0 to PageCount - 1 do
if Pages[i].TabVisible
then
begin
inc(k);
R := GetItemRect(k);
if (R.Right > Limit) or (R.Right <= 0)
then inc(j);
end;
Result := j;
end;
procedure TbsSkinPageControl.CheckScroll;
var
Wnd: HWND;
InVCount: Integer;
begin
Wnd := FindWindowEx(Handle, 0, 'msctls_updown32', nil);
if Wnd <> 0 then DestroyWindow(Wnd);
InVCount := GetInVisibleItemCount;
if ((InVCount = 0) or MultiLine) and (FSkinUpDown <> nil)
then
HideSkinUpDown
else
if (InVCount > 0) and (FSkinUpDown = nil)
then
ShowSkinUpDown;
if FSkinUpDown <> nil
then
begin
FSkinUpDown.Max := InVCount;
FSkinUpDown.Left := Width - FSkinUpDown.Width;
if TabPosition = tpTop
then
FSkinUpDown.Top := 0
else
FSkinUpDown.Top := Height - FSkinUpDown.Height;
end;
end;
procedure TbsSkinPageControl.ShowSkinUpDown;
begin
FSkinUpDown := TbsSkinUpDown.Create(Self);
FSkinUpDown.Parent := Self;
FSkinUpDown.Width := FDefaultItemHeight * 2;
FSkinUpDown.Height := FDefaultItemHeight;
FSkinUpDown.Min := 0;
FSkinUpDown.Max := GetInVisibleItemCount;
FSkinUpDown.Position := GetPosition;
FSkinUpDown.Increment := 1;
FSkinUpDown.OnChange := OnUpDownChange;
FSkinUpDown.Left := Width - FSkinUpDown.Width;
if TabPosition = tpTop
then
FSkinUpDown.Top := 0
else
FSkinUpDown.Top := Height - FSkinUpDown.Height;
FSkinUpDown.SkinDataName := UpDown;
FSkinUpDown.SkinData := SkinData;
FSkinUpDown.Visible := True;
end;
procedure TbsSkinPageControl.HideSkinUpDown;
begin
FSkinUpDown.Free;
FSkinUpDown := nil;
end;
procedure TbsSkinPageControl.WMHSCROLL;
begin
inherited;
RePaint;
end;
procedure TbsSkinPageControl.WMSize;
begin
GetSkinData;
inherited;
end;
procedure TbsSkinPageControl.Change;
begin
if FSkinUpDown <> nil
then FSkinUpDown.Position := GetPosition;
inherited;
Invalidate;
end;
procedure TbsSkinPageControl.GetSkinData;
begin
BGPictureIndex := -1;
if FSD = nil
then
begin
FIndex := -1;
Exit;
end;
if FSD.Empty
then
FIndex := -1
else
FIndex := FSD.GetControlIndex(FSkinDataName);
//
if FIndex <> -1
then
if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinTabControl
then
with TbsDataSkinTabControl(FSD.CtrlList.Items[FIndex]) do
begin
if (PictureIndex <> -1) and (PictureIndex < FSD.FActivePictures.Count)
then
Picture := TBitMap(FSD.FActivePictures.Items[PictureIndex])
else
Picture := nil;
Self.SkinRect := SkinRect;
Self.ClRect := ClRect;
Self.TabRect := TabRect;
if IsNullRect(ActiveTabRect)
then
Self.ActiveTabRect := TabRect
else
Self.ActiveTabRect := ActiveTabRect;
if IsNullRect(FocusTabRect)
then
Self.FocusTabRect := ActiveTabRect
else
Self.FocusTabRect := FocusTabRect;
//
Self.TabsBGRect := TabsBGRect;
Self.LTPoint := LTPoint;
Self.RTPoint := RTPoint;
Self.LBPoint := LBPoint;
Self.RBPoint := RBPoint;
Self.TabLeftOffset := TabLeftOffset;
Self.TabRightOffset := TabRightOffset;
//
Self.FontName := FontName;
Self.FontColor := FontColor;
Self.ActiveFontColor := ActiveFontColor;
Self.FocusFontColor := FocusFontColor;
Self.FontStyle := FontStyle;
Self.FontHeight := FontHeight;
Self.UpDown := UpDown;
Self.BGPictureIndex := BGPictureIndex;
Self.MouseInTabRect := MouseInTabRect;
Self.MouseInFontColor := MouseInFontColor;
end;
end;
procedure TbsSkinPageControl.ChangeSkinData;
begin
GetSkinData;
//
if FIndex <> -1
then
begin
if FUseSkinFont
then
begin
Font.Name := FontName;
Font.Height := FontHeight;
Font.Style := FontStyle;
Font.CharSet := DefaultFont.CharSet;
end
else
Font.Assign(FDefaultFont);
Font.Color := FontColor;
if TabHeight <= 0
then
SetItemSize(TabWidth, RectHeight(TabRect))
else
SetItemSize(TabWidth, TabHeight);
end
else
begin
Font.Assign(FDefaultFont);
if TabHeight <= 0
then
SetItemSize(TabWidth, FDefaultItemHeight)
else
SetItemSize(TabWidth, TabHeight);
end;
//
Change;
ReAlign;
if FSkinUpDown <> nil
then
begin
HideSkinUpDown;
CheckScroll;
end;
if ActivePage <> nil then ActivePage.RePaint;
end;
procedure TbsSkinPageControl.SetSkinData;
begin
FSD := Value;
if (FSD <> nil) then
if not FSD.Empty and not (csDesigning in ComponentState)
then
ChangeSkinData;
end;
procedure TbsSkinPageControl.Notification;
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
end;
procedure TbsSkinPageControl.PaintDefaultWindow;
var
R: TRect;
begin
with Cnvs do
begin
Brush.Color := clBtnFace;
FillRect(ClientRect);
R := Self.DisplayRect;
InflateRect(R, 1, 1);
Frame3D(Cnvs, R, clBtnShadow, clBtnShadow, 1);
end;
end;
procedure TbsSkinPageControl.PaintSkinWindow;
var
TOff, LOff, Roff, BOff: Integer;
DR, R: TRect;
TBGOffX, TBGOffY, X, Y, XCnt, YCnt, w, h, rw, rh, XO, YO: Integer;
NewLTPoint, NewRTPoint, NewLBPoint, NewRBPoint: TPoint;
begin
TOff := ClRect.Top;
LOff := ClRect.Left;
ROff := RectWidth(SkinRect) - ClRect.Right;
BOff := RectHeight(SkinRect) - ClRect.Bottom;
DR := 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);
// Draw tabs BG
if not IsNullRect(TabsBGRect)
then
begin
if TabPosition = tpLeft
then
begin
TBGOffY := 0;
TBGOffX := 0;
rw := R.Left;
rh := Height;
end
else
if TabPosition = tpRight
then
begin
TBGOffY := 0;
TBGOffX := R.Right;
rw := Width - R.Right;
rh := Height;
end
else
if TabPosition = tpTop
then
begin
TBGOffX := 0;
TBGOffY := 0;
rh := R.Top;
rw := Width;
end
else
begin
TBGOffX := 0;
TBGOffY := R.Bottom;
rh := Height - R.Bottom;
rw := Width;
end;
w := RectWidth(TabsBGRect);
h := RectHeight(TabsBGRect);
XCnt := rw div w;
YCnt := rh div h;
for X := 0 to XCnt do
for Y := 0 to YCnt do
begin
if X * w + w > rw then XO := X * w + w - rw else XO := 0;
if Y * h + h > rh then YO := Y * h + h - rh else YO := 0;
Cnvs.CopyRect(Rect(TBGOffX + X * w, TBGOffY + Y * h,
TBGOffX + X * w + w - XO, TBGOffY + Y * h + h - YO),
Picture.Canvas,
Rect(TabsBGRect.Left, TabsBGRect.Top,
TabsBGRect.Right - XO, TabsBGRect.Bottom - YO));
end;
end;
// Draw frame around displayrect
// draw lines
w := RTPoint.X - LTPoint.X;
XCnt := (NewRTPoint.X - NewLTPoint.X) div w;
for X := 0 to XCnt do
begin
if NewLTPoint.X + X * w + w > NewRTPoint.X
then XO := NewLTPoint.X + X * w + w - NewRTPoint.X else XO := 0;
Cnvs.CopyRect(Rect(R.Left + NewLTPoint.X + X * w, R.Top,
R.Left + NewLTPoint.X + X * w + w - XO, R.Top + TOff),
Picture.Canvas,
Rect(SkinRect.Left + LTPoint.X, SkinRect.Top,
SkinRect.Left + RTPoint.X - XO, SkinRect.Top + TOff));
end;
w := RBPoint.X - LBPoint.X;
XCnt := (NewRBPoint.X - NewLBPoint.X) div w;
for X := 0 to XCnt do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -