📄 bsskintabs.pas
字号:
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;
if ActivePage <> nil then ActivePage.Invalidate;
end;
procedure TbsSkinPageControl.Change2;
begin
if FSkinUpDown <> nil
then FSkinUpDown.Position := GetPosition;
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;
Self.TabStretchEffect := TabStretchEffect;
Self.ShowFocus := ShowFocus;
Self.FocusOffsetX := FocusOffsetX;
Self.FocusOffsetY := FocusOffsetY;
Self.LeftStretch := LeftStretch;
Self.TopStretch := TopStretch;
Self.RightStretch := RightStretch;
Self.BottomStretch := BottomStretch;
Self.StretchEffect := StretchEffect;
Self.StretchType := StretchType;
end;
end;
procedure TbsSkinPageControl.ChangeSkinData;
var
UpDownVisible: Boolean;
begin
GetSkinData;
//
if FIndex <> -1
then
begin
if FUseSkinFont
then
begin
Font.Name := FontName;
Font.Height := FontHeight;
Font.Style := FontStyle;
end
else
Font.Assign(FDefaultFont);
if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
then
Font.Charset := SkinData.ResourceStrData.CharSet
else
Font.CharSet := DefaultFont.CharSet;
Font.Color := FontColor;
if TabHeight <= 0
then
SetItemSize(TabWidth, RectHeight(TabRect))
else
SetItemSize(TabWidth, TabHeight);
end
else
begin
Font.Assign(FDefaultFont);
if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
then
Font.Charset := SkinData.ResourceStrData.CharSet;
if TabHeight <= 0
then
SetItemSize(TabWidth, FDefaultItemHeight)
else
SetItemSize(TabWidth, TabHeight);
end;
//
Change2;
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;
NewClRect, DR, R: TRect;
TBGOffX, TBGOffY, X, Y, XCnt, YCnt, w, h, rw, rh, XO, YO: Integer;
NewLTPoint, NewRTPoint, NewLBPoint, NewRBPoint: TPoint;
LB, RB, TB, BB, ClB: TBitMap;
R1, R2: TRect;
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);
// 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),
LeftStretch, TopStretch, RightStretch, BottomStretch);
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 TbsSkinPageControl.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 TbsSkinPageControl.WMPaint(var Msg: TWMPaint);
begin
if (PageCount = 0)
then
begin
PaintHandler(Msg);
end
else
inherited;
end;
procedure TbsSkinPageControl.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
if (PageCount = 0)
then
begin
GetSkinData;
if FIndex = -1
then
inherited
else
DrawEmptyBackGround(Msg.DC);
end
else
Msg.Result := 1;
end;
procedure TbsSkinPageControl.WndProc(var Message:TMessage);
var
TOff, LOff, Roff, BOff: Integer;
begin
if Message.Msg = TCM_ADJUSTRECT
then
begin
inherited WndProc(Message);
if FIndex <> -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) and
not (csDesigning in ComponentState)
then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -