advglowbutton.pas
来自「一个非常棒的控件.做商业软件特别适用.里面的控件涉及面非常的广,有兴趣的话可以下」· PAS 代码 · 共 1,982 行 · 第 1/5 页
PAS
1,982 行
property FocusType: TFocusType read FFocusType write FFocusType default ftBorder;
property HotImages: TImageList read FHotImages write FHotImages;
property HotPicture: TGDIPPicture read FIHotPicture write SetHotPicture;
property MarginVert: integer read FMarginVert write SetMarginVert default 2;
property MarginHorz: integer read FMarginHorz write SetMarginHorz default 2;
property ModalResult: TModalResult read FModalResult write FModalResult default 0;
property OfficeHint: TAdvHintInfo read FOfficeHint write SetOfficeHint;
property ParentFont default true;
property Picture: TGDIPPicture read FIPicture write SetPicture;
property Position: TButtonPosition read FButtonPosition write SetButtonPosition default bpStandalone;
property Rounded: Boolean read FRounded write SetRounded default true;
property ShortCutHint: string read FShortCutHintText write FShortCutHintText;
property ShortCutHintPos: TShortCutHintPos read FShortCutHintPos write FShortCutHintPos default shpTop;
property ShowCaption: Boolean read FShowCaption write SetShowCaption default true;
property ShowDisabled: Boolean read FShowDisabled write SetShowDisabled default true;
property Spacing: Integer read FSpacing write SetSpacing default 2;
property Transparent: Boolean read FTransparent write SetTransparent default false;
property Version: string read GetVersion write SetVersion stored False;
property WordWrap: boolean read FWordWrap write SetWordWrap default true;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property OnClick;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnStartDock;
property OnStartDrag;
property OnMouseDown;
property OnMouseUp;
property OnMouseMove;
property OnKeyDown;
property OnKeyUp;
property OnKeyPress;
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;
TAdvGlowButton = class(TAdvCustomGlowButton)
private
protected
public
property State;
property DroppedDown;
published
property AllowAllUp;
property Appearance;
property Down;
property Enabled;
property GroupIndex;
property Layout;
property Style;
property DropDownButton;
property DropDownPosition;
property DropDownDirection;
property DropDownSplit;
property DropDownMenu;
property OnDropDown;
end;
//---- DB aware version
TDBGlowButtonType = (dbCustom, dbFirst, dbPrior, dbNext, dbLast, dbInsert, dbAppend,
dbDelete, dbEdit, dbPost, dbCancel, dbRefresh);
TDBBDisableControl = (drBOF, drEOF, drReadonly, drNotEditing, drEditing, drEmpty, drEvent);
TDBBDisableControls = set of TDBBDisableControl;
TBeforeActionEvent = procedure (Sender: TObject; var DoAction: Boolean) of object;
TAfterActionEvent = procedure (Sender: TObject; var ShowException: Boolean) of object;
TGetConfirmEvent = procedure (Sender: TObject; var Question: string; var Buttons: TMsgDlgButtons; var HelpCtx: Longint) of object;
TGetEnabledEvent = procedure (Sender: TObject; var Enabled: Boolean) of object;
TDBGlowButtonDataLink = class(TDataLink)
private
FOnEditingChanged: TNotifyEvent;
FOnDataSetChanged: TNotifyEvent;
FOnActiveChanged: TNotifyEvent;
protected
procedure EditingChanged; override;
procedure DataSetChanged; override;
procedure ActiveChanged; override;
public
constructor Create;
property OnEditingChanged: TNotifyEvent
read FOnEditingChanged write FOnEditingChanged;
property OnDataSetChanged: TNotifyEvent
read FOnDataSetChanged write FOnDataSetChanged;
property OnActiveChanged: TNotifyEvent
read FOnActiveChanged write FOnActiveChanged;
end;
TDBAdvGlowButton = class(TAdvCustomGlowButton)
private
FDataLink: TDBGlowButtonDataLink;
FAutoDisable: Boolean;
FDisableControls: TDBBDisableControls;
FOnAfterAction: TAfterActionEvent;
FOnBeforeAction: TBeforeActionEvent;
FDBButtonType: TDBGlowButtonType;
FOnGetConfirm: TGetConfirmEvent;
FOnGetEnabled: TGetEnabledEvent;
FOnEnabledChanged: TNotifyEvent;
FConfirmAction: Boolean;
FConfirmActionString: String;
FInProcUpdateEnabled: Boolean;
procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
procedure OnDataSetEvents(Sender: TObject);
function GetDataSource: TDataSource;
procedure SetDataSource(const Value: TDataSource);
procedure SetDBButtonType(const Value: TDBGlowButtonType);
procedure SetConfirmActionString(const Value: String);
protected
procedure Notification(AComponent: TComponent; AOperation: TOperation); override;
procedure Loaded; override;
procedure CalcDisableReasons;
procedure DoBeforeAction(var DoAction: Boolean); virtual;
procedure DoGetQuestion(var Question: string; var Buttons: TMsgDlgButtons; var HelpCtx: Longint); virtual;
function DoConfirmAction: Boolean; virtual;
procedure DoAction; virtual;
procedure UpdateEnabled; virtual;
procedure LoadGlyph; virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Click; override;
published
property Action;
property Appearance;
property Layout;
property Constraints;
property AutoDisable: Boolean read FAutoDisable write FAutoDisable;
property ConfirmAction: Boolean read FConfirmAction write FConfirmAction;
property ConfirmActionString: String read FConfirmActionString write SetConfirmActionString;
property DataSource: TDataSource read GetDataSource write SetDataSource;
property DBButtonType: TDBGlowButtonType read FDBButtonType write SetDBButtonType;
property DisableControl: TDBBDisableControls read FDisableControls write FDisableControls;
property Enabled;
property OnBeforeAction: TBeforeActionEvent read FOnBeforeAction write FOnBeforeAction;
property OnAfterAction: TAfterActionEvent read FOnAfterAction write FOnAfterAction;
property OnGetConfirm: TGetConfirmEvent read FOnGetConfirm write FOnGetConfirm;
property OnGetEnabled: TGetEnabledEvent read FOnGetEnabled write FOnGetEnabled;
property OnEnabledChanged: TNotifyEvent read FOnEnabledChanged write FOnEnabledChanged;
end;
implementation
uses
{$IFDEF DELPHI6_LVL}
VDBConsts
{$ELSE}
DBConsts
{$ENDIF}
;
const
GDIP_NOWRAP = 4096;
type
TButtonDisplay = (bdNone, bdButton, bdDropDown);
//------------------------------------------------------------------------------
function ColorToARGB(Color: TColor): ARGB;
var
c: TColor;
begin
c := ColorToRGB(Color);
Result := ARGB( $FF000000 or ((DWORD(c) and $FF) shl 16) or ((DWORD(c) and $FF00) or ((DWORD(c) and $ff0000) shr 16)));
end;
//------------------------------------------------------------------------------
procedure DrawGradient(Canvas: TCanvas; FromColor, ToColor: TColor; Steps: Integer; R: TRect; Direction: Boolean);
var
diffr, startr, endr: Integer;
diffg, startg, endg: Integer;
diffb, startb, endb: Integer;
rstepr, rstepg, rstepb, rstepw: Real;
i, stepw: Word;
begin
if Steps = 0 then
Steps := 1;
FromColor := ColorToRGB(FromColor);
ToColor := ColorToRGB(ToColor);
startr := (FromColor and $0000FF);
startg := (FromColor and $00FF00) shr 8;
startb := (FromColor and $FF0000) shr 16;
endr := (ToColor and $0000FF);
endg := (ToColor and $00FF00) shr 8;
endb := (ToColor and $FF0000) shr 16;
diffr := endr - startr;
diffg := endg - startg;
diffb := endb - startb;
rstepr := diffr / steps;
rstepg := diffg / steps;
rstepb := diffb / steps;
if Direction then
rstepw := (R.Right - R.Left) / Steps
else
rstepw := (R.Bottom - R.Top) / Steps;
with Canvas do
begin
for i := 0 to steps - 1 do
begin
endr := startr + Round(rstepr * i);
endg := startg + Round(rstepg * i);
endb := startb + Round(rstepb * i);
stepw := Round(i * rstepw);
Pen.Color := endr + (endg shl 8) + (endb shl 16);
Brush.Color := Pen.Color;
if Direction then
Rectangle(R.Left + stepw, R.Top, R.Left + stepw + Round(rstepw) + 1, R.Bottom)
else
Rectangle(R.Left, R.Top + stepw, R.Right, R.Top + stepw + Round(rstepw) + 1);
end;
end;
end;
//------------------------------------------------------------------------------
function BrightnessColor(Col: TColor; Brightness: integer): TColor; overload;
var
r1,g1,b1: Integer;
begin
Col := ColorToRGB(Col);
r1 := GetRValue(Col);
g1 := GetGValue(Col);
b1 := GetBValue(Col);
if r1 = 0 then
r1 := Max(0,Brightness)
else
r1 := Round( Min(100,(100 + Brightness))/100 * r1 );
if g1 = 0 then
g1 := Max(0,Brightness)
else
g1 := Round( Min(100,(100 + Brightness))/100 * g1 );
if b1 = 0 then
b1 := Max(0,Brightness)
else
b1 := Round( Min(100,(100 + Brightness))/100 * b1 );
Result := RGB(r1,g1,b1);
end;
//------------------------------------------------------------------------------
function BrightnessColor(Col: TColor; BR,BG,BB: integer): TColor; overload;
var
r1,g1,b1: Integer;
begin
Col := Longint(ColorToRGB(Col));
r1 := GetRValue(Col);
g1 := GetGValue(Col);
b1 := GetBValue(Col);
if r1 = 0 then
r1 := Max(0,BR)
else
r1 := Round( Min(100,(100 + BR))/100 * r1 );
if g1 = 0 then
g1 := Max(0,BG)
else
g1 := Round( Min(100,(100 + BG))/100 * g1 );
if b1 = 0 then
b1 := Max(0,BB)
else
b1 := Round( Min(100,(100 + BB))/100 * b1 );
Result := RGB(r1,g1,b1);
end;
//------------------------------------------------------------------------------
function BlendColor(Col1,Col2:TColor; BlendFactor:Integer): TColor;
var
r1,g1,b1: Integer;
r2,g2,b2: Integer;
begin
if BlendFactor >= 100 then
begin
Result := Col1;
Exit;
end;
if BlendFactor <= 0 then
begin
Result := Col2;
Exit;
end;
Col1 := Longint(ColorToRGB(Col1));
r1 := GetRValue(Col1);
g1 := GetGValue(Col1);
b1 := GetBValue(Col1);
Col2 := Longint(ColorToRGB(Col2));
r2 := GetRValue(Col2);
g2 := GetGValue(Col2);
b2 := GetBValue(Col2);
r1 := Round( BlendFactor/100 * r1 + (1 - BlendFactor/100) * r2);
g1 := Round( BlendFactor/100 * g1 + (1 - BlendFactor/100) * g2);
b1 := Round( BlendFactor/100 * b1 + (1 - BlendFactor/100) * b2);
Result := RGB(r1,g1,b1);
end;
//------------------------------------------------------------------------------
procedure DrawOpenRoundRectMiddle(graphics: TGPGraphics; PC: TColor; X,Y,Width,Height,Radius: integer;Hot:boolean);
var
path:TGPGraphicsPath;
gppen:TGPPen;
begin
path := TGPGraphicsPath.Create;
gppen := tgppen.Create(ColorToARGB(PC),1);
path.AddLine(X-1, Y + height, X + width, Y + height);
graphics.DrawPath(gppen, path);
path.Free;
path := TGPGraphicsPath.Create;
path.AddLine(X-1, Y, X + width, Y);
graphics.DrawPath(gppen, path);
gppen.Free;
path.Free;
path := TGPGraphicsPath.Create;
gppen := tgppen.Create(ColorToARGB(BrightnessColor(PC,-5)),1);
path.AddLine(X + Width, Y, X + width, Y + Height);
graphics.DrawPath(gppen, path);
gppen.Free;
path.Free;
if hot then
begin
path := TGPGraphicsPath.Create;
gppen := tgppen.Create(ColorToARGB(BrightnessColor(PC,-5)),1);
path.AddLine(X , Y, X , Y + Height);
graphics.DrawPath(gppen, path);
gppen.Free;
path.Free;
end
else
begin
path := TGPGraphicsPath.Create;
// 3D color effect
gppen := tgppen.Create(ColorToARGB(BrightnessColor(clwhite,-10)),1);
path.AddLine(X, Y + 2, X, Y + Height - 2);
graphics.DrawPath(gppen, path);
gppen.Free;
path.Free;
end;
end;
//------------------------------------------------------------------------------
procedure DrawOpenRoundRectLeft(graphics: TGPGraphics; PC:TColor; X,Y,Width,Height,Radius: integer);
var
path:TGPGraphicsPath;
gppen:TGPPen;
begin
path := TGPGraphicsPath.Create;
gppen := tgppen.Create(ColorToARGB(PC),1);
path.AddLine(X + width , Y + height, X + radius, Y + height);
path.AddArc(X, Y + height - (radius*2), radius*2, radius*2, 90, 90);
path.AddLine(X, Y + height - (radius*2), X, Y + radius);
path.AddArc(X, Y, radius*2, radius*2, 180, 90);
path.AddLine(X + radius, Y, X + width, Y);
graphics.DrawPath(gppen, path);
gppen.Free;
path.Free;
path := TGPGraphicsPath.Create;
gppen := tgppen.Create(ColorToARGB(BrightnessColor(PC,-5)),1);
path.AddLine(X + Width , Y, X + width , Y + Height);
graphics.DrawPath(gppen, path);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?