📄 tflattabcontrolunit.pas
字号:
unit TFlatTabControlUnit;
interface
{$I Version.inc}
uses
Windows, Messages, Classes, Controls, Forms, Graphics, StdCtrls, SysUtils, FlatUtilitys;
type
TFlatTabControl = class(TCustomControl)
private
FUseAdvColors: Boolean;
FAdvColorBorder: TAdvColors;
FTabPosition: TFlatTabPosition;
FTabs: TStrings;
FTabsRect: TList;
FTabHeight: Integer;
FTabSpacing: Integer;
FActiveTab: Integer;
FUnselectedColor: TColor;
FBorderColor: TColor;
FOnTabChanged: TNotifyEvent;
procedure SetTabs (Value: TStrings);
procedure SetTabPosition (Value: TFlatTabPosition);
procedure SetTabHeight (Value: Integer);
procedure SetTabSpacing (Value: Integer);
procedure SetActiveTab (Value: Integer);
procedure SetColors (Index: Integer; Value: TColor);
procedure SetAdvColors (Index: Integer; Value: TAdvColors);
procedure SetUseAdvColors (Value: Boolean);
procedure SetTabRect;
procedure CMDialogChar (var Message: TCMDialogChar); message CM_DIALOGCHAR;
procedure CMEnabledChanged (var Message: TMessage); message CM_ENABLEDCHANGED;
procedure WMSize (var Message: TWMSize); message WM_SIZE;
procedure CMSysColorChange (var Message: TMessage); message CM_SYSCOLORCHANGE;
procedure CMParentColorChanged (var Message: TWMNoParams); message CM_PARENTCOLORCHANGED;
procedure CMDesignHitTest(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST;
protected
procedure CalcAdvColors;
procedure MouseDown (Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure Loaded; override;
procedure Paint; override;
public
constructor Create (AOwner: TComponent); override;
destructor Destroy; override;
published
property Align;
property ColorBorder: TColor index 0 read FBorderColor write SetColors default $008396A0;
property ColorUnselectedTab: TColor index 1 read FUnselectedColor write SetColors default $00996633;
property AdvColorBorder: TAdvColors index 0 read FAdvColorBorder write SetAdvColors default 50;
property UseAdvColors: Boolean read FUseAdvColors write SetUseAdvColors default false;
property Tabs: TStrings read FTabs write SetTabs;
property TabHeight: Integer read FTabHeight write SetTabHeight default 16;
property TabSpacing: Integer read FTabSpacing write SetTabSpacing default 4;
property TabPosition: TFlatTabPosition read FTabPosition write SetTabPosition default tpTop;
property ActiveTab: Integer read FActiveTab write SetActiveTab default 0;
property Font;
property Color;
property ParentColor;
property Enabled;
property Visible;
property Cursor;
property ParentShowHint;
property ParentFont;
property ShowHint;
property OnEnter;
property OnExit;
property OnMouseMove;
property OnMouseDown;
property OnMouseUp;
property OnTabChanged: TNotifyEvent read FOnTabChanged write FOnTabChanged;
{$IFDEF D4CB4}
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
property OnEndDock;
property OnStartDock;
{$ENDIF}
end;
implementation
procedure TFlatTabControl.CMDesignHitTest(var Message: TCMDesignHitTest);
begin
case FTabPosition of
tpTop:
if PtInRect(Rect(ClientRect.Left, ClientRect.Top, ClientRect.Right, ClientRect.Top + FTabHeight + 1), Point(message.XPos, message.YPos)) then
Message.Result := 1
else
Message.Result := 0;
tpBottom:
if PtInRect(Rect(ClientRect.Left, ClientRect.Bottom - FTabHeight, ClientRect.Right, ClientRect.Bottom), Point(message.XPos, message.YPos)) then
Message.Result := 1
else
Message.Result := 0;
end;
end;
constructor TFlatTabControl.Create (AOwner: TComponent);
begin
inherited;
ControlStyle := ControlStyle + [csAcceptsControls, csOpaque];
SetBounds(Left, Top, 289, 193);
FTabs := TStringList.Create;
FTabsRect := TList.Create;
FTabHeight := 16;
FTabSpacing := 4;
FTabPosition := tpTop;
FActiveTab := 0;
Color := $00E1EAEB;
FBorderColor := $008396A0;
FUnselectedColor := $00996633;
ParentColor := true;
ParentFont := true;
FUseAdvColors := false;
FAdvColorBorder := 50;
end;
destructor TFlatTabControl.Destroy;
begin
FTabs.Free;
FTabsRect.Free;
inherited;
end;
procedure TFlatTabControl.CalcAdvColors;
begin
if FUseAdvColors then
begin
FBorderColor := CalcAdvancedColor(Color, FBorderColor, FAdvColorBorder, darken);
end;
end;
procedure TFlatTabControl.SetAdvColors (Index: Integer; Value: TAdvColors);
begin
case Index of
0: FAdvColorBorder := Value;
end;
CalcAdvColors;
Invalidate;
end;
procedure TFlatTabControl.SetUseAdvColors (Value: Boolean);
begin
if Value <> FUseAdvColors then
begin
FUseAdvColors := Value;
ParentColor := Value;
CalcAdvColors;
Invalidate;
end;
end;
procedure TFlatTabControl.CMSysColorChange (var Message: TMessage);
begin
if FUseAdvColors then
begin
ParentColor := True;
CalcAdvColors;
end;
Invalidate;
end;
procedure TFlatTabControl.CMParentColorChanged (var Message: TWMNoParams);
begin
inherited;
if FUseAdvColors then
begin
ParentColor := True;
CalcAdvColors;
end;
Invalidate;
end;
procedure TFlatTabControl.Loaded;
begin
inherited;
SetTabRect;
Invalidate;
end;
procedure TFlatTabControl.WMSize (var Message: TWMSize);
begin
inherited;
SetTabRect;
Invalidate;
end;
procedure TFlatTabControl.CMEnabledChanged (var Message: TMessage);
begin
inherited;
Invalidate;
end;
procedure TFlatTabControl.SetTabPosition (Value: TFlatTabPosition);
var
I: Integer;
begin
if Value <> FTabPosition then
begin
for I := 0 to ControlCount - 1 do // reposition client-controls
begin
if Value = tpTop then
Controls[I].Top := Controls[I].Top + TabHeight
else
Controls[I].Top := Controls[I].Top - TabHeight;
end;
FTabPosition := Value;
SetTabRect;
Invalidate;
end;
end;
procedure TFlatTabControl.SetActiveTab (Value: Integer);
begin
if FTabs <> nil then
begin
if Value > (FTabs.Count - 1) then
Value := FTabs.Count - 1
else
if Value < 0 then
Value := 0;
FActiveTab := Value;
if Assigned(FOnTabChanged) then
FOnTabChanged(Self);
Invalidate;
end
else
FActiveTab := 0;
if csDesigning in ComponentState then
if (GetParentForm(self) <> nil) and (GetParentForm(self).Designer <> nil) then
GetParentForm(self).Designer.Modified;
end;
procedure TFlatTabControl.SetColors (Index: Integer; Value: TColor);
begin
case Index of
0: FBorderColor := Value;
1: FUnselectedColor := Value;
end;
Invalidate;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -