📄 bsskintabs.~pas
字号:
{*******************************************************************}
{ }
{ Almediadev Visual Component Library }
{ BusinessSkinForm }
{ Version 4.27 }
{ }
{ Copyright (c) 2000-2006 Almediadev }
{ ALL RIGHTS RESERVED }
{ }
{ Home: http://www.almdev.com }
{ Support: support@almdev.com }
{ }
{*******************************************************************}
unit bsSkinTabs;
{$P+,S-,W-,R-}
{$WARNINGS OFF}
{$HINTS OFF}
interface
uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, StdCtrls,
CommCtrl, ComCtrls, ExtCtrls, bsSkinData, bsSkinBoxCtrls;
type
TbsSkinCustomTabSheet = class(TTabSheet)
protected
procedure WMSize(var Msg: TWMSize); message WM_SIZE;
procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd); message WM_ERASEBKGND;
procedure CreateParams(var Params: TCreateParams); override;
public
procedure PaintBG(DC: HDC);
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
TbsSkinTabSheet = class(TbsSkinCustomTabSheet)
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
end;
TbsSkinPageControl = class(TPageControl)
private
FActiveTab, FOldActiveTab: Integer;
FActiveTabIndex, FOldActiveTabIndex: Integer;
function GetPosition: Integer;
function GetInVisibleItemCount: Integer;
procedure OnUpDownChange(Sender: TObject);
procedure DrawTabs(Cnvs: TCanvas);
procedure DrawTab(TI: Integer; const Rct: TRect; Active, MouseIn: Boolean; Cnvs: TCanvas);
function GetItemRect(index: integer): TRect;
procedure SetItemSize(AWidth, AHeight: integer);
procedure CheckScroll;
procedure ShowSkinUpDown;
procedure HideSkinUpDown;
procedure TestActive(X, Y: Integer);
protected
//
FSD: TbsSkinData;
FSkinDataName: String;
FIndex: Integer;
FSkinUpDown: TbsSkinUpDown;
FDefaultFont: TFont;
FUseSkinFont: Boolean;
FDefaultItemHeight: Integer;
procedure SetDefaultItemHeight(Value: Integer);
procedure SetDefaultFont(Value: TFont);
procedure Change; override;
procedure Change2;
procedure GetSkinData;
//
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
procedure SetSkinData(Value: TbsSkinData);
procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd); message WM_ERASEBKGND;
procedure WMHSCROLL(var Msg: TWMEraseBkGnd); message WM_HSCROLL;
procedure WMSize(var Msg: TWMSize); message WM_SIZE;
procedure PaintDefaultWindow(Cnvs: TCanvas);
procedure PaintSkinWindow(Cnvs: TCanvas);
procedure PaintWindow(DC: HDC); override;
procedure WndProc(var Message:TMessage); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
public
//
Picture: TBitMap;
SkinRect, ClRect, TabRect,
ActiveTabRect, FocusTabRect, MouseInTabRect: TRect;
TabsBGRect: TRect;
LTPoint, RTPoint, LBPoint, RBPoint: TPoint;
TabLeftOffset, TabRightOffset: Integer;
FontName: String;
FontStyle: TFontStyles;
FontHeight: Integer;
FontColor, ActiveFontColor, FocusFontColor, MouseInFontColor: TColor;
UpDown: String;
BGPictureIndex: Integer;
TabStretchEffect: Boolean;
ShowFocus: Boolean;
FocusOffsetX, FocusOffsetY: Integer;
//
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ChangeSkinData;
procedure Loaded; override;
procedure UpDateTabs;
published
property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
property UseSkinFont: Boolean read FUseSkinFont write FUseSkinFont;
property DefaultItemHeight: Integer read FDefaultItemHeight write SetDefaultItemHeight;
property SkinData: TbsSkinData read FSD write SetSkinData;
property SkinDataName: String read FSkinDataName write FSkinDataName;
property Color;
property ActivePage;
property Align;
property Anchors;
property BiDiMode;
property Constraints;
property DockSite;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property Font;
property HotTrack;
property Images;
property OwnerDraw;
property ParentBiDiMode;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property RaggedRight;
property ScrollOpposite;
property ShowHint;
property TabHeight;
property TabOrder;
property TabPosition;
property TabStop;
property TabWidth;
property Visible;
property OnChange;
property OnChanging;
property OnDockDrop;
property OnDockOver;
property OnDragDrop;
property OnDragOver;
property OnDrawTab;
property OnEndDock;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnGetImageIndex;
property OnGetSiteInfo;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnResize;
property OnStartDock;
property OnStartDrag;
property OnUnDock;
end;
TbsSkinTabControl = class(TTabControl)
private
FromWMPaint: Boolean;
FOldTop, FOldBottom: Integer;
FActiveTab, FOldActiveTab: Integer;
function GetPosition: Integer;
function GetInVisibleItemCount: Integer;
procedure OnUpDownChange(Sender: TObject);
procedure DrawTabs(Cnvs: TCanvas);
procedure DrawTab(TI: Integer; const Rct: TRect; Active, MouseIn: Boolean; Cnvs: TCanvas);
function GetItemRect(index: integer): TRect;
procedure SetItemSize(AWidth, AHeight: integer);
procedure CheckScroll;
procedure ShowSkinUpDown;
procedure HideSkinUpDown;
procedure TestActive(X, Y: Integer);
protected
//
FSD: TbsSkinData;
FSkinDataName: String;
FIndex: Integer;
FSkinUpDown: TbsSkinUpDown;
FDefaultFont: TFont;
FUseSkinFont: Boolean;
FDefaultItemHeight: Integer;
procedure SetDefaultItemHeight(Value: Integer);
procedure SetDefaultFont(Value: TFont);
procedure WMSize(var Msg: TWMSize); message WM_SIZE;
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
procedure GetSkinData;
//
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
procedure SetSkinData(Value: TbsSkinData);
procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd); message WM_ERASEBKGND;
procedure WMHSCROLL(var Msg: TWMEraseBkGnd); message WM_HSCROLL;
procedure PaintDefaultWindow(Cnvs: TCanvas);
procedure PaintSkinWindow(Cnvs: TCanvas);
procedure PaintWindow(DC: HDC); override;
procedure WndProc(var Message:TMessage); override;
procedure Change; override;
procedure Change2;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
public
Picture: TBitMap;
SkinRect, ClRect, TabRect,
ActiveTabRect, FocusTabRect, MouseInTabRect: TRect;
TabsBGRect: TRect;
LTPoint, RTPoint, LBPoint, RBPoint: TPoint;
TabLeftOffset, TabRightOffset: Integer;
FontName: String;
FontStyle: TFontStyles;
FontHeight: Integer;
FontColor, ActiveFontColor, FocusFontColor, MouseInFontColor: TColor;
UpDown: String;
BGPictureIndex: Integer;
TabStretchEffect: Boolean;
ShowFocus: Boolean;
FocusOffsetX, FocusOffsetY: Integer;
//
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ChangeSkinData;
procedure Loaded; override;
procedure UpDateTabs;
//
procedure PaintBG(DC: HDC);
//
published
property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
property UseSkinFont: Boolean read FUseSkinFont write FUseSkinFont;
property DefaultItemHeight: Integer read FDefaultItemHeight write SetDefaultItemHeight;
property SkinData: TbsSkinData read FSD write SetSkinData;
property SkinDataName: String read FSkinDataName write FSkinDataName;
property Color;
property Align;
property Anchors;
property BiDiMode;
property Constraints;
property DockSite;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property Font;
property HotTrack;
property Images;
property OwnerDraw;
property ParentBiDiMode;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property RaggedRight;
property ScrollOpposite;
property ShowHint;
property TabHeight;
property TabOrder;
property TabPosition;
property TabStop;
property TabWidth;
property Visible;
property OnChange;
property OnChanging;
property OnDockDrop;
property OnDockOver;
property OnDragDrop;
property OnDragOver;
property OnDrawTab;
property OnEndDock;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnGetImageIndex;
property OnGetSiteInfo;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnResize;
property OnStartDock;
property OnStartDrag;
property OnUnDock;
end;
implementation
uses Consts, ComStrs, bsUtils, ImgList, BusinessSkinForm, bsEffects;
procedure DrawRotate90_1(Cnvs: TCanvas; B: TBitMap; X, Y: Integer);
var
B1, B2: TbsEffectBmp;
begin
B1 := TbsEffectBmp.CreateFromhWnd(B.Handle);
B2 := TbsEffectBmp.Create(B1.Height, B1.Width);
B1.Rotate90_1(B2);
B2.Draw(Cnvs.Handle, X, Y);
B1.Free;
B2.Free;
end;
procedure DrawFlipVert(B: TBitMap);
var
B1, B2: TbsEffectBmp;
begin
B1 := TbsEffectBmp.CreateFromhWnd(B.Handle);
B2 := TbsEffectBmp.Create(B1.Width, B1.Height);
B1.FlipVert(B2);
B2.Draw(B.Canvas.Handle, 0, 0);
B1.Free;
B2.Free;
end;
procedure DrawRotate90_2(Cnvs: TCanvas; B: TBitMap; X, Y: Integer);
var
B1, B2: TbsEffectBmp;
begin
B1 := TbsEffectBmp.CreateFromhWnd(B.Handle);
B2 := TbsEffectBmp.Create(B1.Height, B1.Width);
B1.Rotate90_2(B2);
B2.Draw(Cnvs.Handle, X, Y);
B1.Free;
B2.Free;
end;
procedure DrawTabGlyphAndText(Cnvs: TCanvas; W, H: Integer; S: String;
IM: TCustomImageList; IMIndex: Integer;
AEnabled: Boolean);
var
R, TR: TRect;
GX, GY, GW, GH, TW, TH: Integer;
begin
R := Rect(0, 0, 0, 0);
DrawText(Cnvs.Handle, PChar(S), Length(S), R, DT_CALCRECT);
TW := RectWidth(R) + 2;
TH := RectHeight(R);
GW := IM.Width;
GH := IM.Height;
GX := W div 2 - (GW + TW + 2) div 2;
GY := H div 2 - GH div 2;
TR.Left := GX + GW + 2;
TR.Top := H div 2 - TH div 2;
TR.Right := TR.Left + TW;
TR.Bottom := TR.Top + TH;
DrawText(Cnvs.Handle, PChar(S), Length(S), TR, DT_CENTER);
IM.Draw(Cnvs, GX, GY, IMIndex, AEnabled);
end;
constructor TbsSkinCustomTabSheet.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Align := alClient;
ControlStyle := ControlStyle + [csAcceptsControls, csNoDesignVisible];
Visible := False;
end;
procedure TbsSkinCustomTabSheet.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params.WindowClass do
Style := Style and not (CS_HREDRAW or CS_VREDRAW);
end;
destructor TbsSkinCustomTabSheet.Destroy;
begin
inherited Destroy;
end;
procedure TbsSkinCustomTabSheet.WMEraseBkGnd;
begin
PaintBG(Msg.DC);
end;
procedure TbsSkinCustomTabSheet.WMSize;
begin
inherited;
RePaint;
end;
procedure TbsSkinCustomTabSheet.PaintBG;
var
C: TCanvas;
TabSheetBG: TBitMap;
PC: TbsSkinPageControl;
X, Y, XCnt, YCnt, w, h, w1, h1: Integer;
begin
if (Width <= 0) or (Height <=0) then Exit;
PC := TbsSkinPageControl(Parent);
if PC = nil then Exit;
PC.GetSkinData;
C := TCanvas.Create;
C.Handle := DC;
if (PC.FSD <> nil) and (not PC.FSD.Empty) and
(PC.FIndex <> -1) and (PC.BGPictureIndex <> -1)
then
begin
TabSheetBG := TBitMap(PC.FSD.FActivePictures.Items[PC.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 PC.FIndex <> -1
then
with PC do
begin
TabSheetBG := TBitMap.Create;
TabSheetBG.Width := RectWidth(ClRect);
TabSheetBG.Height := RectHeight(ClRect);
TabSheetBG.Canvas.CopyRect(Rect(0, 0, TabSheetBG.Width, TabSheetBG.Height),
PC.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;
{TTabSheetes}
constructor TbsSkinTabSheet.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
end;
destructor TbsSkinTabSheet.Destroy;
begin
inherited Destroy;
end;
procedure TbsSkinTabSheet.Notification(AComponent: TComponent; Operation: TOperation);
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -