git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.TMSSoftware@8 ccf39c52-e665-a648-be6a-52d81bcb5567
5299 lines
162 KiB
ObjectPascal
5299 lines
162 KiB
ObjectPascal
{***************************************************************************}
|
|
{ TAdvGlowButton component }
|
|
{ for Delphi & C++Builder }
|
|
{ }
|
|
{ written by TMS Software }
|
|
{ copyright © 2006 - 2008 }
|
|
{ Email : info@tmssoftware.com }
|
|
{ Web : http://www.tmssoftware.com }
|
|
{ }
|
|
{ The source code is given as is. The author is not responsible }
|
|
{ for any possible damage done due to the use of this code. }
|
|
{ The component can be freely used in any application. The complete }
|
|
{ source code remains property of the author and may not be distributed, }
|
|
{ published, given or sold in any form as such. No parts of the source }
|
|
{ code can be included in any other component or application without }
|
|
{ written authorization of the author. }
|
|
{***************************************************************************}
|
|
|
|
unit AdvGlowButton;
|
|
|
|
{$R ADVGLOWBUTTONDB.RES}
|
|
|
|
{$I TMSDEFS.INC}
|
|
|
|
{$T-}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, Windows, Forms, Dialogs, Controls, Graphics, Messages, ExtCtrls,
|
|
SysUtils, Math, Menus, ImgList, AdvGDIP, GDIPicture, ActnList,
|
|
AdvHintInfo, AdvStyleIF, ActiveX
|
|
{$IFNDEF TMS_STD}
|
|
, DB
|
|
{$ENDIF}
|
|
;
|
|
|
|
const
|
|
DropDownSectWidth = 13;
|
|
|
|
MAJ_VER = 1; // Major version nr.
|
|
MIN_VER = 8; // Minor version nr.
|
|
REL_VER = 1; // Release nr.
|
|
BLD_VER = 5; // Build nr.
|
|
|
|
// version history
|
|
// 1.0.5.1 : Fixed issue with width & height initialization
|
|
// 1.0.5.2 : Improved fade painting
|
|
// 1.1.0.0 : New separate dropdown button hot & down effect
|
|
// : Silver, Blue, Black styles added
|
|
// 1.2.0.0 : New DropDownSplit property added
|
|
// 1.2.0.1 : Fixed issue with ModalResult <> mrNone
|
|
// 1.2.0.2 : Fixed issue with Action handling Checked state
|
|
// 1.2.0.3 : Fixed issue with disabled painting
|
|
// 1.2.0.4 : Fixed issue with key handling
|
|
// 1.3.0.0 : Added new property FocusType
|
|
// : Added new ShortCutHint, ShortCutHintPos & methods ShowShortCutHint, HideShortCutHint
|
|
// 1.3.0.1 : Fixed issue with font and aaNone
|
|
// 1.3.0.2 : Fixed issue with hot & down border painting
|
|
// 1.3.1.0 : New : exposed OnMouseEnter, OnMouseLeave
|
|
// : Fixed issue with Down property for bsCheck style
|
|
// 1.3.1.1 : Fixed issue with Down property for buttons with GroupIndex > 0
|
|
// 1.3.1.2 : Improved transitioning from transparent to hot
|
|
// 1.3.1.3 : Fixed issue with actionlinks & bsCheck type
|
|
// 1.3.2.0 : New styler interface added
|
|
// 1.3.3.0 : New public property DroppedDown added
|
|
// 1.3.4.0 : New TAdvCustomGlowButton.ParentFont added
|
|
// : TButtonLayout blGlyphLeftAdjusted and blGlyphRightAdjusted added
|
|
// 1.3.5.0 : New borderless display possible by setting BorderStyle = bsNone
|
|
// 1.4.0.0 : Improved : seamlessly works with TrueType & non TrueType fonts
|
|
// : New : Spacing property added
|
|
// : New : WordWrap property added
|
|
// : New : AutoSize property added
|
|
// : New : MarginVert property added
|
|
// : New : MarginHorz property added
|
|
// : New : Rounded property added
|
|
// : New : DropDownDirection property added
|
|
// : New : HotImages, HotPicture property added
|
|
// 1.4.5.0 : New : PopupMenu property added
|
|
// : New : OnDrawButton event added
|
|
// : New : TButtonLayout blGlyphTopAdjusted and blGlyphBottomAdjusted added
|
|
// 1.4.6.0 : New : support for Office 2007 silver style added
|
|
// 1.4.6.1 : Fixed : issue with Win98 resource leak
|
|
// 1.5.0.0 : New : support for Unicode text via public property WideCaption
|
|
// : Improved : text drawing in aaNone AntiAlias mode
|
|
// 1.5.0.1 : Fix for use with fonts that are not installed
|
|
// 1.6.0.0 : New : support for Trimming added
|
|
// 1.6.0.1 : Fixed : issue with Action images
|
|
// 1.7.0.0 : New : Repeat functionality added with repeat initial delay & frequency setting
|
|
// : Improved wordwrap drawing with no text aliasing
|
|
// : New : support for using \n newline specifier in property inspector
|
|
// 1.7.0.1 : Fixed : drawing issue with Delphi 2007
|
|
// 1.7.1.0 : New : F4 key to open attached dropdown menu
|
|
// 1.7.1.1 : Fixed : issue with DropDownSplit and OnClick event handler
|
|
// 1.7.2.0 : New : events OnEnter, OnExit added
|
|
// 1.7.2.1 : Improved : painting on MDI child windows
|
|
// 1.7.2.2 : Fixed : drawing issue with Delphi 2007
|
|
// 1.8.0.0 : New : Notes & NotesFont
|
|
// : New : C++Builder 2007 support
|
|
// : Improved : drawing down state for Transparent button
|
|
// : Improved : drawing speed
|
|
// 1.8.0.1 : Fixed : runtime WideCaption assigning causes repaint
|
|
// 1.8.1.0 : Fixed : issue with inherited forms
|
|
// 1.8.1.1 : Fixed : issue with dbl click event
|
|
// : Fixed : issue with actions & groupindex
|
|
// : Fixed : border painting issue on checked buttons in bpMiddle, bpRight position
|
|
// 1.8.1.2 : Fixed : issue with ShowCaption & WideCaption
|
|
// 1.8.1.3 : Fixed : issue with using font not installed on the system
|
|
// 1.8.1.4 : Fixed : issue with WideCaption & aaNone AntiAlias type
|
|
// 1.8.1.5 : Fixed : issue with DblClick & OnClick event
|
|
|
|
|
|
type
|
|
TAdvCustomGlowButton = class;
|
|
TAdvGlowButton = class;
|
|
|
|
TGlowState = (gsHover, gsPush, gsNone);
|
|
TAdvButtonStyle = (bsButton, bsCheck);
|
|
TAdvButtonState = (absUp, absDisabled, absDown, absDropDown, absExclusive);
|
|
TButtonLayout = (blGlyphLeft, blGlyphTop, blGlyphRight, blGlyphBottom,
|
|
blGlyphLeftAdjusted, blGlyphRightAdjusted,
|
|
blGlyphTopAdjusted, blGlyphBottomAdjusted);
|
|
|
|
TDropDownPosition = (dpRight, dpBottom);
|
|
TDropDownDirection = (ddDown, ddRight);
|
|
TGDIPGradient = (ggRadial, ggVertical, ggDiagonalForward, ggDiagonalBackward);
|
|
|
|
TFocusType = (ftBorder, ftHot, ftHotBorder, ftNone);
|
|
|
|
TShortCutHintPos = (shpLeft, shpTop, shpRight, shpBottom, shpCenter);
|
|
|
|
TButtonPosition = (bpStandalone, bpLeft, bpMiddle, bpRight);
|
|
|
|
TGlowButtonState = (gsNormal, gsHot, gsDown);
|
|
|
|
TButtonSizeState = (bsGlyph, bsLabel, bsLarge);
|
|
|
|
TGlowButtonDrawEvent = procedure(Sender: TObject; Canvas: TCanvas; Rect: TRect; State: TGlowButtonState) of object;
|
|
TSetButtonSizeEvent = procedure(Sender: TObject; var W, H: Integer) of object;
|
|
|
|
TWinCtrl = class(TWinControl)
|
|
public
|
|
procedure PaintCtrls(DC: HDC; First: TControl);
|
|
end;
|
|
|
|
{$IFDEF DELPHI6_LVL}
|
|
TAdvGlowButtonActionLink = class(TControlActionLink)
|
|
protected
|
|
FImageIndex: Integer;
|
|
FClient: TAdvCustomGlowButton; //TAdvGlowButton;
|
|
procedure AssignClient(AClient: TObject); override;
|
|
function IsCheckedLinked: Boolean; override;
|
|
function IsGroupIndexLinked: Boolean; override;
|
|
procedure SetGroupIndex(Value: Integer); override;
|
|
procedure SetChecked(Value: Boolean); override;
|
|
function IsImageIndexLinked: Boolean; override;
|
|
procedure SetImageIndex(Value: Integer); override;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
TShortCutHintWindow = class(THintWindow)
|
|
private
|
|
FColor: TColor;
|
|
FColorTo: TColor;
|
|
procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
|
|
protected
|
|
procedure Resize; override;
|
|
procedure Paint; override;
|
|
procedure CreateParams(var Params:TCreateParams);override;
|
|
published
|
|
property Color: TColor read FColor write FColor;
|
|
property ColorTo: TColor read FColorTo write FColorTo;
|
|
end;
|
|
|
|
TGlowButtonAppearance = class(TPersistent)
|
|
private
|
|
FOnChange: TNotifyEvent;
|
|
FBorderColor: TColor;
|
|
FBorderColorHot: TColor;
|
|
FBorderColorDown: TColor;
|
|
FColor: TColor;
|
|
FColorTo: TColor;
|
|
FColorDown: TColor;
|
|
FColorDownTo: TColor;
|
|
FColorHot: TColor;
|
|
FColorHotTo: TColor;
|
|
FColorCheckedTo: TColor;
|
|
FBorderColorDisabled: TColor;
|
|
FBorderColorChecked: TColor;
|
|
FColorDisabled: TColor;
|
|
FColorDisabledTo: TColor;
|
|
FColorChecked: TColor;
|
|
FColorMirror: TColor;
|
|
FColorMirrorTo: TColor;
|
|
FColorMirrorHot: TColor;
|
|
FColorMirrorHotTo: TColor;
|
|
FColorMirrorDown: TColor;
|
|
FColorMirrorDownTo: TColor;
|
|
FGradientDown: TGDIPGradient;
|
|
FGradientMirror: TGDIPGradient;
|
|
FGradientMirrorHot: TGDIPGradient;
|
|
FGradient: TGDIPGradient;
|
|
FGradientMirrorDown: TGDIPGradient;
|
|
FGradientHot: TGDIPGradient;
|
|
FColorMirrorDisabledTo: TColor;
|
|
FColorMirrorDisabled: TColor;
|
|
FColorMirrorCheckedTo: TColor;
|
|
FColorMirrorChecked: TColor;
|
|
FGradientChecked: TGDIPGradient;
|
|
FGradientDisabled: TGDIPGradient;
|
|
FGradientMirrorChecked: TGDIPGradient;
|
|
FGradientMirrorDisabled: TGDIPGradient;
|
|
FSystemFont: boolean;
|
|
procedure SetSystemFont(const Value: boolean);
|
|
protected
|
|
procedure Changed;
|
|
public
|
|
constructor Create;
|
|
procedure Assign(Source: TPersistent); override;
|
|
property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
|
published
|
|
property BorderColor: TColor read FBorderColor write FBorderColor default clSilver;
|
|
property BorderColorHot: TColor read FBorderColorHot write FBorderColorHot default clBlue;
|
|
property BorderColorDown: TColor read FBorderColorDown write FBorderColorDown default clNavy;
|
|
property BorderColorChecked: TColor read FBorderColorChecked write FBorderColorChecked default clBlue;
|
|
property BorderColorDisabled: TColor read FBorderColorDisabled write FBorderColorDisabled default clGray;
|
|
property Color: TColor read FColor write FColor default clWhite;
|
|
property ColorTo: TColor read FColorTo write FColorTo default clWhite;
|
|
property ColorChecked: TColor read FColorChecked write FColorChecked;
|
|
property ColorCheckedTo: TColor read FColorCheckedTo write FColorCheckedTo;
|
|
property ColorDisabled: TColor read FColorDisabled write FColorDisabled;
|
|
property ColorDisabledTo: TColor read FColorDisabledTo write FColorDisabledTo;
|
|
property ColorDown: TColor read FColorDown write FColorDown;
|
|
property ColorDownTo: TColor read FColorDownTo write FColorDownTo;
|
|
property ColorHot: TColor read FColorHot write FColorHot;
|
|
property ColorHotTo: TColor read FColorHotTo write FColorHotTo;
|
|
property ColorMirror: TColor read FColorMirror write FColorMirror default clSilver;
|
|
property ColorMirrorTo: TColor read FColorMirrorTo write FColorMirrorTo default clWhite;
|
|
property ColorMirrorHot: TColor read FColorMirrorHot write FColorMirrorHot;
|
|
property ColorMirrorHotTo: TColor read FColorMirrorHotTo write FColorMirrorHotTo;
|
|
property ColorMirrorDown: TColor read FColorMirrorDown write FColorMirrorDown;
|
|
property ColorMirrorDownTo: TColor read FColorMirrorDownTo write FColorMirrorDownTo;
|
|
property ColorMirrorChecked: TColor read FColorMirrorChecked write FColorMirrorChecked;
|
|
property ColorMirrorCheckedTo: TColor read FColorMirrorCheckedTo write FColorMirrorCheckedTo;
|
|
property ColorMirrorDisabled: TColor read FColorMirrorDisabled write FColorMirrorDisabled;
|
|
property ColorMirrorDisabledTo: TColor read FColorMirrorDisabledTo write FColorMirrorDisabledTo;
|
|
property Gradient: TGDIPGradient read FGradient write FGradient default ggVertical;
|
|
property GradientMirror: TGDIPGradient read FGradientMirror write FGradientMirror default ggVertical;
|
|
property GradientHot: TGDIPGradient read FGradientHot write FGradientHot default ggRadial;
|
|
property GradientMirrorHot: TGDIPGradient read FGradientMirrorHot write FGradientMirrorHot default ggRadial;
|
|
property GradientDown: TGDIPGradient read FGradientDown write FGradientDown default ggRadial;
|
|
property GradientMirrorDown: TGDIPGradient read FGradientMirrorDown write FGradientMirrorDown default ggRadial;
|
|
property GradientChecked: TGDIPGradient read FGradientChecked write FGradientChecked default ggRadial;
|
|
property GradientMirrorChecked: TGDIPGradient read FGradientMirrorChecked write FGradientMirrorChecked default ggVertical;
|
|
property GradientDisabled: TGDIPGradient read FGradientDisabled write FGradientDisabled default ggRadial;
|
|
property GradientMirrorDisabled: TGDIPGradient read FGradientMirrorDisabled write FGradientMirrorDisabled default ggRadial;
|
|
property SystemFont: boolean read FSystemFont write SetSystemFont default true;
|
|
end;
|
|
|
|
/// <summary>Button with glow hover & down effect</summary>
|
|
TAdvCustomGlowButton = class(TCustomControl, ITMSStyle)
|
|
private
|
|
FActive: Boolean;
|
|
FDown: Boolean;
|
|
FLeftDown: Boolean;
|
|
FMouseDown: Boolean;
|
|
FTimer: TTimer;
|
|
FStepHover: Integer;
|
|
FStepPush: Integer;
|
|
FTimeInc: Integer;
|
|
FGlowState: TGlowState;
|
|
FImages: TImageList;
|
|
FImageIndex: TImageIndex;
|
|
FState: TAdvButtonState;
|
|
FMouseInControl: Boolean;
|
|
FMouseEnter: Boolean;
|
|
FDownChecked: Boolean;
|
|
FInitialDown: Boolean;
|
|
FDragging: Boolean;
|
|
FStyle: TAdvButtonStyle;
|
|
FGroupIndex: Integer;
|
|
FAllowAllUp: Boolean;
|
|
FTransparent: Boolean;
|
|
FLayout: TButtonLayout;
|
|
FDropDownButton: Boolean;
|
|
FDropDownSplit: Boolean;
|
|
FDropDownDirection: TDropDownDirection;
|
|
FDropDownMenu: TPopupMenu;
|
|
FOnDropDown: TNotifyEvent;
|
|
FDropDownPosition: TDropDownPosition;
|
|
FAppearance: TGlowButtonAppearance;
|
|
FDisabledImages: TImageList;
|
|
FInternalImages: TImageList;
|
|
FHotImages: TImageList;
|
|
FIPicture: TGDIPPicture;
|
|
FIDisabledPicture: TGDIPPicture;
|
|
FIHotPicture: TGDIPPicture;
|
|
FShowCaption: Boolean;
|
|
FAntiAlias: TAntiAlias;
|
|
FModalResult: TModalResult;
|
|
FDefault: boolean;
|
|
FCancel: Boolean;
|
|
FInButton: Boolean;
|
|
FBorderStyle: TBorderStyle;
|
|
FButtonPosition: TButtonPosition;
|
|
FOfficeHint: TAdvHintInfo;
|
|
FCheckLinked: Boolean;
|
|
FGroupIndexLinked: Boolean;
|
|
FFocusType: TFocusType;
|
|
FShortCutHint: TShortCutHintWindow;
|
|
FShortCutHintPos: TShortCutHintPos;
|
|
FShortCutHintText: string;
|
|
FShowDisabled: Boolean;
|
|
FOnInternalKeyDown: TKeyEvent;
|
|
FOnMouseLeave: TNotifyEvent;
|
|
FOnMouseEnter: TNotifyEvent;
|
|
FDroppedDown: Boolean;
|
|
FOverlappedText: Boolean;
|
|
FSpacing: Integer;
|
|
FAutoSize: Boolean;
|
|
FWordWrap: Boolean;
|
|
FDoAutoSize: Boolean;
|
|
FFirstPaint: Boolean;
|
|
FMarginVert: integer;
|
|
FMarginHorz: integer;
|
|
FRounded: Boolean;
|
|
FOnDrawButton: TGlowButtonDrawEvent;
|
|
FWideCaption: widestring;
|
|
FTrimming: TStringTrimming;
|
|
FRepeatTimer: TTimer;
|
|
FInitRepeatPause: Integer;
|
|
FRepeatPause: Integer;
|
|
FRepeatClick: Boolean;
|
|
FOnInternalClick: TNotifyEvent;
|
|
FButtonSizeState: TButtonSizeState;
|
|
FMaxButtonSizeState: TButtonSizeState;
|
|
FOnSetButtonSize: TSetButtonSizeEvent;
|
|
FOldLayout: TButtonLayout;
|
|
FOldDropDownPosition: TDropDownPosition;
|
|
FMinButtonSizeState: TButtonSizeState;
|
|
FParentForm: TCustomForm;
|
|
FIsVista: boolean;
|
|
FNotes: TStringList;
|
|
FNotesFont: TFont;
|
|
procedure SetOfficeHint(const Value: TAdvHintInfo);
|
|
procedure SetButtonPosition(const Value: TButtonPosition);
|
|
procedure SetBorderStyle(const Value: TBorderStyle);
|
|
function GetVersion: string;
|
|
procedure SetVersion(const Value: string);
|
|
procedure SetDefault(const Value: boolean);
|
|
procedure SetAntiAlias(const Value: TAntiAlias);
|
|
procedure SetShowCaption(const Value: Boolean);
|
|
procedure SetDisabledPicture(const Value: TGDIPPicture);
|
|
procedure SetHotPicture(const Value: TGDIPPicture);
|
|
procedure SetPicture(const Value: TGDIPPicture);
|
|
procedure SetTransparent(const Value: Boolean);
|
|
procedure UpdateExclusive;
|
|
procedure UpdateTracking;
|
|
procedure SetImageIndex(const Value: TImageIndex);
|
|
procedure SetImages(const Value: TImageList);
|
|
procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
|
|
procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
|
|
procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED;
|
|
procedure WMGetDlgCode(var Message: TMessage); message WM_GETDLGCODE;
|
|
procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
|
|
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
|
|
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
|
|
procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
|
|
procedure WMSetText(var Message: TWMSetText); message WM_SETTEXT;
|
|
procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
|
|
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
|
|
procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
|
|
{$IFNDEF TMSDOTNET}
|
|
procedure CMButtonPressed(var Message: TMessage); message CM_BUTTONPRESSED;
|
|
{$ENDIF}
|
|
procedure WMLButtonUp(var Msg:TWMLButtonDown); message WM_LBUTTONUP;
|
|
procedure WMLDblClk(var Msg: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
|
|
procedure TimerProc(Sender: TObject);
|
|
procedure OnAppearanceChanged(Sender: TObject);
|
|
procedure SetDown(Value: Boolean);
|
|
procedure SetStyle(const Value: TAdvButtonStyle);
|
|
procedure SetGroupIndex(const Value: Integer);
|
|
procedure SetAllowAllUp(const Value: Boolean);
|
|
procedure SetLayout(const Value: TButtonLayout);
|
|
procedure SetDropDownButton(const Value: Boolean);
|
|
procedure PopupBtnDown;
|
|
procedure SetDropDownPosition(const Value: TDropDownPosition);
|
|
procedure SetDropDownDirection(const Value: TDropDownDirection);
|
|
procedure SetAppearance(const Value: TGlowButtonAppearance);
|
|
procedure SetDisabledImages(const Value: TImageList);
|
|
procedure PictureChanged(Sender: TObject);
|
|
procedure DoDropDown;
|
|
procedure SetSpacing(const Value: integer);
|
|
procedure SetAutoSizeEx(const Value: boolean);
|
|
procedure SetShowDisabled(const Value: boolean);
|
|
procedure SetWordWrap(const Value: boolean);
|
|
procedure SetMarginVert(const Value: integer);
|
|
procedure SetMarginHorz(const Value: integer);
|
|
procedure SetRounded(const Value: boolean);
|
|
procedure SetTrimming(const Value: TStringTrimming);
|
|
procedure PerformResize;
|
|
function IsFontStored: Boolean;
|
|
procedure SetButtonSizeState(const Value: TButtonSizeState);
|
|
procedure SetMaxButtonSizeState(const Value: TButtonSizeState);
|
|
procedure SetMinButtonSizeState(const Value: TButtonSizeState);
|
|
procedure SetNotes(const Value: TStrings);
|
|
function GetNotes: TStrings;
|
|
procedure SetNotesFont(const Value: TFont);
|
|
procedure SetWideCaption(const Value: widestring);
|
|
// procedure SetCaption(const Value: string);
|
|
// function GetCaption: string;
|
|
protected
|
|
FHot: Boolean;
|
|
FDefaultPicDrawing: Boolean;
|
|
FDefaultCaptionDrawing: Boolean;
|
|
FCustomizerCreated: Boolean;
|
|
FCommandID: Integer;
|
|
procedure TimerExpired(Sender: TObject); virtual;
|
|
procedure DrawGlyphCaption; virtual;
|
|
procedure GetToolImage(bmp: TBitmap); virtual;
|
|
procedure SetDroppedDown(Value: Boolean);
|
|
procedure CreateParams(var Params:TCreateParams); override;
|
|
procedure Paint; override;
|
|
procedure Loaded; override;
|
|
procedure DoEnter; override;
|
|
procedure DoExit; override;
|
|
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
|
|
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
|
|
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
|
|
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
|
|
procedure KeyUp(var Key: Word; Shift: TShiftState); override;
|
|
procedure KeyPress(var Key: Char); override;
|
|
{$IFDEF DELPHI6_LVL}
|
|
function GetActionLinkClass: TControlActionLinkClass; override;
|
|
procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
|
|
{$ENDIF}
|
|
procedure Notification(AComponent: TComponent; AOperation: TOperation); override;
|
|
property GlowState: TGlowState read FGlowState write FGlowState;
|
|
{$IFDEF TMSDOTNET}
|
|
procedure ButtonPressed(Group: Integer; Button: TAdvGlowButton);
|
|
{$ENDIF}
|
|
property Down: Boolean read FDownChecked write SetDown default False;
|
|
property Style: TAdvButtonStyle read FStyle write SetStyle default bsButton;
|
|
property State: TAdvButtonState read FState write FState;
|
|
property GroupIndex: Integer read FGroupIndex write SetGroupIndex default 0;
|
|
property AllowAllUp: Boolean read FAllowAllUp write SetAllowAllUp default False;
|
|
property Layout: TButtonLayout read FLayout write SetLayout default blGlyphLeft;
|
|
property DroppedDown: Boolean read FDroppedDown;
|
|
property DropDownButton: Boolean read FDropDownButton write SetDropDownButton default False;
|
|
property DropDownDirection: TDropDownDirection read FDropDownDirection write SetDropDownDirection default ddDown;
|
|
property DropDownPosition: TDropDownPosition read FDropDownPosition write SetDropDownPosition default dpRight;
|
|
property DropDownSplit: Boolean read FDropDownSplit write FDropDownSplit default true;
|
|
property DropDownMenu: TPopupMenu read FDropDownMenu write FDropDownMenu;
|
|
property OnDropDown: TNotifyEvent read FOnDropDown write FOnDropDown;
|
|
function GetVersionNr: Integer; virtual;
|
|
function IsMenuButton: Boolean; virtual;
|
|
function CanDrawBorder: Boolean; virtual;
|
|
function CanDrawFocused: Boolean; virtual;
|
|
procedure InternalClick;
|
|
property CheckLinked: Boolean read FCheckLinked write FCheckLinked;
|
|
property GroupIndexLinked: Boolean read FGroupIndexLinked write FGroupIndexLinked;
|
|
property OnInternalKeyDown: TKeyEvent read FOnInternalKeyDown write FOnInternalKeyDown; // Used by AdvToolBar
|
|
property OnInternalClick: TNotifyEvent read FOnInternalClick write FOnInternalClick; // Used by AdvToolBar
|
|
property OverlappedText: boolean read FOverlappedText write FOverlappedText;
|
|
property DoAutoSize: boolean read FDoAutoSize write FDoAutoSize;
|
|
property ButtonSizeState: TButtonSizeState read FButtonSizeState write SetButtonSizeState; // Used by AdvToolBar
|
|
property MaxButtonSizeState: TButtonSizeState read FMaxButtonSizeState write SetMaxButtonSizeState default bsLarge;
|
|
property MinButtonSizeState: TButtonSizeState read FMinButtonSizeState write SetMinButtonSizeState default bsGlyph;
|
|
property OnSetButtonSize: TSetButtonSizeEvent read FOnSetButtonSize write FOnSetButtonSize; // Used by AdvToolBar
|
|
function GetButtonSize(BtnSizeState: TButtonSizeState): TSize;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
procedure CreateWnd; override;
|
|
procedure Click; override;
|
|
property Appearance: TGlowButtonAppearance read FAppearance write SetAppearance;
|
|
procedure ShowShortCutHint;
|
|
procedure HideShortCutHint;
|
|
/// <summary>Sets the style of the component, make sure to include AdvStyleIF unit</summary>
|
|
procedure SetComponentStyle(AStyle: TTMSStyle);
|
|
property WideCaption: widestring read FWideCaption write SetWideCaption;
|
|
published
|
|
property Align;
|
|
property Action;
|
|
property Anchors;
|
|
property AntiAlias: TAntiAlias read FAntiAlias write SetAntiAlias default aaClearType;
|
|
property AutoSize: boolean read FAutoSize write SetAutoSizeEx default false;
|
|
property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle;
|
|
property Cancel: Boolean read FCancel write FCancel default False;
|
|
//property Caption: string read GetCaption write SetCaption;
|
|
property Caption;
|
|
property Constraints;
|
|
property Default: boolean read FDefault write SetDefault default False;
|
|
property Font stored IsFontStored;
|
|
property ImageIndex: TImageIndex read FImageIndex write SetImageIndex default -1;
|
|
property Images: TImageList read FImages write SetImages;
|
|
property DisabledImages: TImageList read FDisabledImages write SetDisabledImages;
|
|
property DisabledPicture: TGDIPPicture read FIDisabledPicture write SetDisabledPicture;
|
|
property DragMode;
|
|
property DragKind;
|
|
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 Notes: TStrings read GetNotes write SetNotes;
|
|
property NotesFont: TFont read FNotesFont write SetNotesFont;
|
|
property OfficeHint: TAdvHintInfo read FOfficeHint write SetOfficeHint;
|
|
property ParentFont default true;
|
|
property Picture: TGDIPPicture read FIPicture write SetPicture;
|
|
property PopupMenu;
|
|
property Position: TButtonPosition read FButtonPosition write SetButtonPosition default bpStandalone;
|
|
property InitRepeatPause: Integer read FInitRepeatPause write FInitRepeatPause default 400;
|
|
property RepeatPause: Integer read FRepeatPause write FRepeatPause default 100;
|
|
property RepeatClick: boolean read FRepeatClick write FRepeatClick default false;
|
|
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 Trimming: TStringTrimming read FTrimming write SetTrimming default StringTrimmingNone;
|
|
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 OnExit;
|
|
property OnEnter;
|
|
|
|
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;
|
|
property OnDrawButton: TGlowButtonDrawEvent read FOnDrawButton write FOnDrawButton;
|
|
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 MaxButtonSizeState;
|
|
property MinButtonSizeState;
|
|
property DropDownButton;
|
|
property DropDownPosition;
|
|
property DropDownDirection;
|
|
property DropDownSplit;
|
|
property DropDownMenu;
|
|
property OnDropDown;
|
|
end;
|
|
|
|
{$IFNDEF TMS_STD}
|
|
|
|
//---- 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;
|
|
|
|
{$ENDIF}
|
|
|
|
implementation
|
|
|
|
{$IFNDEF TMS_STD}
|
|
uses
|
|
{$IFDEF DELPHI6_LVL}
|
|
VDBConsts
|
|
{$ELSE}
|
|
DBConsts
|
|
{$ENDIF}
|
|
;
|
|
{$ENDIF}
|
|
|
|
type
|
|
TButtonDisplay = (bdNone, bdButton, bdDropDown);
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
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);
|
|
gppen.Free;
|
|
path.Free;
|
|
|
|
end;
|
|
|
|
procedure DrawOpenRoundRectRight(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, Y, X + width - (radius *2), Y);
|
|
path.AddArc(X + width - (radius*2), Y, radius*2, radius*2, 270, 90);
|
|
path.AddLine(X + width, Y + radius, X + width, Y + height - (radius*2));
|
|
path.AddArc(X + width - (radius*2), Y + height - (radius*2), radius*2, radius*2,0,90);
|
|
path.AddLine(X + width , Y + height, X, 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 DrawDottedRoundRect(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);
|
|
gppen.SetDashStyle(DashStyleDot);
|
|
path.AddLine(X + radius, Y, X + width - (radius*2), Y);
|
|
path.AddArc(X + width - (radius*2), Y, radius*2, radius*2, 270, 90);
|
|
path.AddLine(X + width, Y + radius, X + width, Y + height - (radius*2));
|
|
path.AddArc(X + width - (radius*2), Y + height - (radius*2), radius*2, radius*2,0,90);
|
|
path.AddLine(X + width - (radius*2), 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.CloseFigure;
|
|
graphics.DrawPath(gppen, path);
|
|
gppen.Free;
|
|
path.Free;
|
|
end;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure DrawRoundRect(graphics: TGPGraphics; PC: TColor; X,Y,Width,Height,Radius: integer);
|
|
var
|
|
path:TGPGraphicsPath;
|
|
gppen:TGPPen;
|
|
r: integer;
|
|
begin
|
|
gppen := tgppen.Create(ColorToARGB(PC),1);
|
|
|
|
if radius = 0 then
|
|
begin
|
|
graphics.DrawRectangle(gppen, X, Y, Width, Height);
|
|
end
|
|
else
|
|
begin
|
|
r := radius * 2;
|
|
path := TGPGraphicsPath.Create;
|
|
//gppen := tgppen.Create(ColorToARGB(PC),1);
|
|
path.AddLine(X + radius, Y, X + width - r, Y);
|
|
path.AddArc(X + width - r, Y, r, r, 270, 90);
|
|
path.AddLine(X + width, Y + radius, X + width, Y + height - r);
|
|
path.AddArc(X + width - r, Y + height - r, r, r,0,90);
|
|
path.AddLine(X + width - r, Y + height, X + radius, Y + height);
|
|
path.AddArc(X, Y + height - r, r, r, 90, 90);
|
|
path.AddLine(X, Y + height - r, X, Y + radius);
|
|
path.AddArc(X, Y, r, r, 180, 90);
|
|
path.CloseFigure;
|
|
graphics.DrawPath(gppen, path);
|
|
path.Free;
|
|
end;
|
|
gppen.Free;
|
|
end;
|
|
|
|
procedure DrawArrow(Canvas: TCanvas; ArP: TPoint; ArClr, ArShad: TColor; Down:boolean);
|
|
begin
|
|
if Down then
|
|
begin
|
|
Canvas.Pen.Color := ArClr;
|
|
Canvas.MoveTo(ArP.X, ArP.Y);
|
|
Canvas.LineTo(ArP.X + 5, ArP.Y);
|
|
Canvas.MoveTo(ArP.X + 1, ArP.Y + 1);
|
|
Canvas.LineTo(ArP.X + 4, ArP.Y + 1);
|
|
Canvas.Pixels[ArP.X + 2, ArP.Y + 2] := ArClr;
|
|
Canvas.Pixels[ArP.X, ArP.Y + 1] := ArShad;
|
|
Canvas.Pixels[ArP.X + 4, ArP.Y + 1] := ArShad;
|
|
Canvas.Pixels[ArP.X + 1, ArP.Y + 2] := ArShad;
|
|
Canvas.Pixels[ArP.X + 3, ArP.Y + 2] := ArShad;
|
|
Canvas.Pixels[ArP.X + 2, ArP.Y + 3] := ArShad;
|
|
end
|
|
else
|
|
begin
|
|
Canvas.Pen.Color := ArClr;
|
|
Canvas.MoveTo(ArP.X, ArP.Y);
|
|
Canvas.LineTo(ArP.X, ArP.Y + 5);
|
|
Canvas.MoveTo(ArP.X + 1, ArP.Y + 1);
|
|
Canvas.LineTo(ArP.X + 1, ArP.Y + 4);
|
|
Canvas.Pixels[ArP.X + 2, ArP.Y + 2] := ArClr;
|
|
Canvas.Pixels[ArP.X + 2, ArP.Y + 1] := ArShad;
|
|
Canvas.Pixels[ArP.X + 1, ArP.Y + 4] := ArShad;
|
|
Canvas.Pixels[ArP.X + 2, ArP.Y + 1] := ArShad;
|
|
Canvas.Pixels[ArP.X + 3, ArP.Y + 2] := ArShad;
|
|
Canvas.Pixels[ArP.X + 3, ArP.Y + 2] := ArShad;
|
|
end;
|
|
end;
|
|
|
|
procedure DrawButtonBackground(Canvas: TCanvas; Graphics: TGPGraphics; R: TRect; CF,CT: TColor; Gradient: TGDIPGradient; Upper: boolean);
|
|
var
|
|
path: TGPGraphicsPath;
|
|
pthGrBrush: TGPPathGradientBrush;
|
|
linGrBrush: TGPLinearGradientBrush;
|
|
solGrBrush: TGPSolidBrush;
|
|
|
|
w,h,w2,h2: Integer;
|
|
colors : array[0..0] of TGPColor;
|
|
count: Integer;
|
|
|
|
begin
|
|
w := r.Right - r.Left;
|
|
h := r.Bottom - r.Top;
|
|
|
|
h2 := h div 2;
|
|
w2 := w div 2;
|
|
|
|
{
|
|
// draw background
|
|
if Upper then
|
|
Canvas.Brush.Color := CF
|
|
else
|
|
Canvas.Brush.Color := CT;
|
|
Canvas.FillRect(rect(r.Left , r.Top, r.Right , r.Bottom));
|
|
}
|
|
|
|
if Upper then
|
|
solGrBrush := TGPSolidBrush.Create(ColorToARGB(CF))
|
|
else
|
|
solGrBrush := TGPSolidBrush.Create(ColorToARGB(CT));
|
|
|
|
Graphics.FillRectangle(solGrBrush, MakeRect(r.Left , r.Top, r.Right , r.Bottom));
|
|
|
|
solGrBrush.Free;
|
|
|
|
// Create a path that consists of a single ellipse.
|
|
path := TGPGraphicsPath.Create;
|
|
|
|
if Upper then // take borders in account
|
|
path.AddEllipse(r.Left, r.Top - h2 + 2, r.Right , r.Bottom)
|
|
else
|
|
path.AddEllipse(r.Left, r.Top, r.Right , r.Bottom);
|
|
|
|
pthGrBrush := nil;
|
|
linGrBrush := nil;
|
|
|
|
case Gradient of
|
|
ggRadial: pthGrBrush := TGPPathGradientBrush.Create(path);
|
|
ggVertical: linGrBrush := TGPLinearGradientBrush.Create(MakeRect(r.Left,r.Top,w,h),ColorToARGB(CF),ColorToARGB(CT), LinearGradientModeVertical);
|
|
ggDiagonalForward: linGrBrush := TGPLinearGradientBrush.Create(MakeRect(r.Left,r.Top,w,h),ColorToARGB(CF),ColorToARGB(CT), LinearGradientModeForwardDiagonal);
|
|
ggDiagonalBackward: linGrBrush := TGPLinearGradientBrush.Create(MakeRect(r.Left,r.Top,w,h),ColorToARGB(CF),ColorToARGB(CT), LinearGradientModeBackwardDiagonal);
|
|
end;
|
|
|
|
if Gradient = ggRadial then
|
|
begin
|
|
if Upper then
|
|
pthGrBrush.SetCenterPoint(MakePoint(r.Left + w2, r.Top))
|
|
else
|
|
pthGrBrush.SetCenterPoint(MakePoint(r.Left + w2, r.Bottom));
|
|
|
|
// Set the color at the center point to blue.
|
|
if Upper then
|
|
begin
|
|
pthGrBrush.SetCenterColor(ColorToARGB(CT));
|
|
colors[0] := ColorToARGB(CF);
|
|
end
|
|
else
|
|
begin
|
|
pthGrBrush.SetCenterColor(ColorToARGB(CF));
|
|
colors[0] := ColorToARGB(CT);
|
|
end;
|
|
|
|
count := 1;
|
|
pthGrBrush.SetSurroundColors(@colors, count);
|
|
graphics.FillRectangle(pthGrBrush, r.Left, r.Top, r.Right, r.Bottom);
|
|
pthGrBrush.Free;
|
|
end
|
|
else
|
|
begin
|
|
graphics.FillRectangle(linGrBrush, r.Left, r.Top, r.Right, r.Bottom);
|
|
linGrBrush.Free;
|
|
end;
|
|
|
|
path.Free;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure DrawStretchPicture(graphics : TGPGraphics; Canvas: TCanvas; R: TRect; Pic: TGDIPPicture);
|
|
var
|
|
Img: TGPImage;
|
|
pstm: IStream;
|
|
hGlobal: THandle;
|
|
pcbWrite: Longint;
|
|
ms: TMemoryStream;
|
|
bmp: TBitmap;
|
|
begin
|
|
ms := TMemoryStream.Create;
|
|
Pic.SaveToStream(ms);
|
|
hGlobal := GlobalAlloc(GMEM_MOVEABLE, ms.Size);
|
|
if (hGlobal = 0) then
|
|
begin
|
|
ms.Free;
|
|
raise Exception.Create('Could not allocate memory for image');
|
|
end;
|
|
|
|
try
|
|
pstm := nil;
|
|
|
|
// Create IStream* from global memory
|
|
CreateStreamOnHGlobal(hGlobal, TRUE, pstm);
|
|
pstm.Write(ms.Memory, ms.Size,@pcbWrite);
|
|
|
|
Img := TGPImage.Create(pstm);
|
|
if Img.GetFormat = ifBMP then
|
|
begin // use this alternative for easy bitmap auto transparent drawing
|
|
bmp := TBitmap.Create;
|
|
ms.Position := 0;
|
|
bmp.LoadFromStream(ms);
|
|
bmp.TransparentMode := tmAuto;
|
|
bmp.Transparent := true;
|
|
Canvas.StretchDraw(R, bmp);
|
|
bmp.Free;
|
|
end
|
|
else
|
|
begin
|
|
graphics.DrawImageRect(Img, R.Left, R.Top, R.Right - R.Left, R.Bottom - R.Top);
|
|
end;
|
|
|
|
Img.Free;
|
|
ms.Free;
|
|
finally
|
|
GlobalFree(hGlobal);
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
function DrawVistaButton(Canvas: TCanvas; r: TRect; CFU, CTU, CFB, CTB, PC: TColor;
|
|
GradientU, GradientB: TGDIPGradient; Caption:string; WideCaption: widestring; DrawCaption: Boolean; AFont: TFont;
|
|
Images: TImageList; ImageIndex: Integer; EnabledImage: Boolean; Layout: TButtonLayout;
|
|
DropDownButton: Boolean; DrawDwLine: Boolean; Enabled: Boolean; Focus: Boolean; DropDownPos: TDropDownPosition;
|
|
Picture: TGDIPPicture; ForcePicSize: TSize; AntiAlias: TAntiAlias; DrawPic: Boolean; Glyph: TBitmap; ButtonDisplay: TButtonDisplay; Transparent, Hot: boolean;
|
|
ButtonPosition: TButtonPosition; DropDownSplit, DrawBorder, OverlapText, WordWrap, AutoSize, Rounded, DropDir: Boolean; Spacing: integer;
|
|
Trimming: TStringTrimming;Notes: TStringList; NotesFont: TFont;Checked: boolean): TSize;
|
|
var
|
|
graphics : TGPGraphics;
|
|
path: TGPGraphicsPath;
|
|
pthGrBrush: TGPPathGradientBrush;
|
|
linGrBrush: TGPLinearGradientBrush;
|
|
count: Integer;
|
|
w,h,h2,h2d: Integer;
|
|
colors : array[0..0] of TGPColor;
|
|
fontFamily,nfontFamily: TGPFontFamily;
|
|
font,nfont: TGPFont;
|
|
rectf: TGPRectF;
|
|
stringFormat: TGPStringFormat;
|
|
solidBrush,nsolidBrush: TGPSolidBrush;
|
|
x1,y1,x2,y2: single;
|
|
fs,nfs: integer;
|
|
sizerect: TGPRectF;
|
|
noterect: TGPRectF;
|
|
ImgX, ImgY, ImgW, ImgH: Integer;
|
|
BtnR, DwR: TRect;
|
|
BR1,BR2: TRect;
|
|
DR1,DR2: TRect;
|
|
AP: TPoint;
|
|
szRect: TRect;
|
|
tm: TTextMetric;
|
|
ttf: boolean;
|
|
Radius: integer;
|
|
uformat,wwformat: Cardinal;
|
|
tdrect: TRect;
|
|
th, px, py: integer;
|
|
notesrect: TRect;
|
|
|
|
begin
|
|
BtnR := R;
|
|
|
|
if Rounded then
|
|
Radius := 3
|
|
else
|
|
Radius := 0;
|
|
|
|
if DropDownPos = dpRight then
|
|
begin
|
|
DwR := Rect(BtnR.Right - DropDownSectWidth, BtnR.Top, BtnR.Right, BtnR.Bottom);
|
|
if DropDownButton then
|
|
BtnR.Right := DwR.Left;
|
|
end
|
|
else // DropDownPos = doBottom
|
|
begin
|
|
DwR := Rect(BtnR.Left, BtnR.Bottom - DropDownSectWidth, BtnR.Right, BtnR.Bottom);
|
|
if DropDownButton then
|
|
BtnR.Bottom := DwR.Top;
|
|
end;
|
|
|
|
if (Notes.Text <> '') then
|
|
Layout := blGlyphLeftAdjusted;
|
|
|
|
w := r.Right - r.Left;
|
|
h := r.Bottom - r.Top;
|
|
|
|
h2 := h div 2;
|
|
|
|
// Create GDI+ canvas
|
|
graphics := TGPGraphics.Create(Canvas.Handle);
|
|
|
|
if not Transparent then
|
|
begin
|
|
|
|
if DropDownButton and (DrawDwLine) and DropDownSplit then
|
|
begin
|
|
if DropDownPos = dpRight then
|
|
begin
|
|
DR1 := Rect(r.Right - 12, r.Top + h2 - 1, r.Right, r.Bottom);
|
|
DR2 := Rect(r.Right - 12, r.Top, r.Right, r.Bottom - h2);
|
|
BR1 := Rect(r.Left, r.Top + h2 - 1, r.Right - 12, r.Bottom);
|
|
BR2 := Rect(r.Left, r.Top, r.Right - 12, r.Bottom - h2);
|
|
end
|
|
else
|
|
begin
|
|
DR1 := Rect(r.Left, r.Bottom - 6, r.Right, r.Bottom);
|
|
DR2 := Rect(r.Left, r.Bottom - 12, r.Right, r.Bottom - 6);
|
|
|
|
DR2 := Rect(r.Left, r.Bottom - 12, r.Right, r.Bottom);
|
|
|
|
h2d := (r.Bottom - r.Top - 12) div 2;
|
|
BR1 := Rect(r.Left, r.Top + h2d - 1, r.Right, r.Bottom - 12);
|
|
BR2 := Rect(r.Left, r.Top, r.Right, r.Bottom - 12 - h2d);
|
|
end;
|
|
|
|
if ButtonDisplay = bdDropDown then
|
|
begin
|
|
DrawButtonBackground(Canvas, Graphics, BR1, CTB, CFB, GradientB, False);
|
|
DrawButtonBackground(Canvas, Graphics, BR2, CFU, CTU, GradientU, True);
|
|
|
|
DrawButtonBackground(Canvas, Graphics, DR2, BrightnessColor(CFU,-10), BrightnessColor(CTU,-10), GradientU, True);
|
|
if (DropDownPos = dpRight) then
|
|
DrawButtonBackground(Canvas, Graphics, DR1, BrightnessColor(CTB,-10), BrightnessColor(CFB,-10), GradientB, False);
|
|
end
|
|
else
|
|
begin
|
|
DrawButtonBackground(Canvas, Graphics, BR1, BrightnessColor(CTB,-10), BrightnessColor(CFB,-10), GradientB, False);
|
|
DrawButtonBackground(Canvas, Graphics, BR2, BrightnessColor(CFU,-10), BrightnessColor(CTU,-10), GradientU, True);
|
|
|
|
DrawButtonBackground(Canvas, Graphics, DR2, CFU, CTU, ggRadial, True);
|
|
if DropDownPos = dpRight then
|
|
DrawButtonBackground(Canvas, Graphics, DR1, CTB, CFB, GradientB, False);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
DrawButtonBackground(Canvas, Graphics, Rect(r.Left, r.Top + h2 - 1, r.Right, r.Bottom), CTB, CFB, GradientB, False);
|
|
DrawButtonBackground(Canvas, Graphics, Rect(r.Left, r.Top, r.Right, r.Bottom - h2), CFU, CTU, GradientU, True);
|
|
end;
|
|
end;
|
|
|
|
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
|
|
|
|
if not Transparent and DrawBorder then
|
|
begin
|
|
case ButtonPosition of
|
|
bpStandalone: DrawRoundRect(Graphics, PC, r.Left, r.Top, r.Right - 1, r.Bottom - 1, Radius);
|
|
bpLeft: DrawOpenRoundRectLeft(Graphics, PC, r.Left, r.Top, r.Right - 1, r.Bottom - 1, Radius);
|
|
bpRight: DrawOpenRoundRectRight(Graphics, PC, r.Left, r.Top, r.Right - 1, r.Bottom - 1, Radius, Hot or Checked);
|
|
bpMiddle: DrawOpenRoundRectMiddle(Graphics, PC, r.Left, r.Top, r.Right - 1, r.Bottom - 1, Radius, Hot or Checked);
|
|
end;
|
|
end;
|
|
|
|
if Focus then // Draw focus line
|
|
begin
|
|
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
|
|
DrawRoundRect(graphics, $E4AD89,r.Left + 1,r.Top + 1, r.Right - 3, r.Bottom - 3, Radius);
|
|
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
|
|
DrawDottedRoundRect(graphics, clGray,r.Left + 2,r.Top + 2, r.Right - 5, r.Bottom - 5, Radius);
|
|
end;
|
|
|
|
ImgX := 0;
|
|
ImgY := 0;
|
|
ImgH := 0;
|
|
ImgW := 0;
|
|
|
|
fontFamily := TGPFontFamily.Create(AFont.Name);
|
|
|
|
if (fontFamily.Status in [FontFamilyNotFound, FontStyleNotFound]) then
|
|
begin
|
|
fontFamily.Free;
|
|
fontFamily := TGPFontFamily.Create('Arial');
|
|
end;
|
|
|
|
nfontFamily := TGPFontFamily.Create(NotesFont.Name);
|
|
|
|
if (nfontFamily.Status in [FontFamilyNotFound, FontStyleNotFound]) then
|
|
begin
|
|
nfontFamily.Free;
|
|
nfontFamily := TGPFontFamily.Create('Arial');
|
|
end;
|
|
|
|
|
|
fs := 0;
|
|
if (fsBold in AFont.Style) then
|
|
fs := fs + 1;
|
|
if (fsItalic in AFont.Style) then
|
|
fs := fs + 2;
|
|
if (fsUnderline in AFont.Style) then
|
|
fs := fs + 4;
|
|
|
|
nfs := 0;
|
|
if (fsBold in NotesFont.Style) then
|
|
nfs := nfs + 1;
|
|
if (fsItalic in NotesFont.Style) then
|
|
nfs := nfs + 2;
|
|
if (fsUnderline in NotesFont.Style) then
|
|
nfs := nfs + 4;
|
|
|
|
if Assigned(Glyph) and not Glyph.Empty and (Glyph.Width > 1) and (Glyph.Height > 1) then
|
|
begin
|
|
ImgW := Glyph.Width;
|
|
ImgH := Glyph.Height;
|
|
|
|
if (ForcePicSize.CX > 0) and (ForcePicSize.CY > 0) then
|
|
begin
|
|
ImgW := ForcePicSize.CX;
|
|
ImgH := ForcePicSize.CY;
|
|
end;
|
|
end
|
|
else if Assigned(Picture) and not Picture.Empty then
|
|
begin
|
|
Picture.GetImageSizes;
|
|
ImgW := Picture.Width;
|
|
ImgH := Picture.Height;
|
|
if (ForcePicSize.CX > 0) and (ForcePicSize.CY > 0) then
|
|
begin
|
|
ImgW := ForcePicSize.CX;
|
|
ImgH := ForcePicSize.CY;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
if (ImageIndex > -1) and Assigned(Images) then
|
|
begin
|
|
ImgW := Images.Width;
|
|
ImgH := Images.Height;
|
|
{end
|
|
else if Assigned(ToolImage) and not (ToolImage.Empty) and (ToolImage.Width > 1) then
|
|
begin
|
|
ImgW := ToolImage.Width;
|
|
ImgH := ToolImage.Height; }
|
|
end;
|
|
end;
|
|
|
|
if DrawCaption and ((Caption <> '') or (WideCaption <> '')) then
|
|
if (ImgW > 0) then
|
|
ImgW := ImgW + Spacing;
|
|
|
|
Result.cx := ImgW;
|
|
Result.cy := ImgH;
|
|
|
|
if (Caption <> '') or (WideCaption <> '') then
|
|
begin
|
|
if pos('\n',caption) > 0 then
|
|
begin
|
|
if (ForcePicSize.cx > 0) and (ForcePicSize.cy > 0) then
|
|
Caption := StringReplace(caption, '\n', ' ', [rfReplaceAll, rfIgnoreCase])
|
|
else
|
|
Caption := StringReplace(caption, '\n', #10#13, [rfReplaceAll, rfIgnoreCase]);
|
|
end;
|
|
|
|
Canvas.Font.Name := AFont.Name;
|
|
|
|
ttf := false;
|
|
|
|
GetTextMetrics(Canvas.Handle, tm);
|
|
|
|
if ((tm.tmPitchAndFamily AND TMPF_VECTOR) = TMPF_VECTOR) then
|
|
begin
|
|
if not ((tm.tmPitchAndFamily AND TMPF_DEVICE) = TMPF_DEVICE) then
|
|
begin
|
|
ttf := true;
|
|
end
|
|
end;
|
|
|
|
if Screen.Fonts.IndexOf(AFont.Name) = -1 then
|
|
ttf := false;
|
|
|
|
font := TGPFont.Create(fontFamily, AFont.Size , fs, UnitPoint);
|
|
|
|
w := BtnR.Right - BtnR.Left;
|
|
h := BtnR.Bottom - BtnR.Top;
|
|
|
|
x1 := r.Left;
|
|
y1 := r.Top;
|
|
x2 := w;
|
|
y2 := h;
|
|
|
|
if AutoSize then
|
|
begin
|
|
x2 := 4096;
|
|
y2 := 4096;
|
|
end;
|
|
|
|
rectf := MakeRect(x1,y1,x2,y2);
|
|
|
|
if WordWrap then
|
|
stringFormat := TGPStringFormat.Create(0)
|
|
else
|
|
stringFormat := TGPStringFormat.Create(GDIP_NOWRAP);
|
|
|
|
if Enabled then
|
|
solidBrush := TGPSolidBrush.Create(ColorToARGB(AFont.Color))
|
|
else
|
|
solidBrush := TGPSolidBrush.Create(ColorToARGB(clGray));
|
|
|
|
// Center-justify each line of text.
|
|
// stringFormat.SetAlignment(StringAlignmentCenter);
|
|
case Layout of
|
|
blGlyphLeftAdjusted: stringFormat.SetAlignment(StringAlignmentNear);
|
|
blGlyphRightAdjusted: stringFormat.SetAlignment(StringAlignmentFar);
|
|
else stringFormat.SetAlignment(StringAlignmentCenter);
|
|
end;
|
|
|
|
// Center the block of text (top to bottom) in the rectangle.
|
|
|
|
case Layout of
|
|
blGlyphTopAdjusted: stringFormat.SetLineAlignment(StringAlignmentNear);
|
|
blGlyphBottomAdjusted: stringFormat.SetLineAlignment(StringAlignmentFar);
|
|
else stringFormat.SetLineAlignment(StringAlignmentCenter);
|
|
end;
|
|
|
|
stringFormat.SetHotkeyPrefix(HotkeyPrefixShow);
|
|
stringFormat.SetTrimming(Trimming);
|
|
|
|
case AntiAlias of
|
|
aaClearType:graphics.SetTextRenderingHint(TextRenderingHintClearTypeGridFit);
|
|
aaAntiAlias:graphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
|
|
end;
|
|
|
|
if (AntiAlias = aaNone) or not ttf then
|
|
begin
|
|
Canvas.Font.Assign(AFont);
|
|
szRect.Left := round(rectf.X);
|
|
szRect.Top := round(rectf.Y);
|
|
|
|
szRect.Right := szRect.Left + 2;
|
|
|
|
if Caption <> '' then
|
|
szRect.Bottom := DrawText(Canvas.Handle,PChar(Caption),Length(Caption), szrect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE{ or DT_VCENTER})
|
|
else
|
|
szRect.Bottom := DrawTextW(Canvas.Handle,PWideChar(WideCaption),Length(WideCaption), szrect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE{ or DT_VCENTER});
|
|
|
|
sizeRect.Width := szRect.Right - szRect.Left;
|
|
sizeRect.Height := szRect.Bottom - szRect.Top;
|
|
|
|
notesRect := Rect(0,0,0,0);
|
|
|
|
if Notes.Text <> '' then
|
|
begin
|
|
Canvas.Font.Assign(NotesFont);
|
|
notesRect.Left := round(rectf.X);
|
|
notesRect.Top := round(rectf.Y);
|
|
notesRect.Right := notesRect.Left + 2;
|
|
notesRect.Bottom := DrawText(Canvas.Handle,PChar(Notes.Text),Length(Notes.Text), notesRect, DT_CALCRECT or DT_LEFT or DT_WORDBREAK);
|
|
|
|
noteRect.Width := notesRect.Right - notesRect.Left;
|
|
noteRect.Height := notesRect.Bottom - notesRect.Top;
|
|
end;
|
|
|
|
case Layout of
|
|
blGlyphLeft:
|
|
begin
|
|
sizeRect.X := (w - (szRect.Right - szRect.Left) - ImgW) div 2;
|
|
sizeRect.Y := szRect.Top;
|
|
Result.cx := ImgW + Spacing + round(sizerect.Width);
|
|
Result.cy := Max(ImgH + Spacing, Spacing + round(sizerect.Height));
|
|
end;
|
|
blGlyphLeftAdjusted:
|
|
begin
|
|
sizeRect.X := szRect.Left;
|
|
sizeRect.Y := szRect.Top;
|
|
Result.cx := ImgW + Spacing + Max(round(sizerect.Width),round(noteRect.Width));
|
|
Result.cy := Max(ImgH + Spacing, Spacing + round(sizerect.Height)+round(noteRect.Height));
|
|
end;
|
|
blGlyphTop:
|
|
begin
|
|
sizeRect.X := szRect.Left;
|
|
sizeRect.Y := (h - (szRect.Bottom - szRect.Top) - ImgH - 2) div 2;
|
|
Result.cx := Max(ImgW + Spacing, Spacing + round(sizerect.Width));
|
|
Result.cy := ImgH + Spacing + round(sizerect.Height);
|
|
end;
|
|
blGlyphTopAdjusted:
|
|
begin
|
|
sizeRect.X := szRect.Left;
|
|
sizeRect.Y := szRect.Top;
|
|
Result.cx := Max(ImgW + Spacing, Spacing + round(sizerect.Width));
|
|
Result.cy := ImgH + Spacing + round(sizerect.Height);
|
|
end;
|
|
blGlyphRight:
|
|
begin
|
|
sizeRect.X := szRect.Left;
|
|
sizeRect.Y := szRect.Top;
|
|
Result.cx := ImgW + Spacing + round(sizerect.Width);
|
|
Result.cy := Max(ImgH + Spacing, Spacing + round(sizerect.Height));
|
|
end;
|
|
blGlyphRightAdjusted:
|
|
begin
|
|
sizeRect.X := szRect.Left;
|
|
sizeRect.Y := szRect.Top;
|
|
Result.cx := ImgW + Spacing + round(sizerect.Width);
|
|
Result.cy := Max(ImgH + Spacing, Spacing + round(sizerect.Height));
|
|
end;
|
|
blGlyphBottom:
|
|
begin
|
|
sizeRect.X := szRect.Left;
|
|
sizeRect.Y := szRect.Top;
|
|
Result.cx := Max(ImgW + Spacing, Spacing + round(sizerect.Width));
|
|
Result.cy := ImgH + Spacing + round(sizerect.Height);
|
|
end;
|
|
blGlyphBottomAdjusted:
|
|
begin
|
|
sizeRect.X := szRect.Left;
|
|
sizeRect.Y := szRect.Top;
|
|
Result.cx := Max(ImgW + Spacing, Spacing + round(sizerect.Width));
|
|
Result.cy := ImgH + Spacing + round(sizerect.Height);
|
|
end;
|
|
end;
|
|
//Result.cx := ImgW + Spacing + round(sizerect.Width);
|
|
//Result.cy := Max(ImgH + Spacing, Spacing + round(sizerect.Height));
|
|
end
|
|
else
|
|
begin
|
|
if Caption <> '' then
|
|
graphics.MeasureString(Caption, Length(Caption), font, rectf, stringFormat, sizeRect)
|
|
else
|
|
graphics.MeasureString(WideCaption, Length(WideCaption), font, rectf, stringFormat, sizeRect);
|
|
|
|
noteRect := MakeRect(0,0,0,0);
|
|
|
|
if Notes.Text <> '' then
|
|
begin
|
|
nfont := TGPFont.Create(nfontFamily, NotesFont.Size , nfs, UnitPoint);
|
|
graphics.MeasureString(Notes.Text, Length(Notes.Text), nfont, rectf, stringFormat, noteRect);
|
|
nfont.Free;
|
|
end;
|
|
|
|
case Layout of
|
|
blGlyphLeft, blGlyphLeftAdjusted, blGlyphRight, blGlyphRightAdjusted:
|
|
begin
|
|
Result.cx := ImgW + Spacing + Max(round(sizerect.Width), round(noteRect.Width));
|
|
Result.cy := Max(ImgH + Spacing, Spacing + round(sizerect.Height)+round(noteRect.Height));
|
|
end;
|
|
blGlyphTop, blGlyphTopAdjusted, blGlyphBottom, blGlyphBottomAdjusted:
|
|
begin
|
|
Result.cx := Max(ImgW + Spacing, Spacing + round(sizerect.Width));
|
|
Result.cy := ImgH + Spacing + round(sizerect.Height);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
if not AutoSize then
|
|
begin
|
|
if not WordWrap then
|
|
begin
|
|
x2 := w;
|
|
y2 := h;
|
|
rectf := MakeRect(x1,y1,x2,y2);
|
|
end;
|
|
|
|
|
|
// if (ImgW > 0) then
|
|
begin
|
|
case Layout of
|
|
blGlyphLeft:
|
|
begin
|
|
if (AntiAlias = aaNone) or not ttf then
|
|
begin
|
|
x1 := sizeRect.X + ImgW;
|
|
x2 := w - 2 - ImgW;
|
|
ImgX := round(sizeRect.X);
|
|
end
|
|
else
|
|
begin
|
|
x1 := r.Left + 2 + ImgW;
|
|
x2 := w - 2 - ImgW;
|
|
ImgX := round(sizerect.X - ImgW div 2);
|
|
end;
|
|
if ImgX < 2 then ImgX := 2;
|
|
ImgY := r.Top + Max(0, (h - ImgH) div 2);
|
|
end;
|
|
blGlyphLeftAdjusted:
|
|
begin
|
|
x1 := r.Left + 2 + ImgW;
|
|
x2 := w - 2 - ImgW;
|
|
|
|
ImgX := round(sizerect.X - ImgW div 2);
|
|
if ImgX < 2 then ImgX := 2;
|
|
ImgY := r.Top + Max(0, (h - ImgH) div 2);
|
|
end;
|
|
blGlyphTop:
|
|
begin
|
|
if (AntiAlias = aaNone) or not ttf then
|
|
begin
|
|
y1 := r.Top + ImgH;
|
|
// y1 := sizeRect.Y + ImgH;
|
|
y2 := h - 2 - ImgH;
|
|
|
|
ImgX := r.Left + Max(0, (w - ImgW) div 2);
|
|
// ImgY := round(sizeRect.Y);
|
|
ImgY := round(y2 - sizerect.Height);
|
|
ImgY := Max(0, ImgY div 2);
|
|
ImgY := round(y1) - ImgH + ImgY - 4;
|
|
end
|
|
else
|
|
begin
|
|
y1 := r.Top + ImgH;
|
|
y2 := h - 2 - ImgH;
|
|
ImgX := r.Left + Max(0, (w - ImgW) div 2);
|
|
ImgY := round(y2 - sizerect.Height);
|
|
ImgY := Max(0, ImgY div 2);
|
|
ImgY := round(y1) - ImgH + ImgY;
|
|
end;
|
|
if ImgY < 2 then ImgY := 2;
|
|
end;
|
|
blGlyphTopAdjusted:
|
|
begin
|
|
y1 := r.Top{ + 2} + ImgH;
|
|
y2 := h - 2 - ImgH;
|
|
|
|
ImgX := r.Left + Max(0, (w - ImgW) div 2);
|
|
if Layout = blGlyphTopAdjusted then
|
|
ImgY := 0 //force to top margin
|
|
else
|
|
ImgY := round(y2 - sizerect.Height);
|
|
ImgY := Max(0, ImgY div 2);
|
|
ImgY := round(y1) - ImgH + ImgY; //round(sizerect.Height) - ImgY - 4;
|
|
if ImgY < 2 then ImgY := 2;
|
|
end;
|
|
blGlyphRight, blGlyphRightAdjusted:
|
|
begin
|
|
x1 := 2;
|
|
x2 := w - 4 - ImgW;
|
|
if Layout = blGlyphRightAdjusted then
|
|
ImgX := w - ImgW - 2
|
|
else
|
|
begin
|
|
|
|
ImgX := round(X2 - sizerect.width);
|
|
ImgX := Max(0, ImgX div 2);
|
|
ImgX := ImgX + round(sizerect.width) + 4;
|
|
if ImgX > (w - ImgW) then
|
|
ImgX := w - ImgW - 2;
|
|
end;
|
|
ImgY := r.Top + Max(0, (h - ImgH) div 2);
|
|
end;
|
|
blGlyphBottom:
|
|
begin
|
|
if (AntiAlias = aaNone) or not ttf then
|
|
begin
|
|
y1 := 2;
|
|
y2 := h - 2 - ImgH;
|
|
|
|
ImgX := r.Left + Max(0, (w - ImgW) div 2);
|
|
ImgY := round(y2 - sizerect.Height);
|
|
ImgY := Max(0, ImgY div 2);
|
|
ImgY := round(sizerect.Height + 5) + ImgY;
|
|
if ImgY > (h - ImgH) then ImgY := h - ImgH - 2;
|
|
end
|
|
else
|
|
begin
|
|
y1 := 2;
|
|
y2 := h - 2 - ImgH;
|
|
|
|
ImgX := r.Left + Max(0, (w - ImgW) div 2);
|
|
ImgY := round(y2 - sizerect.Height);
|
|
ImgY := Max(0, ImgY div 2);
|
|
ImgY := round(sizerect.Height + 2) + ImgY;
|
|
if ImgY > (h - ImgH) then ImgY := h - ImgH - 2;
|
|
end;
|
|
end;
|
|
blGlyphBottomAdjusted:
|
|
begin
|
|
if (AntiAlias = aaNone) or not ttf then
|
|
begin
|
|
y1 := 2;
|
|
y2 := h - 4 - ImgH;
|
|
|
|
ImgX := r.Left + Max(0, (w - ImgW) div 2);
|
|
ImgY := (h - ImgH - 2);
|
|
end
|
|
else
|
|
begin
|
|
y1 := 2;
|
|
y2 := h - 2 - ImgH;
|
|
|
|
ImgX := r.Left + Max(0, (w - ImgW) div 2);
|
|
if Layout = blGlyphBottomAdjusted then
|
|
ImgY := h; //force to bottom margin
|
|
|
|
ImgY := Max(0, ImgY div 2);
|
|
ImgY := round(sizerect.Height + 2) + ImgY;
|
|
if ImgY > (h - ImgH) then ImgY := h - ImgH - 2;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
if OverlapText then
|
|
rectf := MakeRect(r.Left, r.Top, r.Right, r.Bottom)
|
|
else
|
|
rectf := MakeRect(x1, y1, x2, y2);
|
|
|
|
if DrawPic and OverlapText then
|
|
begin
|
|
if Assigned(Glyph) and not Glyph.Empty and (Glyph.Width > 1) and (Glyph.Height > 1) then
|
|
Canvas.Draw(ImgX, ImgY, Glyph);
|
|
end;
|
|
|
|
if DrawCaption then
|
|
begin
|
|
if (AntiAlias = aaNone) or not ttf then
|
|
begin
|
|
szRect.Left := round(rectf.X);
|
|
szRect.Top := round(rectf.Y);
|
|
szRect.Right := szRect.Left + round(rectf.Width);
|
|
szRect.Bottom := szRect.Top + round(rectf.Height);
|
|
|
|
Canvas.Brush.Style := bsClear;
|
|
if WordWrap then
|
|
wwformat := 0
|
|
else
|
|
wwformat := DT_SINGLELINE;
|
|
|
|
uformat := DT_VCENTER or wwformat;
|
|
|
|
case Layout of
|
|
blGlyphLeft:
|
|
begin
|
|
uformat := DT_VCENTER or wwformat or DT_LEFT;
|
|
szrect.Left := szrect.Left;
|
|
end;
|
|
blGlyphLeftAdjusted:
|
|
begin
|
|
uformat := DT_VCENTER or wwformat or DT_LEFT;
|
|
szrect.Left := szrect.Left + 2;
|
|
|
|
if Notes.Text <> '' then
|
|
begin
|
|
uformat := uformat AND NOT DT_VCENTER;
|
|
szrect.Top := ((szRect.Bottom - szRect.Top) - round(sizeRect.Height) - round(noteRect.Height)) div 2;
|
|
end;
|
|
|
|
end;
|
|
blGlyphTop:
|
|
begin
|
|
uformat := DT_TOP or wwformat or DT_CENTER or DT_VCENTER;
|
|
end;
|
|
blGlyphTopAdjusted: uformat := DT_TOP or wwformat or DT_CENTER;
|
|
blGlyphRight: uformat := DT_VCENTER or wwformat or DT_CENTER;
|
|
blGlyphRightAdjusted: uformat := DT_VCENTER or wwformat or DT_RIGHT;
|
|
blGlyphBottom: uformat := DT_VCENTER or wwformat or DT_CENTER;
|
|
blGlyphBottomAdjusted: uformat := DT_BOTTOM or wwformat or DT_CENTER;
|
|
end;
|
|
|
|
tdrect := szrect;
|
|
|
|
Canvas.Font.Assign(AFont);
|
|
|
|
if not Enabled then
|
|
Canvas.Font.Color := clGray;
|
|
|
|
if WordWrap then
|
|
begin
|
|
if Caption <> '' then
|
|
th := DrawText(Canvas.Handle,PChar(Caption),Length(Caption), szrect, uformat or DT_CALCRECT)
|
|
else
|
|
th := DrawTextW(Canvas.Handle,PWideChar(WideCaption),Length(WideCaption), szrect, uformat or DT_CALCRECT);
|
|
|
|
case Layout of
|
|
blGlyphTopAdjusted:
|
|
begin
|
|
// do nothing
|
|
end;
|
|
blGlyphTop:
|
|
begin
|
|
tdrect.Top := ImgY + ImgH;
|
|
tdrect.Top := tdrect.Top + (tdrect.Bottom - tdrect.Top - th) div 2;
|
|
end;
|
|
blGlyphBottomAdjusted:
|
|
begin
|
|
tdrect.Top := tdrect.Bottom - th;
|
|
end;
|
|
else
|
|
begin
|
|
tdrect.Top := (tdrect.Bottom - tdrect.Top - th) div 2;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
if Caption <> '' then
|
|
DrawText(Canvas.Handle,PChar(Caption),Length(Caption), tdrect, uformat)
|
|
else
|
|
DrawTextW(Canvas.Handle,PWideChar(WideCaption),Length(WideCaption), tdrect, uformat);
|
|
|
|
if (Notes.Text <> '') then
|
|
begin
|
|
tdRect.Top := tdRect.Top + round(sizeRect.Height);
|
|
tdRect.Bottom := tdRect.Top + round(noteRect.Height);
|
|
Canvas.Font.Assign(NotesFont);
|
|
DrawText(Canvas.Handle,PChar(Notes.Text),Length(Notes.Text), tdrect, uformat);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
if (Notes.Text <> '') then
|
|
begin
|
|
stringFormat.SetLineAlignment(StringAlignmentNear);
|
|
rectf.Y := rectf.Y + ((rectf.Height) - round(sizeRect.Height) - round(noteRect.Height)) / 2;
|
|
end;
|
|
|
|
if (Caption <> '') then
|
|
graphics.DrawString(Caption, Length(Caption), font, rectf, stringFormat, solidBrush)
|
|
else
|
|
graphics.DrawString(WideCaption, Length(WideCaption), font, rectf, stringFormat, solidBrush);
|
|
|
|
if (Notes.Text <> '') then
|
|
begin
|
|
rectf.Y := rectf.Y + round(sizeRect.Height);
|
|
nfont := TGPFont.Create(nfontFamily, NotesFont.Size , nfs, UnitPoint);
|
|
nsolidBrush := TGPSolidBrush.Create(ColorToARGB(NotesFont.Color));
|
|
graphics.DrawString(Notes.Text, Length(Notes.Text), nfont, rectf, stringFormat, nsolidBrush);
|
|
nsolidBrush.Free;
|
|
nfont.Free;
|
|
end
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
stringformat.Free;
|
|
solidBrush.Free;
|
|
font.Free;
|
|
end;
|
|
|
|
|
|
fontFamily.Free;
|
|
nfontFamily.Free;
|
|
|
|
if not AutoSize then
|
|
begin
|
|
if DropDownButton then
|
|
begin
|
|
if DropDownPos = dpRight then
|
|
w := w - 8
|
|
else
|
|
h := h - 8;
|
|
end;
|
|
|
|
if DrawPic and not OverlapText then
|
|
begin
|
|
if Assigned(Glyph) and not Glyph.Empty and (Glyph.Width > 1) and (Glyph.Height > 1) then
|
|
begin
|
|
if (ForcePicSize.CX > 0) and (ForcePicSize.CY > 0) then
|
|
begin
|
|
Glyph.Transparent := True;
|
|
if (Caption = '') and (WideCaption = '') then
|
|
begin
|
|
px := r.Left + Max(0, (w - ImgW) div 2);
|
|
py := r.Top + Max(0, (h - ImgH) div 2);
|
|
Canvas.StretchDraw(Rect(px, py, px + ForcePicSize.CX, py + ForcePicSize.CY), Glyph);
|
|
end
|
|
else
|
|
Canvas.StretchDraw(Rect(ImgX, ImgY, ImgX + ForcePicSize.CX, ImgY + ForcePicSize.CY), Glyph);
|
|
end
|
|
else
|
|
begin
|
|
if (Caption = '') and (WideCaption = '') then
|
|
Canvas.Draw(r.Left + Max(0, (w - ImgW) div 2), r.Top + Max(0, (h - ImgH) div 2), Glyph)
|
|
else
|
|
Canvas.Draw(ImgX, ImgY, Glyph);
|
|
end;
|
|
end
|
|
else
|
|
if Assigned(Picture) and not Picture.Empty then
|
|
begin
|
|
if (ForcePicSize.CX > 0) and (ForcePicSize.CY > 0) then
|
|
begin
|
|
if (Caption = '') and (WideCaption = '') then
|
|
begin
|
|
px := r.Left + Max(0, (w - ImgW) div 2);
|
|
py := r.Top + Max(0, (h - ImgH) div 2);
|
|
//Canvas.StretchDraw(Rect(px, py, px + ForcePicSize.CX, py + ForcePicSize.CY), Picture);
|
|
DrawStretchPicture(graphics, Canvas, Rect(px, py, px + ForcePicSize.CX, py + ForcePicSize.CY), Picture);
|
|
end
|
|
else
|
|
begin
|
|
//Canvas.StretchDraw(Rect(ImgX, ImgY, ImgX + ForcePicSize.CX, ImgY + ForcePicSize.CY), Picture);
|
|
DrawStretchPicture(graphics, Canvas, Rect(ImgX, ImgY, ImgX + ForcePicSize.CX, ImgY + ForcePicSize.CY), Picture);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
if (Caption = '') and (WideCaption = '') then
|
|
Canvas.Draw(r.Left + Max(0, (w - ImgW) div 2), r.Top + Max(0, (h - ImgH) div 2), Picture)
|
|
else
|
|
Canvas.Draw(ImgX, ImgY, Picture);
|
|
end;
|
|
end
|
|
else
|
|
if (ImageIndex <> -1) and Assigned(Images) then
|
|
begin
|
|
if (Caption = '') and (WideCaption = '') then
|
|
Images.Draw(Canvas, r.Left + Max(0, (w - Images.Width) div 2), r.Top + Max(0, (h - Images.Height) div 2), ImageIndex, EnabledImage)
|
|
else
|
|
begin
|
|
Images.Draw(Canvas, ImgX, ImgY, ImageIndex, EnabledImage);
|
|
end;
|
|
{end
|
|
else if Assigned(ToolImage) and not (ToolImage.Empty) and (ToolImage.Width > 1) then
|
|
begin
|
|
if Caption = '' then
|
|
Canvas.Draw(r.Left + Max(0, (w - ImgW) div 2), r.Top + Max(0, (h - ImgH) div 2), ToolImage)
|
|
else
|
|
Canvas.Draw(ImgX, ImgY, ToolImage); }
|
|
end;
|
|
end;
|
|
|
|
|
|
Canvas.Brush.Style := bsClear;
|
|
|
|
if DropDownButton then
|
|
begin
|
|
if DrawDwLine and DropDownSplit then
|
|
begin
|
|
Canvas.Pen.Color := ColorToRGB(PC);
|
|
if (DropDownPos = dpRight) then
|
|
begin
|
|
Canvas.MoveTo(DwR.Left, DwR.Top);
|
|
Canvas.LineTo(DwR.Left, DwR.Bottom);
|
|
end
|
|
else
|
|
begin
|
|
Canvas.MoveTo(DwR.Left, DwR.Top);
|
|
Canvas.LineTo(DwR.Right, DwR.Top);
|
|
end;
|
|
end;
|
|
|
|
AP.X := DwR.Left + ((DwR.Right - DwR.Left - 5) div 2);
|
|
AP.Y := DwR.Top + ((DwR.Bottom - DwR.Top - 3) div 2) + 1;
|
|
|
|
if not Enabled then
|
|
DrawArrow(Canvas, AP, clGray, clWhite, DropDir)
|
|
else
|
|
DrawArrow(Canvas, AP, clBlack, clWhite, DropDir);
|
|
end;
|
|
end;
|
|
|
|
graphics.Free;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
{TWinCtrl}
|
|
|
|
procedure TWinCtrl.PaintCtrls(DC: HDC; First: TControl);
|
|
begin
|
|
PaintControls(DC, First);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
{ TAdvGlowButton }
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
procedure TAdvCustomGlowButton.CMMouseEnter(var Msg: TMessage);
|
|
begin
|
|
inherited;
|
|
|
|
if Assigned(FOnMouseEnter) then
|
|
FOnMouseEnter(Self);
|
|
|
|
if (csDesigning in ComponentState) then
|
|
Exit;
|
|
|
|
if FMouseEnter then
|
|
Exit;
|
|
|
|
FHot := true;
|
|
|
|
if FLeftDown then
|
|
FDown := true;
|
|
|
|
if not Assigned(FTimer) then
|
|
begin
|
|
FTimer := TTimer.Create(self);
|
|
FTimer.OnTimer := TimerProc;
|
|
FTimer.Interval := GlowSpeed;
|
|
FTimer.Enabled := true;
|
|
end;
|
|
|
|
if not FDown and (GlowState <> gsPush) then
|
|
begin
|
|
FTimeInc := 20;
|
|
GlowState := gsHover;
|
|
end;
|
|
Invalidate;
|
|
|
|
FMouseInControl := true;
|
|
FMouseEnter := true;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.CMMouseLeave(var Msg: TMessage);
|
|
begin
|
|
inherited;
|
|
|
|
if Assigned(FOnMouseLeave) then
|
|
FOnMouseLeave(Self);
|
|
|
|
if (csDesigning in ComponentState) then
|
|
Exit;
|
|
|
|
if not FMouseEnter then
|
|
Exit;
|
|
|
|
FMouseEnter := false;
|
|
FMouseInControl := false;
|
|
|
|
FHot := false;
|
|
FInButton := false;
|
|
|
|
// Repaint;
|
|
|
|
// down process busy
|
|
if FDown and FMouseDown then
|
|
begin
|
|
FDown := False;
|
|
FTimeInc := -20;
|
|
GlowState := gsHover;
|
|
Invalidate;
|
|
FLeftDown := true;
|
|
end
|
|
else
|
|
//if not (Style = bsCheck) then
|
|
begin
|
|
FDown := false;
|
|
FStepHover := 100;
|
|
FTimeInc := -20;
|
|
GlowState := gsHover;
|
|
Invalidate;
|
|
end;
|
|
|
|
if not Assigned(FTimer) then
|
|
begin
|
|
FTimer := TTimer.Create(self);
|
|
FTimer.OnTimer := TimerProc;
|
|
FTimer.Interval := GlowSpeed;
|
|
FTimer.Enabled := true;
|
|
end;
|
|
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.CMTextChanged(var Message: TMessage);
|
|
begin
|
|
Invalidate;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.CNCommand(var Message: TWMCommand);
|
|
begin
|
|
if Message.NotifyCode = BN_CLICKED then
|
|
Click;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
constructor TAdvCustomGlowButton.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
FTimer := nil;
|
|
FImageIndex := -1;
|
|
DoubleBuffered := true;
|
|
FGroupIndex := 0;
|
|
FState := absUp;
|
|
FStyle := bsButton;
|
|
FTransparent := False;
|
|
FLayout := blGlyphLeft;
|
|
FDropDownButton := False;
|
|
FDropDownPosition := dpRight;
|
|
FDropDownDirection := ddDown;
|
|
FDropDownSplit := true;
|
|
FShowCaption := true;
|
|
FFocusType := ftBorder;
|
|
FShortCutHint := nil;
|
|
FShortCutHintPos := shpTop;
|
|
FShowDisabled := true;
|
|
FOverlappedText := false;
|
|
FSpacing := 2;
|
|
FWordWrap := true;
|
|
FFirstPaint := true;
|
|
FMarginVert := 2;
|
|
FMarginHorz := 2;
|
|
FRounded := true;
|
|
FInitRepeatPause := 400;
|
|
FRepeatPause := 100;
|
|
FRepeatClick := false;
|
|
|
|
FIPicture := TGDIPPicture.Create;
|
|
FIPicture.OnChange := PictureChanged;
|
|
|
|
FIDisabledPicture := TGDIPPicture.Create;
|
|
FIDisabledPicture.OnChange := PictureChanged;
|
|
FIHotPicture := TGDIPPicture.Create;
|
|
|
|
ParentFont := true;
|
|
FAppearance := TGlowButtonAppearance.Create;
|
|
FAppearance.OnChange := OnAppearanceChanged;
|
|
FInternalImages := nil;
|
|
FAntiAlias := aaClearType;
|
|
FBorderStyle := bsSingle;
|
|
|
|
FOfficeHint := TAdvHintInfo.Create;
|
|
|
|
Width := 100;
|
|
Height := 41;
|
|
|
|
FDefaultPicDrawing := True;
|
|
FDefaultCaptionDrawing := True;
|
|
FTrimming := StringTrimmingNone;
|
|
|
|
FCommandID := -1;
|
|
|
|
FButtonSizeState := bsLarge;
|
|
FMaxButtonSizeState := bsLarge;
|
|
FMinButtonSizeState := bsGlyph;
|
|
FOldLayout := Layout;
|
|
FOldDropDownPosition := DropDownPosition;
|
|
|
|
FNotes := TStringList.Create;
|
|
FNotesFont := TFont.Create;
|
|
FNotesFont.Name := 'Tahoma';
|
|
FNotesFont.Size := 8;
|
|
end;
|
|
|
|
|
|
procedure TAdvCustomGlowButton.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
inherited;
|
|
// if FTransparent then
|
|
// Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.CreateWnd;
|
|
begin
|
|
inherited;
|
|
FActive := FDefault;
|
|
FParentForm := GetParentForm(Self);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
destructor TAdvCustomGlowButton.Destroy;
|
|
begin
|
|
if Assigned(FShortCutHint) then
|
|
FShortCutHint.Free;
|
|
FOfficeHint.Free;
|
|
FAppearance.Free;
|
|
FIPicture.Free;
|
|
FIDisabledPicture.Free;
|
|
FIHotPicture.Free;
|
|
FNotes.Free;
|
|
FNotesFont.Free;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.DoEnter;
|
|
begin
|
|
inherited;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.DoExit;
|
|
begin
|
|
inherited;
|
|
FDown := false;
|
|
FState := absUp;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.ShowShortCutHint;
|
|
var
|
|
pt: TPoint;
|
|
begin
|
|
if not Assigned(FShortCutHint) then
|
|
begin
|
|
FShortCutHint := TShortCutHintWindow.Create(Self);
|
|
FShortCutHint.Parent := Self;
|
|
FShortCutHint.Visible := False;
|
|
FShortCutHint.Color := clWhite;
|
|
FShortCutHint.ColorTo := Appearance.Color;
|
|
end;
|
|
|
|
FShortCutHint.Caption := FShortCutHintText;
|
|
|
|
pt := ClientToScreen(Point(0,0));
|
|
|
|
case ShortCutHintPos of
|
|
shpLeft:
|
|
begin
|
|
FShortCutHint.Left := pt.X - (FShortCutHint.Width div 2);
|
|
FShortCutHint.Top := pt.Y + (self.Height - FShortCutHint.Height) div 2;
|
|
end;
|
|
shpTop:
|
|
begin
|
|
FShortCutHint.Left := pt.X + (self.Width - FShortCutHint.Width) div 2;
|
|
FShortCutHint.Top := pt.Y - (FShortCutHint.Height div 2);
|
|
end;
|
|
shpRight:
|
|
begin
|
|
FShortCutHint.Left := pt.X + self.Width - (FShortCutHint.Width div 2);
|
|
FShortCutHint.Top := pt.Y + (self.Height - FShortCutHint.Height) div 2;
|
|
end;
|
|
shpBottom:
|
|
begin
|
|
FShortCutHint.Left := pt.X + (self.Width - FShortCutHint.Width) div 2;
|
|
FShortCutHint.Top := pt.Y + self.Height - (FShortCutHint.Height div 2);
|
|
end;
|
|
shpCenter:
|
|
begin
|
|
FShortCutHint.Left := pt.X + (self.Width - FShortCutHint.Width) div 2;
|
|
FShortCutHint.Top := pt.Y + (self.Height - FShortCutHint.Height) div 2;
|
|
end;
|
|
end;
|
|
|
|
FShortCutHint.Visible := true;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.HideShortCutHint;
|
|
begin
|
|
if Assigned(FShortCutHint) then
|
|
begin
|
|
FShortCutHint.Visible := false;
|
|
//FShortCutHint.Free;
|
|
//FShortCutHint := nil;
|
|
end;
|
|
end;
|
|
|
|
function TAdvCustomGlowButton.GetVersion: string;
|
|
var
|
|
vn: Integer;
|
|
begin
|
|
vn := GetVersionNr;
|
|
Result := IntToStr(Hi(Hiword(vn))) + '.' + IntToStr(Lo(Hiword(vn))) +
|
|
'.' + IntToStr(Hi(Loword(vn))) + '.' + IntToStr(Lo(Loword(vn)));
|
|
end;
|
|
|
|
function TAdvCustomGlowButton.GetVersionNr: Integer;
|
|
begin
|
|
Result := MakeLong(MakeWord(BLD_VER, REL_VER), MakeWord(MIN_VER, MAJ_VER));
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.KeyDown(var Key: Word; Shift: TShiftState);
|
|
begin
|
|
inherited;
|
|
if (Key in [VK_SPACE, VK_RETURN]) then
|
|
begin
|
|
FDown := True;
|
|
FState := absDown;
|
|
Repaint;
|
|
end;
|
|
|
|
if (Key = VK_F4) then
|
|
DoDropDown;
|
|
|
|
if Assigned(FOnInternalKeyDown) then
|
|
FOnInternalKeyDown(Self, Key, Shift);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.WMGetDlgCode(var Message: TMessage);
|
|
begin
|
|
if Assigned(FOnInternalKeyDown) then
|
|
Message.Result := DLGC_WANTARROWS
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.KeyPress(var Key: Char);
|
|
var
|
|
Form: TCustomForm;
|
|
begin
|
|
inherited;
|
|
|
|
if (Key in [#32, #13]) then
|
|
begin
|
|
Form := GetParentForm(Self);
|
|
if Form <> nil then
|
|
Form.ModalResult := ModalResult;
|
|
|
|
if Assigned(OnClick) then
|
|
OnClick(Self);
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.KeyUp(var Key: Word; Shift: TShiftState);
|
|
begin
|
|
inherited;
|
|
FDown := False;
|
|
FState := absUp;
|
|
Repaint;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.Assign(Source: TPersistent);
|
|
begin
|
|
if (Source is TAdvCustomGlowButton) then
|
|
begin
|
|
Align := (Source as TAdvCustomGlowButton).Align;
|
|
Action := (Source as TAdvCustomGlowButton).Action;
|
|
Anchors := (Source as TAdvCustomGlowButton).Anchors;
|
|
AntiAlias := (Source as TAdvCustomGlowButton).AntiAlias;
|
|
AutoSize := (Source as TAdvCustomGlowButton).AutoSize;
|
|
BorderStyle := (Source as TAdvCustomGlowButton).BorderStyle;
|
|
Cancel := (Source as TAdvCustomGlowButton).Cancel;
|
|
Caption := (Source as TAdvCustomGlowButton).Caption;
|
|
Constraints := (Source as TAdvCustomGlowButton).Constraints;
|
|
Default := (Source as TAdvCustomGlowButton).Default;
|
|
Font.Assign((Source as TAdvCustomGlowButton).Font);
|
|
ImageIndex := (Source as TAdvCustomGlowButton).ImageIndex;
|
|
Images.Assign((Source as TAdvCustomGlowButton).Images);
|
|
DisabledImages.Assign((Source as TAdvCustomGlowButton).DisabledImages);
|
|
DisabledPicture.Assign((Source as TAdvCustomGlowButton).DisabledPicture);
|
|
DragMode := (Source as TAdvCustomGlowButton).DragMode;
|
|
DragKind := (Source as TAdvCustomGlowButton).DragKind;
|
|
FocusType := (Source as TAdvCustomGlowButton).FocusType;
|
|
HotImages.Assign((Source as TAdvCustomGlowButton).HotImages);
|
|
HotPicture.Assign((Source as TAdvCustomGlowButton).HotPicture);
|
|
MarginVert := (Source as TAdvCustomGlowButton).MarginVert;
|
|
MarginHorz := (Source as TAdvCustomGlowButton).MarginHorz;
|
|
ModalResult := (Source as TAdvCustomGlowButton).ModalResult;
|
|
Notes.Assign((Source as TAdvCustomGlowButton).Notes);
|
|
NotesFont.Assign((Source as TAdvCustomGlowButton).NotesFont);
|
|
OfficeHint.Assign((Source as TAdvCustomGlowButton).OfficeHint);
|
|
ParentFont := (Source as TAdvCustomGlowButton).ParentFont;;
|
|
Picture.Assign((Source as TAdvCustomGlowButton).Picture);
|
|
PopupMenu := (Source as TAdvCustomGlowButton).PopupMenu;
|
|
Position := (Source as TAdvCustomGlowButton).Position;
|
|
InitRepeatPause := (Source as TAdvCustomGlowButton).InitRepeatPause;
|
|
RepeatPause := (Source as TAdvCustomGlowButton).RepeatPause;
|
|
RepeatClick := (Source as TAdvCustomGlowButton).RepeatClick;
|
|
Rounded := (Source as TAdvCustomGlowButton).Rounded;
|
|
ShortCutHint := (Source as TAdvCustomGlowButton).ShortCutHint;
|
|
ShortCutHintPos := (Source as TAdvCustomGlowButton).ShortCutHintPos;
|
|
ShowCaption := (Source as TAdvCustomGlowButton).ShowCaption;
|
|
ShowDisabled := (Source as TAdvCustomGlowButton).ShowDisabled;
|
|
Spacing := (Source as TAdvCustomGlowButton).Spacing;
|
|
Transparent := (Source as TAdvCustomGlowButton).Transparent;
|
|
Trimming := (Source as TAdvCustomGlowButton).Trimming;
|
|
Version := (Source as TAdvCustomGlowButton).Version;
|
|
WordWrap := (Source as TAdvCustomGlowButton).WordWrap;
|
|
ShowHint := (Source as TAdvCustomGlowButton).ShowHint;
|
|
TabOrder := (Source as TAdvCustomGlowButton).TabOrder;
|
|
TabStop := (Source as TAdvCustomGlowButton).TabStop;
|
|
Visible := (Source as TAdvCustomGlowButton).Visible;
|
|
end;
|
|
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.Click;
|
|
var
|
|
Form: TCustomForm;
|
|
begin
|
|
Form := GetParentForm(Self);
|
|
if Form <> nil then Form.ModalResult := ModalResult;
|
|
if Assigned(FOnInternalClick) then
|
|
FOnInternalClick(Self);
|
|
inherited;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.Loaded;
|
|
begin
|
|
inherited;
|
|
if (Down <> FInitialDown) then
|
|
Down := FInitialDown;
|
|
FIsVista := IsVista;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.DoDropDown;
|
|
var
|
|
pt: TPoint;
|
|
begin
|
|
if IsMenuButton or Assigned(FDropDownMenu) then
|
|
begin
|
|
{State := absDropDown;
|
|
Invalidate;
|
|
CheckMenuDropdown; }
|
|
|
|
if Assigned(FDropDownMenu) then
|
|
begin
|
|
//FDown := false;
|
|
//FHot := false;
|
|
FState := absDown;
|
|
PopupBtnDown;
|
|
Invalidate;
|
|
|
|
if DropDownDirection = ddDown then
|
|
pt := Point(Left, Top + Height)
|
|
else
|
|
pt := Point(Left + Width, Top);
|
|
|
|
pt := Parent.ClientToScreen(pt);
|
|
FDropDownMenu.Popup(pt.X,pt.Y);
|
|
|
|
FState := absUp;
|
|
Repaint;
|
|
end;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
function TAdvCustomGlowButton.IsFontStored: Boolean;
|
|
begin
|
|
Result := not ParentFont;
|
|
end;
|
|
|
|
function TAdvCustomGlowButton.IsMenuButton: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.TimerExpired(Sender: TObject);
|
|
begin
|
|
FRepeatTimer.Interval := RepeatPause;
|
|
if (FDown) and MouseCapture then
|
|
begin
|
|
try
|
|
Click;
|
|
except
|
|
FRepeatTimer.Enabled := False;
|
|
raise;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.MouseUp(Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
inherited MouseUp(Button, Shift, X, Y);
|
|
if FRepeatTimer <> nil then
|
|
FRepeatTimer.Enabled := False;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
|
|
Y: Integer);
|
|
var
|
|
pt:TPoint;
|
|
InBottomDrop,InRightDrop: boolean;
|
|
InSepBtn: boolean;
|
|
|
|
begin
|
|
inherited;
|
|
|
|
if Button <> mbLeft then
|
|
Exit;
|
|
|
|
if FRepeatClick then
|
|
begin
|
|
if FRepeatTimer = nil then
|
|
FRepeatTimer := TTimer.Create(Self);
|
|
|
|
FRepeatTimer.OnTimer := TimerExpired;
|
|
FRepeatTimer.Interval := InitRepeatPause;
|
|
FRepeatTimer.Enabled := True;
|
|
end;
|
|
|
|
|
|
FDown := true;
|
|
FMouseDown := true;
|
|
|
|
if TabStop then
|
|
SetFocus;
|
|
|
|
if not Assigned(FTimer) then
|
|
begin
|
|
FTimer := TTimer.Create(self);
|
|
FTimer.OnTimer := TimerProc;
|
|
FTimer.Interval := GlowSpeed;
|
|
FTimer.Enabled := true;
|
|
end;
|
|
|
|
//FStepPush := 0;
|
|
FTimeInc := +20;
|
|
GlowState := gsPush;
|
|
|
|
if not DropDownButton and IsMenuButton and false then
|
|
begin
|
|
Invalidate;
|
|
DoDropDown;
|
|
end;
|
|
|
|
InBottomDrop := (DropDownPosition = dpRight) and (X > (Width - DropDownSectWidth));
|
|
InRightDrop := (DropDownPosition = dpBottom) and (Y > (Height - DropDownSectWidth));
|
|
|
|
InSepBtn := (InBottomDrop or InRightDrop);
|
|
|
|
|
|
if (not FDropDownButton and IsMenuButton) or
|
|
(FDropDownButton and InSepBtn and DropDownSplit) or
|
|
(FDropDownButton and not DropDownSplit and (not ((Style = bsCheck) or (GroupIndex > 0))))
|
|
then
|
|
begin
|
|
// FState := absUp;
|
|
FMouseInControl := False;
|
|
// FMouseDownInControl := False;
|
|
PopupBtnDown;
|
|
|
|
if Assigned(FDropDownMenu) then
|
|
begin
|
|
FDown := false;
|
|
FHot := false;
|
|
SetDroppedDown(True);
|
|
FMouseEnter := true;
|
|
//FMenuSel := true;
|
|
Repaint;
|
|
|
|
if DropDownDirection = ddDown then
|
|
pt := Point(Left, Top + Height)
|
|
else
|
|
pt := Point(Left + Width, Top);
|
|
|
|
pt := Parent.ClientToScreen(pt);
|
|
//if Assigned(AdvToolBar) then
|
|
//FDropDownMenu.MenuStyler := AdvToolBar.FCurrentToolBarStyler.CurrentAdvMenuStyler;
|
|
FDropDownMenu.Popup(pt.X,pt.Y);
|
|
SetDroppedDown(False);
|
|
//FMenuSel := false;
|
|
|
|
GetCursorPos(pt);
|
|
pt := ScreenToClient(pt);
|
|
if not PtInRect(ClientRect, pt) then
|
|
begin
|
|
FMouseEnter := false;
|
|
FMouseInControl := false;
|
|
FHot := false;
|
|
FInButton := false;
|
|
end;
|
|
Repaint;
|
|
end;
|
|
|
|
Invalidate;
|
|
|
|
Exit;
|
|
end
|
|
else
|
|
begin
|
|
if (Style = bsCheck) then
|
|
SetDown(not FDownChecked);
|
|
|
|
if not FDownChecked then
|
|
begin
|
|
FState := absDown;
|
|
Invalidate;
|
|
end;
|
|
|
|
if (Style = bsCheck) then
|
|
begin
|
|
FState := absDown;
|
|
Repaint;
|
|
end;
|
|
|
|
FDragging := True;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.InternalClick;
|
|
begin
|
|
if (not FDropDownButton and IsMenuButton) or (FDropDownButton and not ((Style = bsCheck) or (GroupIndex > 0)) and
|
|
(not DropDownSplit)) then
|
|
begin
|
|
|
|
end
|
|
else
|
|
begin
|
|
if Style = bsCheck then
|
|
SetDown(not FDownChecked);
|
|
|
|
if not FDownChecked then
|
|
begin
|
|
FState := absDown;
|
|
Invalidate;
|
|
end;
|
|
|
|
if (Style = bsCheck) then
|
|
begin
|
|
FState := absDown;
|
|
Repaint;
|
|
end;
|
|
end;
|
|
|
|
Click;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.WMLDblClk(var Msg: TWMLButtonDblClk);
|
|
begin
|
|
inherited;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.WMPaint(var Msg: TWMPaint);
|
|
var
|
|
DC, MemDC: HDC;
|
|
MemBitmap, OldBitmap: HBITMAP;
|
|
PS: TPaintStruct;
|
|
begin
|
|
if not FDoubleBuffered or (Msg.DC <> 0) then
|
|
begin
|
|
if not (csCustomPaint in ControlState) and (ControlCount = 0) then
|
|
inherited
|
|
else
|
|
PaintHandler(Msg);
|
|
end
|
|
else
|
|
begin
|
|
DC := GetDC(0);
|
|
MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom);
|
|
ReleaseDC(0, DC);
|
|
MemDC := CreateCompatibleDC(0);
|
|
OldBitmap := SelectObject(MemDC, MemBitmap);
|
|
try
|
|
DC := BeginPaint(Handle, PS);
|
|
Perform(WM_ERASEBKGND, MemDC, MemDC);
|
|
Msg.DC := MemDC;
|
|
WMPaint(Msg);
|
|
Msg.DC := 0;
|
|
BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY);
|
|
EndPaint(Handle, PS);
|
|
finally
|
|
SelectObject(MemDC, OldBitmap);
|
|
DeleteDC(MemDC);
|
|
DeleteObject(MemBitmap);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
(*
|
|
begin
|
|
{$IFDEF VER185}
|
|
if TForm(FParentForm).FormStyle = fsMDIChild then
|
|
begin
|
|
DoubleBuffered := (Application.MainForm.ActiveMDIChild = FParentForm);
|
|
end
|
|
else
|
|
DoubleBuffered := (FParentForm.Handle = GetActiveWindow);
|
|
{$ENDIF}
|
|
inherited;
|
|
*)
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
procedure TAdvCustomGlowButton.WMLButtonUp(var Msg:TWMLButtonDown);
|
|
var
|
|
DoClick: Boolean;
|
|
|
|
begin
|
|
FTimeInc := -20;
|
|
GlowState := gsPush;
|
|
|
|
FMouseDown := false;
|
|
FLeftDown := false;
|
|
|
|
if not Assigned(FTimer) then
|
|
begin
|
|
FTimer := TTimer.Create(self);
|
|
FTimer.OnTimer := TimerProc;
|
|
FTimer.Interval := GlowSpeed;
|
|
FTimer.Enabled := true;
|
|
end;
|
|
|
|
if not DropDownButton and IsMenuButton then
|
|
begin
|
|
// do nothing
|
|
end
|
|
else
|
|
if FDragging then
|
|
begin
|
|
FDragging := False;
|
|
|
|
DoClick := (Msg.XPos >= 0) and (Msg.XPos < ClientWidth) and (Msg.YPos >= 0) and (Msg.YPos <= ClientHeight);
|
|
|
|
if (FGroupIndex = 0) then
|
|
begin
|
|
// Redraw face in-case mouse is captured
|
|
FState := absUp;
|
|
FMouseInControl := False;
|
|
//FHot := false;
|
|
|
|
if (Style = bsCheck) then
|
|
begin
|
|
if Assigned(Action) then
|
|
begin
|
|
inherited;
|
|
if (FCheckLinked or FGroupIndexLinked) then
|
|
Exit;
|
|
end;
|
|
|
|
// ***** extension for toolbar compactbutton handling
|
|
if not DoClick and Self.Down then
|
|
begin
|
|
Self.Down := not Self.Down;
|
|
end;
|
|
|
|
if (Style <> bsCheck) then
|
|
SetDown(not FDownChecked);
|
|
|
|
//FState := absUp;
|
|
Repaint;
|
|
end;
|
|
if DoClick and not (FState in [absExclusive, absDown]) then
|
|
Invalidate;
|
|
end
|
|
else
|
|
begin
|
|
if Assigned(Action) then
|
|
if FCheckLinked or FGroupIndexLinked then
|
|
begin
|
|
inherited;
|
|
Exit;
|
|
end;
|
|
|
|
if DoClick then
|
|
begin
|
|
SetDown(not FDownChecked);
|
|
if FDownChecked then
|
|
Repaint;
|
|
end
|
|
else
|
|
begin
|
|
if FDownChecked then
|
|
FState := absExclusive;
|
|
Repaint;
|
|
end;
|
|
|
|
end;
|
|
|
|
//if DoClick then
|
|
// Click;
|
|
|
|
UpdateTracking;
|
|
end;
|
|
|
|
ControlState := ControlState + [csClicked];
|
|
|
|
inherited;
|
|
|
|
if (Style = bsCheck) or (GroupIndex > 0) then
|
|
begin
|
|
//FState := absUp;
|
|
Repaint;
|
|
//FHot := true;
|
|
//FMouseInControl := true;
|
|
end;
|
|
|
|
Invalidate;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.Notification(AComponent: TComponent;
|
|
AOperation: TOperation);
|
|
begin
|
|
inherited;
|
|
if (AOperation = opRemove) and (AComponent = FImages) then
|
|
FImages := nil;
|
|
|
|
if (AOperation = opRemove) and (AComponent = FDisabledImages) then
|
|
FDisabledImages := nil;
|
|
|
|
if (AOperation = opRemove) and (AComponent = FHotImages) then
|
|
begin
|
|
FHotImages := nil;
|
|
end;
|
|
|
|
if (AOperation = opRemove) and (AComponent = DropdownMenu) then
|
|
DropdownMenu := nil;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.DrawGlyphCaption;
|
|
begin
|
|
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.GetToolImage(bmp: TBitmap);
|
|
begin
|
|
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetDroppedDown(Value: Boolean);
|
|
begin
|
|
FDroppedDown := Value;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.Paint;
|
|
var
|
|
GradColor: TColor;
|
|
GradColorTo: TColor;
|
|
GradColorMirror: TColor;
|
|
GradColorMirrorTo: TColor;
|
|
PenColor: TColor;
|
|
GradB, GradU: TGDIPGradient;
|
|
DrawDwLn: Boolean;
|
|
ImgList: TImageList;
|
|
Pic: TGDIPPicture;
|
|
EnabledImg: Boolean;
|
|
Rgn1, Rgn2: HRGN;
|
|
R: TRect;
|
|
i, w, h: Integer;
|
|
p: TPoint;
|
|
DCaption: string;
|
|
DWideCaption: widestring;
|
|
BD: TButtonDisplay;
|
|
DrawFocused, DrawFocusedHot: boolean;
|
|
bmp: TBitmap;
|
|
sz: TSize;
|
|
gs: TGlowButtonState;
|
|
PicSize: TSize;
|
|
AFont: TFont;
|
|
|
|
begin
|
|
if FTransparent and not FMouseEnter then
|
|
begin
|
|
// TRANSPARENCY CODE
|
|
|
|
R := ClientRect;
|
|
rgn1 := CreateRectRgn(R.Left, R.Top, R.Right, R.Bottom);
|
|
SelectClipRgn(Canvas.Handle, rgn1);
|
|
|
|
i := SaveDC(Canvas.Handle);
|
|
p := ClientOrigin;
|
|
Windows.ScreenToClient(Parent.Handle, p);
|
|
p.x := -p.x;
|
|
p.y := -p.y;
|
|
MoveWindowOrg(Canvas.Handle, p.x, p.y);
|
|
|
|
SendMessage(Parent.Handle, WM_ERASEBKGND, Canvas.Handle, 0);
|
|
// transparency ?
|
|
SendMessage(Parent.Handle, WM_PAINT, Canvas.Handle, 0);
|
|
|
|
if (Parent is TWinCtrl) then
|
|
(Parent as TWinCtrl).PaintCtrls(Canvas.Handle, nil);
|
|
|
|
RestoreDC(Canvas.Handle, i);
|
|
|
|
SelectClipRgn(Canvas.Handle, 0);
|
|
DeleteObject(rgn1);
|
|
end;
|
|
|
|
if not Enabled then
|
|
begin
|
|
FState := absDisabled;
|
|
FDragging := False;
|
|
end
|
|
else
|
|
begin
|
|
if (FState = absDisabled) then
|
|
if FDownChecked and (GroupIndex <> 0) then
|
|
FState := absExclusive
|
|
else
|
|
FState := absUp;
|
|
end;
|
|
|
|
|
|
if (Style = bsCheck) and (Down) then
|
|
begin
|
|
FState := absDown;
|
|
end;
|
|
|
|
with Appearance do
|
|
begin
|
|
DrawDwLn := False;
|
|
if ((State = absDisabled) or not Enabled) and FShowDisabled then
|
|
begin
|
|
if (1>0) {Transparent} then
|
|
begin
|
|
GradColor := FColorDisabled;
|
|
GradColorTo := FColorDisabledTo;
|
|
GradColorMirror := FColorMirrorDisabled;
|
|
GradColorMirrorTo := FColorMirrorDisabledTo;
|
|
PenColor := BorderColorDisabled;
|
|
GradU := GradientDisabled;
|
|
GradB := GradientMirrorDisabled;
|
|
end
|
|
else
|
|
begin
|
|
end;
|
|
end
|
|
else if ((State = absDown) {or (FHot and (State = absExclusive))}{ or FDown}) and not ((Style = bsCheck) and (State = absDown)) then
|
|
begin
|
|
GradColor := FColorDown;
|
|
GradColorTo := FColorDownTo;
|
|
GradColorMirror := FColorMirrorDown;
|
|
GradColorMirrorTo := FColorMirrorDownTo;
|
|
PenColor := BorderColorDown;
|
|
GradU := GradientDown;
|
|
GradB := GradientMirrorDown;
|
|
DrawDwLn := True;
|
|
end
|
|
else
|
|
if (State = absExclusive) or ((Style = bsCheck) and (State = absDown)) then
|
|
begin
|
|
GradColor := FColorChecked;
|
|
GradColorTo := FColorCheckedTo;
|
|
GradColorMirror := FColorMirrorChecked;
|
|
GradColorMirrorTo := FColorMirrorCheckedTo;
|
|
PenColor := BorderColorChecked;
|
|
GradU := GradientChecked;
|
|
GradB := GradientMirrorChecked;
|
|
|
|
if Assigned(FTimer) and not (not FMouseInControl and ((Style = bsCheck) or ((GroupIndex > 0) and (State <> absDown)))) then
|
|
begin
|
|
GradColor := BlendColor(FColorChecked, FColorDown, FStepPush);
|
|
GradColorTo := BlendColor(FColorCheckedTo, FColorDownTo, FStepPush);
|
|
GradColorMirror := BlendColor(FColorMirrorChecked, FColorMirrorDown, FStepPush);
|
|
GradColorMirrorTo := BlendColor(FColorMirrorCheckedTo, FColorMirrorDownTo, FStepPush);
|
|
//PenColor := BlendColor(BorderColorChecked, BorderColorDown, FStepPush);
|
|
end;
|
|
|
|
end
|
|
else //if State = absUp then
|
|
begin
|
|
if FHot then
|
|
begin
|
|
GradColor := FColorHot;
|
|
GradColorTo := FColorHotTo;
|
|
GradColorMirror := FColorMirrorHot;
|
|
GradColorMirrorTo := FColorMirrorHotTo;
|
|
PenColor := BorderColorHot;
|
|
GradU := GradientHot;
|
|
GradB := GradientMirrorHot;
|
|
DrawDwLn := True;
|
|
end
|
|
else // Normal draw
|
|
begin
|
|
if (1>0) {Transparent} then
|
|
begin
|
|
GradColor := FColor;
|
|
GradColorTo := FColorTo;
|
|
GradColorMirror := FColorMirror;
|
|
GradColorMirrorTo := FColorMirrorTo;
|
|
PenColor := BorderColor;
|
|
GradU := Gradient;
|
|
GradB := GradientMirror;
|
|
end
|
|
else
|
|
begin
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ if FHot then
|
|
begin
|
|
GradColor := FColorHot;
|
|
GradColorTo := FColorHotTo;
|
|
GradColorMirror := FColorMirrorHot;
|
|
GradColorMirrorTo := FColorMirrorHotTo;
|
|
PenColor := BorderColorHot;
|
|
GradU := GradientHot;
|
|
GradB := GradientMirrorHot;
|
|
end
|
|
else
|
|
begin
|
|
GradColor := FColor;
|
|
GradColorTo := FColorTo;
|
|
GradColorMirror := FColorMirror;
|
|
GradColorMirrorTo := FColorMirrorTo;
|
|
PenColor := BorderColor;
|
|
GradU := Gradient;
|
|
GradB := GradientMirror;
|
|
end;
|
|
|
|
if FDown then
|
|
begin
|
|
PenColor := BorderColorDown;
|
|
GradU := GradientDown;
|
|
GradB := GradientMirrorDown;
|
|
end;
|
|
}
|
|
|
|
if Assigned(FTimer) then
|
|
begin
|
|
if not FDown and not Transparent and not ((State = absExclusive) or ((Style = bsCheck) and (State = absDown))) then
|
|
begin
|
|
GradColor := BlendColor(FColorHot, FColor, FStepHover);
|
|
GradColorTo := BlendColor(FColorHotTo, FColorTo, FStepHover);
|
|
GradColorMirror := BlendColor(FColorMirrorHot, FColorMirror, FStepHover);
|
|
GradColorMirrorTo := BlendColor(FColorMirrorHotTo, FColorMirrorTo, FStepHover);
|
|
PenColor := BlendColor(BorderColorHot, BorderColor, FStepHover);
|
|
end
|
|
else
|
|
begin
|
|
if (Style = bsCheck) then
|
|
begin
|
|
if FDown then
|
|
begin
|
|
GradColor := BlendColor(FColorDown, FColorChecked, FStepPush);
|
|
GradColorTo := BlendColor(FColorDownTo, FColorCheckedTo, FStepPush);
|
|
GradColorMirror := BlendColor(FColorMirrorDown, FColorMirrorChecked, FStepPush);
|
|
GradColorMirrorTo := BlendColor(FColorMirrorDownTo, FColorMirrorCheckedTo, FStepPush);
|
|
// PenColor := BlendColor(BorderColorDown, BorderColorChecked, FStepPush);
|
|
end
|
|
end
|
|
else
|
|
if FDown and (State <> absExclusive) then
|
|
begin
|
|
|
|
GradColor := BlendColor(FColorDown, FColorHot, FStepPush);
|
|
GradColorTo := BlendColor(FColorDownTo, FColorHotTo, FStepPush);
|
|
GradColorMirror := BlendColor(FColorMirrorDown, FColorMirrorHot, FStepPush);
|
|
GradColorMirrorTo := BlendColor(FColorMirrorDownTo, FColorMirrorHotTo, FStepPush);
|
|
PenColor := BlendColor(BorderColorDown, BorderColorHot, FStepPush);
|
|
end;
|
|
|
|
end;
|
|
end;
|
|
|
|
if Enabled or (DisabledImages = nil) then
|
|
begin
|
|
if FHot and (HotImages <> nil) then
|
|
ImgList := HotImages
|
|
else
|
|
ImgList := Images;
|
|
|
|
EnabledImg := Enabled;
|
|
end
|
|
else
|
|
begin
|
|
ImgList := DisabledImages;
|
|
EnabledImg := True;
|
|
end;
|
|
|
|
if Enabled or DisabledPicture.Empty then
|
|
begin
|
|
if FHot and not HotPicture.Empty then
|
|
Pic := HotPicture
|
|
else
|
|
Pic := Picture;
|
|
end
|
|
else
|
|
Pic := DisabledPicture;
|
|
|
|
|
|
if (ImgList = nil) then
|
|
begin
|
|
ImgList := FInternalImages;
|
|
EnabledImg := True;
|
|
end;
|
|
|
|
if ShowCaption then
|
|
begin
|
|
DCaption := Caption;
|
|
DWideCaption := WideCaption;
|
|
end
|
|
else
|
|
begin
|
|
DCaption := '';
|
|
DWideCaption := '';
|
|
end;
|
|
|
|
if (FMouseInControl or FMouseDown) and DropDownButton then
|
|
begin
|
|
if FInButton then
|
|
BD := bdDropDown
|
|
else
|
|
BD := bdButton;
|
|
end
|
|
else
|
|
BD := bdNone;
|
|
|
|
// do not use special border color for non standalone buttons in mouse hover/down state or checked buttons
|
|
if ((Position <> bpStandalone) and FMouseDown) {or ((Style = bsCheck) and (FState = absDown))} then
|
|
begin
|
|
PenColor := BorderColor;
|
|
end;
|
|
|
|
if ((State = absDisabled) or not Enabled) and FShowDisabled then
|
|
begin
|
|
GradColor := FColorDisabled;
|
|
GradColorTo := FColorDisabledTo;
|
|
GradColorMirror := FColorMirrorDisabled;
|
|
GradColorMirrorTo := FColorMirrorDisabledTo;
|
|
PenColor := BorderColorDisabled;
|
|
GradU := GradientDisabled;
|
|
GradB := GradientMirrorDisabled;
|
|
end;
|
|
|
|
if ((GetFocus = self.Handle) and (FocusType in [ftHot, ftHotBorder])) and not FDown then
|
|
begin
|
|
GradColor := FColorHot;
|
|
GradColorTo := FColorHotTo;
|
|
GradColorMirror := FColorMirrorHot;
|
|
GradColorMirrorTo := FColorMirrorHotTo;
|
|
PenColor := BorderColorHot;
|
|
GradU := GradientHot;
|
|
GradB := GradientMirrorHot;
|
|
DrawDwLn := True;
|
|
end;
|
|
|
|
DrawFocused := (GetFocus = self.Handle) and (FocusType in [ftBorder, ftHotBorder]);
|
|
DrawFocusedHot := (GetFocus = self.Handle) and (FocusType in [ftHot, ftHotBorder]);
|
|
|
|
AFont := TFont.Create;
|
|
AFont.Assign(Font);
|
|
|
|
if (not ParentFont) and Appearance.SystemFont then
|
|
begin
|
|
if IsVista then
|
|
AFont.Name := 'Segoe UI'
|
|
else
|
|
AFont.Name := 'Tahoma';
|
|
end;
|
|
|
|
bmp := TBitmap.Create;
|
|
bmp.Width := 1;
|
|
bmp.Height := 1;
|
|
|
|
GetToolImage(bmp);
|
|
|
|
if Assigned(Action) then
|
|
begin
|
|
begin
|
|
if (Action as TCustomAction).ImageIndex >= 0 then
|
|
if Assigned((Action as TCustomAction).ActionList) then
|
|
if Assigned(TImageList((Action as TCustomAction).ActionList.Images)) then
|
|
begin
|
|
ImgList := TImageList((Action as TCustomAction).ActionList.Images);
|
|
EnabledImg := Enabled;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
PicSize.cx := 0; // no stretch pic
|
|
PicSize.cy := 0;
|
|
if AutoSize then
|
|
begin
|
|
if (ButtonSizeState in [bsLabel, bsGlyph]) then
|
|
begin
|
|
PicSize.cx := 16;
|
|
PicSize.cy := 16;
|
|
|
|
{if (bmp.Width = 1) then
|
|
begin
|
|
bmp.Height := Pic.Height;
|
|
bmp.Width := Pic.Width;
|
|
bmp.Canvas.Draw(0, 0, Pic);
|
|
Pic := nil;
|
|
end;}
|
|
|
|
if Assigned(ImgList) and (ImageIndex >= 0) then
|
|
begin
|
|
Pic := nil;
|
|
end;
|
|
end;
|
|
|
|
if (ButtonSizeState = bsGlyph) then
|
|
begin
|
|
DCaption := '';
|
|
DWideCaption := '';
|
|
end;
|
|
end;
|
|
|
|
if DoAutoSize or (FFirstPaint and AutoSize) then
|
|
begin
|
|
|
|
sz := DrawVistaButton(Canvas,ClientRect,GradColor, GradColorTo, GradColorMirror, GradColorMirrorTo,
|
|
PenColor, GradU, GradB, DCaption, DWideCaption, FDefaultCaptionDrawing, AFont, ImgList, ImageIndex, EnabledImg, Layout, FDropDownButton {and (Style <> bsCheck)},
|
|
DrawDwLn, Enabled, DrawFocused, DropDownPosition, Pic, PicSize, AntiAlias, FDefaultPicDrawing, bmp, BD, Transparent and not (FMouseEnter or DrawFocusedHot or (State = absDown)), FMouseEnter, Position, DropDownSplit, CanDrawBorder,
|
|
FOverlappedText, FWordWrap, True, FRounded, FDropDownDirection = ddDown, FSpacing, FTrimming, FNotes, FNotesFont, FDownChecked);
|
|
|
|
if AutoSize then
|
|
begin
|
|
W := sz.cx + Spacing * 3 + 2 + 2 * MarginHorz;
|
|
H := sz.cy + Spacing * 2 + 2 * MarginVert;
|
|
|
|
if DropDownButton then
|
|
begin
|
|
if (DropDownPosition = dpBottom) then
|
|
H := H + DropDownSectWidth
|
|
else
|
|
W := W + DropDownSectWidth;
|
|
end;
|
|
|
|
if Assigned(FOnSetButtonSize) then
|
|
FOnSetButtonSize(Self, w, h);
|
|
|
|
if (W <> Width) then
|
|
Width := W;
|
|
if (H <> Height) then
|
|
Height := H;
|
|
end;
|
|
|
|
FFirstPaint := false;
|
|
end;
|
|
|
|
// transparent border pixels
|
|
|
|
sz := DrawVistaButton(Canvas,ClientRect,GradColor, GradColorTo, GradColorMirror, GradColorMirrorTo,
|
|
PenColor, GradU, GradB, DCaption, DWideCaption, FDefaultCaptionDrawing, AFont, ImgList, ImageIndex, EnabledImg, Layout, FDropDownButton {and (Style <> bsCheck)},
|
|
DrawDwLn, Enabled, DrawFocused, DropDownPosition, Pic, PicSize, AntiAlias, FDefaultPicDrawing, bmp, BD, Transparent and not (FMouseEnter or DrawFocusedHot or (State = absDown)), FMouseEnter, Position, DropDownSplit, CanDrawBorder, FOverlappedText, FWordWrap,
|
|
False, FRounded, FDropDownDirection = ddDown, FSpacing, FTrimming, FNotes, FNotesFont, FDownChecked);
|
|
|
|
DrawGlyphCaption;
|
|
|
|
gs := gsNormal;
|
|
|
|
if FMouseEnter then
|
|
gs := gsHot;
|
|
|
|
if State = absDown then
|
|
gs := gsDown;
|
|
|
|
if Assigned(OnDrawButton) then
|
|
OnDrawButton(Self, Canvas, ClientRect, gs);
|
|
|
|
AFont.Free;
|
|
bmp.Free;
|
|
|
|
if not Assigned(Parent) then
|
|
Exit;
|
|
|
|
if not FTransparent or FMouseEnter or (State = absDown) or (FHot) then
|
|
begin
|
|
R := ClientRect;
|
|
|
|
if Position <> bpMiddle then
|
|
begin
|
|
if (Position in [bpStandalone, bpLeft]) then
|
|
begin
|
|
rgn1 := CreateRectRgn(0, 0, 1, 1);
|
|
end
|
|
else
|
|
begin
|
|
rgn1 := CreateRectRgn(R.Right - 1, 0, R.Right, 1);
|
|
end;
|
|
|
|
if (Position in [bpStandalone]) then
|
|
begin
|
|
rgn2 := CreateRectRgn(R.Right - 1, 0, R.Right, 1);
|
|
CombineRgn(rgn1, rgn1, rgn2, RGN_OR);
|
|
DeleteObject(rgn2);
|
|
end;
|
|
|
|
if (Position in [bpStandalone, bpLeft]) then
|
|
begin
|
|
rgn2 := CreateRectRgn(0, R.Bottom - 1, 1, R.Bottom);
|
|
CombineRgn(rgn1, rgn1, rgn2, RGN_OR);
|
|
DeleteObject(rgn2);
|
|
end;
|
|
|
|
if (Position in [bpStandalone, bpRight]) then
|
|
begin
|
|
rgn2 := CreateRectRgn(R.Right - 1, R.Bottom - 1, R.Right, R.Bottom);
|
|
CombineRgn(rgn1, rgn1, rgn2, RGN_OR);
|
|
DeleteObject(rgn2);
|
|
end;
|
|
|
|
SelectClipRgn(Canvas.Handle, rgn1);
|
|
|
|
i := SaveDC(Canvas.Handle);
|
|
p := ClientOrigin;
|
|
Windows.ScreenToClient(Parent.Handle, p);
|
|
p.x := -p.x;
|
|
p.y := -p.y;
|
|
MoveWindowOrg(Canvas.Handle, p.x, p.y);
|
|
|
|
SendMessage(Parent.Handle, WM_ERASEBKGND, Canvas.Handle, 0);
|
|
|
|
// transparency ?
|
|
SendMessage(Parent.Handle, WM_PAINT, Canvas.Handle, 0);
|
|
if (Parent is TWinCtrl) then
|
|
(Parent as TWinCtrl).PaintCtrls(Canvas.Handle, nil);
|
|
RestoreDC(Canvas.Handle, i);
|
|
|
|
SelectClipRgn(Canvas.Handle, 0);
|
|
DeleteObject(rgn1);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.PictureChanged(Sender: TObject);
|
|
begin
|
|
PerformResize;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetDown(Value: Boolean);
|
|
begin
|
|
|
|
if (csLoading in ComponentState) then
|
|
FInitialDown := Value;
|
|
|
|
if (FGroupIndex = 0) and (Style = bsButton) then
|
|
Value := False;
|
|
|
|
if (Style = bsCheck) then
|
|
begin
|
|
FDownChecked := Value;
|
|
if FDownChecked then
|
|
FState := absDown
|
|
else
|
|
FState := absUp;
|
|
Repaint;
|
|
Exit;
|
|
end;
|
|
|
|
if (Value <> FDownChecked) then
|
|
begin
|
|
if FDownChecked and (not FAllowAllUp) then
|
|
Exit;
|
|
|
|
FDownChecked := Value;
|
|
if Value then
|
|
begin
|
|
if FState = absUp then Invalidate;
|
|
FState := absExclusive
|
|
end
|
|
else
|
|
begin
|
|
FState := absUp;
|
|
Repaint;
|
|
end;
|
|
|
|
if Value and not FCheckLinked then UpdateExclusive;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetGroupIndex(const Value: Integer);
|
|
begin
|
|
if FGroupIndex <> Value then
|
|
begin
|
|
FGroupIndex := Value;
|
|
UpdateExclusive;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetImageIndex(const Value: TImageIndex);
|
|
begin
|
|
FImageIndex := Value;
|
|
PerformResize;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetImages(const Value: TImageList);
|
|
begin
|
|
FImages := Value;
|
|
Invalidate;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetDefault(const Value: boolean);
|
|
begin
|
|
FDefault := Value;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetDisabledImages(const Value: TImageList);
|
|
begin
|
|
FDisabledImages := Value;
|
|
Invalidate;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetSpacing(const Value: Integer);
|
|
begin
|
|
if FSpacing <> Value then
|
|
begin
|
|
FSpacing := value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
procedure TAdvCustomGlowButton.SetWideCaption(const Value: widestring);
|
|
begin
|
|
if (FWideCaption <> Value) then
|
|
begin
|
|
FWideCaption := Value;
|
|
|
|
if AutoSize then
|
|
begin
|
|
DoAutoSize := true;
|
|
Repaint;
|
|
DoAutoSize := false;
|
|
end
|
|
else
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetWordWrap(const Value: Boolean);
|
|
begin
|
|
if FWordWrap <> Value then
|
|
begin
|
|
FWordWrap := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.PerformResize;
|
|
begin
|
|
if AutoSize then
|
|
begin
|
|
DoAutoSize := true;
|
|
Repaint;
|
|
DoAutoSize := false;
|
|
end
|
|
else
|
|
Invalidate;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetRounded(const Value: Boolean);
|
|
begin
|
|
if (FRounded <> Value) then
|
|
begin
|
|
FRounded := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetMarginVert(const Value: Integer);
|
|
begin
|
|
if FMarginVert <> Value then
|
|
begin
|
|
FMarginVert := Value;
|
|
PerformResize;
|
|
end;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.SetMarginHorz(const Value: Integer);
|
|
begin
|
|
if FMarginHorz <> Value then
|
|
begin
|
|
FMarginHorz := Value;
|
|
PerformResize;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetAutoSizeEx(const Value: Boolean);
|
|
begin
|
|
if FAutoSize <> Value then
|
|
begin
|
|
FAutoSize := Value;
|
|
PerformResize;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetDisabledPicture(const Value: TGDIPPicture);
|
|
begin
|
|
FIDisabledPicture.Assign(Value);
|
|
Invalidate;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetHotPicture(const Value: TGDIPPicture);
|
|
begin
|
|
FIHotPicture.Assign(Value);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetShowCaption(const Value: Boolean);
|
|
begin
|
|
FShowCaption := Value;
|
|
PerformResize;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.SetShowDisabled(const Value: boolean);
|
|
begin
|
|
FShowDisabled := Value;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.SetStyle(const Value: TAdvButtonStyle);
|
|
begin
|
|
if FStyle <> Value then
|
|
begin
|
|
FStyle := Value;
|
|
//if (Value = bsCheck) and DropDownButton then
|
|
// DropDownButton := false;
|
|
end;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.SetVersion(const Value: string);
|
|
begin
|
|
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.TimerProc(Sender: TObject);
|
|
begin
|
|
case GlowState of
|
|
gsHover:
|
|
begin
|
|
FStepHover := FStepHover + FTimeInc;
|
|
if ((FStepHover > 100) and (FTimeInc > 0))
|
|
or ((FStepHover < 0) and (FTimeInc < 0)) then
|
|
begin
|
|
// outputdebugstring(pchar('hover step:'+inttostr(fstephover)+':'+inttostr(ftimeinc)));
|
|
if FStepHover > 100 then
|
|
FStepHover := 100;
|
|
|
|
if FStepHover < 0then
|
|
FStepHover := 0;
|
|
|
|
GlowState := gsNone;
|
|
|
|
FreeAndNil(FTimer);
|
|
end
|
|
else
|
|
Invalidate;
|
|
end;
|
|
gsPush:
|
|
begin
|
|
// outputdebugstring(pchar('push step:'+inttostr(fsteppush)+':'+inttostr(ftimeinc)));
|
|
|
|
FStepPush := FStepPush + FTimeInc;
|
|
|
|
if ((FStepPush > 100) and (FTimeInc > 0))
|
|
or ((FStepPush < 0) and (FTimeInc < 0)) then
|
|
begin
|
|
if FStepPush > 100 then
|
|
FStepPush := 100;
|
|
|
|
if FStepPush < 0 then
|
|
FStepPush := 0;
|
|
|
|
if FTimeInc < 0 then
|
|
begin
|
|
FDown := false;
|
|
FLeftDown := false;
|
|
end;
|
|
|
|
GlowState := gsNone;
|
|
FreeAndNil(FTimer);
|
|
end
|
|
else
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.WMSetText(var Message: TWMSetText);
|
|
begin
|
|
inherited;
|
|
|
|
if AutoSize then
|
|
begin
|
|
PerformResize;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.WMEraseBkGnd(var Message: TWMEraseBkGnd);
|
|
const
|
|
delta = 3;
|
|
{
|
|
var
|
|
DC: HDC;
|
|
i: THandle;
|
|
// rgn1,rgn2: THandle;
|
|
p,op: TPoint;
|
|
PDC : HDC;
|
|
}
|
|
|
|
begin
|
|
// SetBkMode(Message.DC, Windows.TRANSPARENT );
|
|
Message.Result := 1;
|
|
Exit;
|
|
|
|
if FTransparent then
|
|
begin
|
|
if Assigned(Parent) and not (FMouseDown or FMouseInControl) then
|
|
begin
|
|
{
|
|
rgn1 := CreateRectRgn(0, 0, delta, delta);
|
|
rgn2 := CreateRectRgn(ClientRect.Right-delta, 0, ClientRect.Right, delta);
|
|
CombineRgn(rgn1, rgn1, rgn2, RGN_OR);
|
|
rgn2 := CreateRectRgn(0, ClientRect.Bottom - delta, delta, ClientRect.Bottom);
|
|
CombineRgn(rgn1, rgn1, rgn2, RGN_OR);
|
|
rgn2 := CreateRectRgn(ClientRect.Right - delta, ClientRect.Bottom - delta, ClientRect.Right, ClientRect.Bottom);
|
|
CombineRgn(rgn1, rgn1, rgn2, RGN_OR);
|
|
SelectClipRgn(Message.DC, rgn1);
|
|
}
|
|
|
|
(*
|
|
DC := Message.DC;
|
|
i := SaveDC(DC);
|
|
|
|
p := ClientOrigin;
|
|
Windows.ScreenToClient(Parent.Handle, p);
|
|
p.x := -p.x;
|
|
p.y := -p.y;
|
|
|
|
// MoveWindowOrg(DC, p.x, p.y);
|
|
|
|
// SetMapMode(FBmp.Canvas.Handle,mm_isotropic);
|
|
|
|
SetMapMode(FBmp.Canvas.Handle,mm_isotropic);
|
|
SetViewPortOrgEx(FBmp.Canvas.Handle,p.x,p.y,@op);
|
|
|
|
SendMessage(Parent.Handle, WM_ERASEBKGND, FBmp.Canvas.Handle, 0);
|
|
SendMessage(Parent.Handle, WM_PAINT, FBmp.Canvas.Handle, 0);
|
|
|
|
// if (Parent is TWinCtrl) then
|
|
// (Parent as TWinCtrl).PaintCtrls(FBmp.Canvas.Handle, nil);
|
|
|
|
SetViewPortOrgEx(FBmp.Canvas.Handle,op.x,op.y,nil);
|
|
RestoreDC(DC, i);
|
|
|
|
// SelectClipRgn(Message.DC, 0);
|
|
// DeleteObject(rgn1);
|
|
*)
|
|
end;
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.CMDialogChar(var Message: TCMDialogChar);
|
|
begin
|
|
with Message do
|
|
if IsAccel(CharCode, Caption) and CanFocus then
|
|
begin
|
|
if IsMenuButton or (Assigned(DropDownMenu)) then
|
|
DoDropDown
|
|
else
|
|
Click;
|
|
Result := 1;
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.CMDialogKey(var Message: TCMDialogKey);
|
|
begin
|
|
with Message do
|
|
if
|
|
(((CharCode = VK_RETURN) and FActive) or
|
|
((CharCode = VK_ESCAPE) and FCancel)) and
|
|
(KeyDataToShiftState(Message.KeyData) = []) and CanFocus then
|
|
begin
|
|
//Click;
|
|
InternalClick;
|
|
Result := 1;
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.CMEnabledChanged(var Message: TMessage);
|
|
begin
|
|
inherited;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.CMFocusChanged(var Message: TCMFocusChanged);
|
|
begin
|
|
with Message do
|
|
if Sender is TAdvCustomGlowButton then
|
|
FActive := Sender = Self
|
|
else
|
|
FActive := FDefault;
|
|
//SetButtonStyle(FActive);
|
|
inherited;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
{$IFNDEF TMSDOTNET}
|
|
|
|
procedure TAdvCustomGlowButton.CMButtonPressed(var Message: TMessage);
|
|
var
|
|
Sender: TAdvGlowButton;
|
|
begin
|
|
if Message.WParam = FGroupIndex then
|
|
begin
|
|
Sender := TAdvGlowButton(Message.LParam);
|
|
if Sender <> Self then
|
|
begin
|
|
if Sender.Down and FDownChecked then
|
|
begin
|
|
FDownChecked := False;
|
|
FState := absUp;
|
|
{ if (Action is TCustomAction) then
|
|
TCustomAction(Action).Checked := False; }
|
|
Invalidate;
|
|
end;
|
|
//FAllowAllUp := Sender.AllowAllUp;
|
|
end;
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
{$IFNDEF TMSDOTNET}
|
|
|
|
procedure TAdvCustomGlowButton.UpdateExclusive;
|
|
var
|
|
Msg: TMessage;
|
|
begin
|
|
if (FGroupIndex <> 0) and (Parent <> nil) then
|
|
begin
|
|
Msg.Msg := CM_BUTTONPRESSED;
|
|
Msg.WParam := FGroupIndex;
|
|
Msg.LParam := Longint(Self);
|
|
Msg.Result := 0;
|
|
Parent.Broadcast(Msg);
|
|
{if Assigned(FAdvToolBar) and not (Parent is TAdvCustomToolBar) then
|
|
FAdvToolBar.Broadcast(Msg)
|
|
else if Assigned(AdvToolBar) and (Parent is TAdvCustomToolBar) and Assigned(AdvToolBar.FOptionWindowPanel) then
|
|
FAdvToolBar.FOptionWindowPanel.Broadcast(Msg); }
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
{$IFDEF TMSDOTNET}
|
|
procedure TAdvCustomGlowButton.ButtonPressed(Group: Integer; Button: TAdvGlowButton);
|
|
begin
|
|
if (Group = FGroupIndex) and (Button <> Self) then
|
|
begin
|
|
if Button.Down and FDownChecked then
|
|
begin
|
|
FDownChecked := False;
|
|
FState := absUp;
|
|
if (Action is TCustomAction) then
|
|
TCustomAction(Action).Checked := False;
|
|
Invalidate;
|
|
end;
|
|
//FAllowAllUp := Button.AllowAllUp;
|
|
end;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.UpdateExclusive;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if (FGroupIndex <> 0) and (Parent <> nil) then
|
|
begin
|
|
for I := 0 to Parent.ControlCount - 1 do
|
|
if Parent.Controls[I] is TSpeedButton then
|
|
TAdvToolButton(Parent.Controls[I]).ButtonPressed(FGroupIndex, Self);
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.UpdateTracking;
|
|
var
|
|
P: TPoint;
|
|
FNewMouseInControl: boolean;
|
|
begin
|
|
//if FFlat then
|
|
begin
|
|
if Enabled then
|
|
begin
|
|
GetCursorPos(P);
|
|
|
|
FNewMouseInControl := not (FindDragTarget(P, True) = Self);
|
|
|
|
if FNewMouseInControl <> FMouseInControl then
|
|
begin
|
|
FMouseInControl := FNewMouseInControl;
|
|
if FMouseInControl then
|
|
Perform(CM_MOUSELEAVE, 0, 0)
|
|
else
|
|
Perform(CM_MOUSEENTER, 0, 0);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetAllowAllUp(const Value: Boolean);
|
|
begin
|
|
if FAllowAllUp <> Value then
|
|
begin
|
|
FAllowAllUp := Value;
|
|
UpdateExclusive;
|
|
end;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.SetAntiAlias(const Value: TAntiAlias);
|
|
begin
|
|
if (FAntiAlias <> Value) then
|
|
begin
|
|
FAntiAlias := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.SetTrimming(const Value: TStringTrimming);
|
|
begin
|
|
if (FTrimming <> Value) then
|
|
begin
|
|
FTrimming := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.MouseMove(Shift: TShiftState; X, Y: Integer);
|
|
var
|
|
NewState: TAdvButtonState;
|
|
FOldInButton: Boolean;
|
|
begin
|
|
inherited;
|
|
|
|
if (csDesigning in ComponentState) then
|
|
Exit;
|
|
|
|
{$IFNDEF DELPHI2006_LVL}
|
|
UpdateTracking;
|
|
{$ENDIF}
|
|
|
|
FOldInButton := FInButton;
|
|
FInButton := false;
|
|
|
|
if DropDownButton then
|
|
begin
|
|
case DropDownPosition of
|
|
dpRight: if X > Width - 12 then FInButton := true;
|
|
dpBottom: if Y > Height - 12 then FInButton := true;
|
|
end;
|
|
end;
|
|
|
|
if (FInButton <> FOldInButton) then
|
|
begin
|
|
Invalidate;
|
|
end;
|
|
|
|
if FDragging then
|
|
begin
|
|
if (not FDownChecked) then NewState := absUp
|
|
else NewState := absExclusive;
|
|
|
|
if (X >= 0) and (X < ClientWidth) and (Y >= 0) and (Y <= ClientHeight) then
|
|
if FDownChecked then NewState := absExclusive else NewState := absDown;
|
|
|
|
if (Style = bsCheck) and FDownChecked then
|
|
begin
|
|
NewState := absDown;
|
|
end;
|
|
|
|
if (NewState <> FState) then
|
|
begin
|
|
FState := NewState;
|
|
Invalidate;
|
|
end;
|
|
end
|
|
else
|
|
if not FMouseInControl then
|
|
UpdateTracking;
|
|
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetLayout(const Value: TButtonLayout);
|
|
begin
|
|
FLayout := Value;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.SetOfficeHint(const Value: TAdvHintInfo);
|
|
begin
|
|
FOfficeHint.Assign(Value);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetPicture(const Value: TGDIPPicture);
|
|
begin
|
|
FIPicture.Assign(Value);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetTransparent(const Value: Boolean);
|
|
begin
|
|
FTransparent := Value;
|
|
// ReCreateWnd;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetDropDownButton(const Value: Boolean);
|
|
begin
|
|
if FDropDownButton <> Value then
|
|
begin
|
|
//if (Value and not (Style = bsCheck)) or not Value then
|
|
FDropDownButton := Value;
|
|
AdjustSize;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetDropDownDirection(const Value: TDropDownDirection);
|
|
begin
|
|
if FDropDownDirection <> Value then
|
|
begin
|
|
//if (Value and not (Style = bsCheck)) or not Value then
|
|
FDropDownDirection := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.PopupBtnDown;
|
|
begin
|
|
if Assigned(FOnDropDown) then
|
|
FOnDropDown(self);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetDropDownPosition(
|
|
const Value: TDropDownPosition);
|
|
begin
|
|
if FDropDownPosition <> Value then
|
|
begin
|
|
FDropDownPosition := Value;
|
|
if FDropDownButton then
|
|
AdjustSize;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.OnAppearanceChanged(Sender: TObject);
|
|
begin
|
|
Invalidate;
|
|
if Assigned(FShortCutHint) then
|
|
begin
|
|
FShortCutHint.Color := clWhite;
|
|
FShortCutHint.ColorTo := Appearance.Color;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetAppearance(
|
|
const Value: TGlowButtonAppearance);
|
|
begin
|
|
FAppearance.Assign(Value);
|
|
if Assigned(FShortCutHint) then
|
|
begin
|
|
FShortCutHint.Color := clWhite;
|
|
FShortCutHint.ColorTo := Appearance.Color;
|
|
end;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.SetBorderStyle(const Value: TBorderStyle);
|
|
begin
|
|
FBorderStyle := Value;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.SetButtonPosition(const Value: TButtonPosition);
|
|
begin
|
|
FButtonPosition := Value;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TAdvCustomGlowButton.SetComponentStyle(AStyle: TTMSStyle);
|
|
begin
|
|
if (Astyle in [tsOffice2003Blue, tsOffice2003Silver, tsOffice2003Olive, tsWhidbey]) then
|
|
begin
|
|
Appearance.ColorHot := $EBFDFF;
|
|
Appearance.ColorHotTo := $ACECFF;
|
|
Appearance.ColorMirrorHot := $59DAFF;
|
|
Appearance.ColorMirrorHotTo := $A4E9FF;
|
|
Appearance.BorderColorHot := $99CEDB;
|
|
Appearance.GradientHot := ggVertical;
|
|
Appearance.GradientMirrorHot := ggVertical;
|
|
|
|
Appearance.ColorDown := $76AFF1;
|
|
Appearance.ColorDownTo := $4190F3;
|
|
Appearance.ColorMirrorDown := $0E72F1;
|
|
Appearance.ColorMirrorDownTo := $4C9FFD;
|
|
Appearance.BorderColorDown := $45667B;
|
|
Appearance.GradientDown := ggVertical;
|
|
Appearance.GradientMirrorDown := ggVertical;
|
|
|
|
Appearance.ColorChecked := $B5DBFB;
|
|
Appearance.ColorCheckedTo := $78C7FE;
|
|
Appearance.ColorMirrorChecked := $9FEBFD;
|
|
Appearance.ColorMirrorCheckedTo := $56B4FE;
|
|
Appearance.GradientChecked := ggVertical;
|
|
Appearance.GradientMirrorChecked := ggVertical;
|
|
|
|
end;
|
|
|
|
case AStyle of
|
|
tsOffice2003Blue:
|
|
begin
|
|
Appearance.Color := $EEDBC8;
|
|
Appearance.ColorTo := $F6DDC9;
|
|
Appearance.ColorMirror := $EDD4C0;
|
|
Appearance.ColorMirrorTo := $F7E1D0;
|
|
Appearance.BorderColor := $E0B99B;
|
|
Appearance.Gradient := ggVertical;
|
|
Appearance.GradientMirror := ggVertical;
|
|
end;
|
|
tsOffice2003Olive:
|
|
begin
|
|
Appearance.Color := $CFF0EA;
|
|
Appearance.ColorTo := $CFF0EA;
|
|
Appearance.ColorMirror := $CFF0EA;
|
|
Appearance.ColorMirrorTo := $8CC0B1;
|
|
Appearance.BorderColor := $8CC0B1;
|
|
Appearance.Gradient := ggVertical;
|
|
Appearance.GradientMirror := ggVertical;
|
|
end;
|
|
tsOffice2003Silver:
|
|
begin
|
|
Appearance.Color := $EDD4C0;
|
|
Appearance.ColorTo := $00E6D8D8;
|
|
Appearance.ColorMirror := $EDD4C0;
|
|
Appearance.ColorMirrorTo := $C8B2B3;
|
|
Appearance.BorderColor := $927476;
|
|
Appearance.Gradient := ggVertical;
|
|
Appearance.GradientMirror := ggVertical;
|
|
end;
|
|
tsOffice2003Classic:
|
|
begin
|
|
Appearance.Color := clWhite;
|
|
Appearance.ColorTo := $C9D1D5;
|
|
Appearance.ColorMirror := clWhite;
|
|
Appearance.ColorMirrorTo := $C9D1D5;
|
|
Appearance.BorderColor := clBlack;
|
|
Appearance.Gradient := ggVertical;
|
|
Appearance.GradientMirror := ggVertical;
|
|
|
|
Appearance.ColorHot := $EBFDFF;
|
|
Appearance.ColorHotTo := $ACECFF;
|
|
Appearance.ColorMirrorHot := $59DAFF;
|
|
Appearance.ColorMirrorHotTo := $A4E9FF;
|
|
Appearance.BorderColorHot := $99CEDB;
|
|
Appearance.GradientHot := ggVertical;
|
|
Appearance.GradientMirrorHot := ggVertical;
|
|
|
|
Appearance.ColorDown := $76AFF1;
|
|
Appearance.ColorDownTo := $4190F3;
|
|
Appearance.ColorMirrorDown := $0E72F1;
|
|
Appearance.ColorMirrorDownTo := $4C9FFD;
|
|
Appearance.BorderColorDown := $45667B;
|
|
Appearance.GradientDown := ggVertical;
|
|
Appearance.GradientMirrorDown := ggVertical;
|
|
|
|
Appearance.ColorChecked := $B5DBFB;
|
|
Appearance.ColorCheckedTo := $78C7FE;
|
|
Appearance.ColorMirrorChecked := $9FEBFD;
|
|
Appearance.ColorMirrorCheckedTo := $56B4FE;
|
|
Appearance.GradientChecked := ggVertical;
|
|
Appearance.GradientMirrorChecked := ggVertical;
|
|
|
|
end;
|
|
tsOffice2007Luna:
|
|
begin
|
|
Appearance.Color := $EEDBC8;
|
|
Appearance.ColorTo := $F6DDC9;
|
|
Appearance.ColorMirror := $EDD4C0;
|
|
Appearance.ColorMirrorTo := $F7E1D0;
|
|
Appearance.BorderColor := $E0B99B;
|
|
Appearance.Gradient := ggVertical;
|
|
Appearance.GradientMirror := ggVertical;
|
|
|
|
Appearance.ColorHot := $EBFDFF;
|
|
Appearance.ColorHotTo := $ACECFF;
|
|
Appearance.ColorMirrorHot := $59DAFF;
|
|
Appearance.ColorMirrorHotTo := $A4E9FF;
|
|
Appearance.BorderColorHot := $99CEDB;
|
|
Appearance.GradientHot := ggVertical;
|
|
Appearance.GradientMirrorHot := ggVertical;
|
|
|
|
Appearance.ColorDown := $76AFF1;
|
|
Appearance.ColorDownTo := $4190F3;
|
|
Appearance.ColorMirrorDown := $0E72F1;
|
|
Appearance.ColorMirrorDownTo := $4C9FFD;
|
|
Appearance.BorderColorDown := $45667B;
|
|
Appearance.GradientDown := ggVertical;
|
|
Appearance.GradientMirrorDown := ggVertical;
|
|
|
|
Appearance.ColorChecked := $B5DBFB;
|
|
Appearance.ColorCheckedTo := $78C7FE;
|
|
Appearance.ColorMirrorChecked := $9FEBFD;
|
|
Appearance.ColorMirrorCheckedTo := $56B4FE;
|
|
Appearance.BorderColorChecked := $45667B;
|
|
Appearance.GradientChecked := ggVertical;
|
|
Appearance.GradientMirrorChecked := ggVertical;
|
|
end;
|
|
tsOffice2007Obsidian:
|
|
begin
|
|
Appearance.Color := $DFDED6;
|
|
Appearance.ColorTo := $E4E2DB;
|
|
Appearance.ColorMirror := $D7D5CE;
|
|
Appearance.ColorMirrorTo := $E7E5E0;
|
|
Appearance.BorderColor := $C0BCB2;
|
|
Appearance.Gradient := ggVertical;
|
|
Appearance.GradientMirror := ggVertical;
|
|
|
|
Appearance.ColorHot := $EBFDFF;
|
|
Appearance.ColorHotTo := $ACECFF;
|
|
Appearance.ColorMirrorHot := $59DAFF;
|
|
Appearance.ColorMirrorHotTo := $A4E9FF;
|
|
Appearance.BorderColorHot := $99CEDB;
|
|
Appearance.GradientHot := ggVertical;
|
|
Appearance.GradientMirrorHot := ggVertical;
|
|
|
|
Appearance.ColorDown := $76AFF1;
|
|
Appearance.ColorDownTo := $4190F3;
|
|
Appearance.ColorMirrorDown := $0E72F1;
|
|
Appearance.ColorMirrorDownTo := $4C9FFD;
|
|
Appearance.BorderColorDown := $45667B;
|
|
Appearance.GradientDown := ggVertical;
|
|
Appearance.GradientMirrorDown := ggVertical;
|
|
|
|
Appearance.ColorChecked := $B5DBFB;
|
|
Appearance.ColorCheckedTo := $78C7FE;
|
|
Appearance.ColorMirrorChecked := $9FEBFD;
|
|
Appearance.ColorMirrorCheckedTo := $56B4FE;
|
|
Appearance.BorderColorChecked := $45667B;
|
|
Appearance.GradientChecked := ggVertical;
|
|
Appearance.GradientMirrorChecked := ggVertical;
|
|
|
|
end;
|
|
tsOffice2007Silver:
|
|
begin
|
|
Appearance.Color := $F3F3F1;
|
|
Appearance.ColorTo := $F5F5F3;
|
|
Appearance.ColorMirror := $EEEAE7;
|
|
Appearance.ColorMirrorTo := $F8F7F6;
|
|
Appearance.BorderColor := $CCCAC9;
|
|
Appearance.Gradient := ggVertical;
|
|
Appearance.GradientMirror := ggVertical;
|
|
|
|
Appearance.ColorHot := $EBFDFF;
|
|
Appearance.ColorHotTo := $ACECFF;
|
|
Appearance.ColorMirrorHot := $59DAFF;
|
|
Appearance.ColorMirrorHotTo := $A4E9FF;
|
|
Appearance.BorderColorHot := $99CEDB;
|
|
Appearance.GradientHot := ggVertical;
|
|
Appearance.GradientMirrorHot := ggVertical;
|
|
|
|
Appearance.ColorDown := $76AFF1;
|
|
Appearance.ColorDownTo := $4190F3;
|
|
Appearance.ColorMirrorDown := $0E72F1;
|
|
Appearance.ColorMirrorDownTo := $4C9FFD;
|
|
Appearance.BorderColorDown := $45667B;
|
|
Appearance.GradientDown := ggVertical;
|
|
Appearance.GradientMirrorDown := ggVertical;
|
|
|
|
Appearance.ColorChecked := $B5DBFB;
|
|
Appearance.ColorCheckedTo := $78C7FE;
|
|
Appearance.ColorMirrorChecked := $9FEBFD;
|
|
Appearance.ColorMirrorCheckedTo := $56B4FE;
|
|
Appearance.BorderColorChecked := $45667B;
|
|
Appearance.GradientChecked := ggVertical;
|
|
Appearance.GradientMirrorChecked := ggVertical;
|
|
end;
|
|
tsWindowsXP:
|
|
begin
|
|
Appearance.Color := clWhite;
|
|
Appearance.ColorTo := $B9D8DC;
|
|
Appearance.ColorMirror := $B9D8DC;
|
|
Appearance.ColorMirrorTo := $B9D8DC;
|
|
Appearance.BorderColor := $B9D8DC;
|
|
Appearance.Gradient := ggVertical;
|
|
Appearance.GradientMirror := ggVertical;
|
|
|
|
Appearance.ColorHot := $EFD3C6;
|
|
Appearance.ColorHotTo := $EFD3C6;
|
|
Appearance.ColorMirrorHot := $EFD3C6;
|
|
Appearance.ColorMirrorHotTo := $EFD3C6;
|
|
Appearance.BorderColorHot := clHighlight;
|
|
Appearance.GradientHot := ggVertical;
|
|
Appearance.GradientMirrorHot := ggVertical;
|
|
|
|
Appearance.ColorDown := $B59284;
|
|
Appearance.ColorDownTo := $B59284;
|
|
Appearance.ColorMirrorDown := $B59284;
|
|
Appearance.ColorMirrorDownTo := $B59284;
|
|
Appearance.BorderColorDown := clHighlight;
|
|
Appearance.GradientDown := ggVertical;
|
|
Appearance.GradientMirrorDown := ggVertical;
|
|
|
|
|
|
Appearance.ColorChecked := $B9D8DC;
|
|
Appearance.ColorCheckedTo := $B9D8DC;
|
|
Appearance.ColorMirrorChecked := $B9D8DC;
|
|
Appearance.ColorMirrorCheckedTo := $B9D8DC;
|
|
Appearance.BorderColorChecked := clBlack;
|
|
Appearance.GradientChecked := ggVertical;
|
|
Appearance.GradientMirrorChecked := ggVertical;
|
|
|
|
end;
|
|
tsWhidbey:
|
|
begin
|
|
Appearance.Color := clWhite;
|
|
Appearance.ColorTo := $DFEDF0;
|
|
Appearance.ColorMirror := $DFEDF0;
|
|
Appearance.ColorMirrorTo := $DFEDF0;
|
|
Appearance.BorderColor := $99A8AC;
|
|
Appearance.Gradient := ggVertical;
|
|
Appearance.GradientMirror := ggVertical;
|
|
|
|
end;
|
|
tsCustom:
|
|
begin
|
|
end;
|
|
end;
|
|
Invalidate;
|
|
|
|
if Assigned(FShortCutHint) then
|
|
begin
|
|
FShortCutHint.Color := clWhite;
|
|
FShortCutHint.ColorTo := Appearance.Color;
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
{$IFDEF DELPHI6_LVL}
|
|
|
|
procedure TAdvCustomGlowButton.ActionChange(Sender: TObject; CheckDefaults: Boolean);
|
|
begin
|
|
inherited ActionChange(Sender, CheckDefaults);
|
|
if Sender is TCustomAction then
|
|
with TCustomAction(Sender) do
|
|
begin
|
|
if CheckDefaults or (Self.GroupIndex = 0) then
|
|
Self.GroupIndex := GroupIndex;
|
|
Self.ImageIndex := ImageIndex;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
function TAdvCustomGlowButton.GetActionLinkClass: TControlActionLinkClass;
|
|
begin
|
|
Result := TAdvGlowButtonActionLink;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetButtonSizeState(
|
|
const Value: TButtonSizeState);
|
|
begin
|
|
if (FButtonSizeState <> Value) {and AutoSize} then
|
|
begin
|
|
if (FButtonSizeState = bsLarge) then
|
|
begin
|
|
FOldLayout := Layout;
|
|
FOldDropDownPosition := DropDownPosition;
|
|
end;
|
|
|
|
FButtonSizeState := Value;
|
|
|
|
if (FButtonSizeState = bsLarge) and AutoSize then
|
|
begin
|
|
Layout := FOldLayout;
|
|
DropDownPosition := FOldDropDownPosition;
|
|
end
|
|
else if AutoSize then
|
|
begin
|
|
Layout := blGlyphLeft;
|
|
DropDownPosition := dpRight;
|
|
end;
|
|
FFirstPaint := True;
|
|
Paint;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetMaxButtonSizeState(
|
|
const Value: TButtonSizeState);
|
|
begin
|
|
if (FMaxButtonSizeState <> Value) {and AutoSize} then
|
|
begin
|
|
FMaxButtonSizeState := Value;
|
|
ButtonSizeState := FMaxButtonSizeState
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
function TAdvCustomGlowButton.GetNotes: TStrings;
|
|
begin
|
|
Result := TStrings(FNotes);
|
|
end;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetNotes(const Value: TStrings);
|
|
begin
|
|
FNotes.Assign(Value);
|
|
Invalidate;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetNotesFont(const Value: TFont);
|
|
begin
|
|
FNotesFont.Assign(Value);
|
|
Invalidate;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvCustomGlowButton.SetMinButtonSizeState(
|
|
const Value: TButtonSizeState);
|
|
begin
|
|
if (FMinButtonSizeState <> Value) then
|
|
begin
|
|
FMinButtonSizeState := Value;
|
|
if (FMinButtonSizeState > ButtonSizeState) then
|
|
ButtonSizeState := FMinButtonSizeState;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
function TAdvCustomGlowButton.GetButtonSize(BtnSizeState: TButtonSizeState): TSize;
|
|
var
|
|
DCaption: string;
|
|
DWideCaption: widestring;
|
|
ImgList: TImageList;
|
|
Pic: TGDIPPicture;
|
|
EnabledImg: Boolean;
|
|
BD: TButtonDisplay;
|
|
bmp: TBitmap;
|
|
DrawFocused, DrawFocusedHot, DrawDwLn: boolean;
|
|
PicSize: TSize;
|
|
LayOt: TButtonLayout;
|
|
DpDwPosition: TDropDownPosition;
|
|
begin
|
|
if Enabled or (DisabledImages = nil) then
|
|
begin
|
|
if FHot and (HotImages <> nil) then
|
|
ImgList := HotImages
|
|
else
|
|
ImgList := Images;
|
|
|
|
EnabledImg := Enabled;
|
|
end
|
|
else
|
|
begin
|
|
ImgList := DisabledImages;
|
|
EnabledImg := True;
|
|
end;
|
|
|
|
if Enabled or DisabledPicture.Empty then
|
|
begin
|
|
if FHot and not HotPicture.Empty then
|
|
Pic := HotPicture
|
|
else
|
|
Pic := Picture;
|
|
end
|
|
else
|
|
Pic := DisabledPicture;
|
|
|
|
|
|
if (ImgList = nil) then
|
|
begin
|
|
ImgList := FInternalImages;
|
|
EnabledImg := True;
|
|
end;
|
|
|
|
if ShowCaption then
|
|
begin
|
|
DCaption := Caption;
|
|
DWideCaption := WideCaption;
|
|
end
|
|
else
|
|
begin
|
|
DCaption := '';
|
|
DWideCaption := '';
|
|
end;
|
|
|
|
if (FMouseInControl or FMouseDown) and DropDownButton then
|
|
begin
|
|
if FInButton then
|
|
BD := bdDropDown
|
|
else
|
|
BD := bdButton;
|
|
end
|
|
else
|
|
BD := bdNone;
|
|
|
|
DrawFocused := (GetFocus = self.Handle) and (FocusType in [ftBorder, ftHotBorder]);
|
|
DrawFocusedHot := (GetFocus = self.Handle) and (FocusType in [ftHot, ftHotBorder]);
|
|
|
|
bmp := TBitmap.Create;
|
|
bmp.Width := 1;
|
|
bmp.Height := 1;
|
|
|
|
GetToolImage(bmp);
|
|
|
|
if Assigned(Action) then
|
|
begin
|
|
begin
|
|
if (Action as TCustomAction).ImageIndex >= 0 then
|
|
if Assigned((Action as TCustomAction).ActionList) then
|
|
if Assigned(TImageList((Action as TCustomAction).ActionList.Images)) then
|
|
begin
|
|
ImgList := TImageList((Action as TCustomAction).ActionList.Images);
|
|
EnabledImg := Enabled;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
LayOt := Layout;
|
|
DpDwPosition := DropDownPosition;
|
|
|
|
PicSize.cx := 0; // no stretch pic
|
|
PicSize.cy := 0;
|
|
if AutoSize then
|
|
begin
|
|
if (BtnSizeState in [bsLabel, bsGlyph]) then
|
|
begin
|
|
PicSize.cx := 16;
|
|
PicSize.cy := 16;
|
|
|
|
if (bmp.Width = 1) then
|
|
begin
|
|
bmp.Height := Pic.Height;
|
|
bmp.Width := Pic.Width;
|
|
bmp.Canvas.Draw(0, 0, Pic);
|
|
Pic := nil;
|
|
end;
|
|
|
|
if Assigned(ImgList) and (ImageIndex >= 0) then
|
|
begin
|
|
Pic := nil;
|
|
end;
|
|
end;
|
|
|
|
if (BtnSizeState = bsGlyph) then
|
|
begin
|
|
DCaption := '';
|
|
DWideCaption := '';
|
|
end;
|
|
|
|
if (BtnSizeState = bsLarge) then
|
|
begin
|
|
LayOt := FOldLayout;
|
|
DpDwPosition := FOldDropDownPosition;
|
|
end
|
|
else
|
|
begin
|
|
LayOt := blGlyphLeft;
|
|
DpDwPosition := dpRight;
|
|
end;
|
|
end;
|
|
|
|
DrawDwLn := False;
|
|
|
|
with Appearance do
|
|
Result := DrawVistaButton(Canvas,ClientRect,FColor, FColorTo, FColorMirror, FColorMirrorTo,
|
|
BorderColor, Gradient, GradientMirror, DCaption, DWideCaption, FDefaultCaptionDrawing, Font, ImgList, ImageIndex, EnabledImg, LayOt, FDropDownButton,
|
|
DrawDwLn, Enabled, DrawFocused, DpDwPosition, Pic, PicSize, AntiAlias, FDefaultPicDrawing, bmp, BD, Transparent and not (FMouseEnter or DrawFocusedHot or (State = absDown)), FMouseEnter, Position, DropDownSplit, CanDrawBorder,
|
|
FOverlappedText, FWordWrap, True, FRounded, FDropDownDirection = ddDown, FSpacing, FTrimming, FNotes, FNotesFont, FDownChecked);
|
|
|
|
Result.cx := Result.cx + Spacing * 3 + 2 + 2 * MarginHorz;
|
|
Result.cy := Result.cy + Spacing * 2 + 2 * MarginVert;
|
|
if DropDownButton then
|
|
begin
|
|
if (DpDwPosition = dpBottom) then
|
|
Result.cy := Result.cy + DropDownSectWidth
|
|
else
|
|
Result.cx := Result.cx + DropDownSectWidth;
|
|
end;
|
|
//if Assigned(FOnSetButtonSize) then
|
|
//FOnSetButtonSize(Self, w, h);
|
|
|
|
bmp.Free;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
{ TGlowButtonAppearance }
|
|
|
|
constructor TGlowButtonAppearance.Create;
|
|
begin
|
|
inherited;
|
|
Color := clWhite;
|
|
ColorTo := clWhite;
|
|
ColorMirror := clSilver;
|
|
ColorMirrorTo := clWhite;
|
|
|
|
ColorHot := $F5F0E1;
|
|
ColorHotTo := $F9D2B2;
|
|
ColorMirrorHot := $F5C8AD;
|
|
ColorMirrorHotTo := $FFF8F4;
|
|
|
|
ColorDown := BrightnessColor($F5F0E1,-10,-10,0);
|
|
ColorDownTo := BrightnessColor($F9D2B2, -10,-10,0);
|
|
ColorMirrorDown := BrightnessColor($F5C8AD, -10,-10,0);
|
|
ColorMirrorDownTo := BrightnessColor($FFF8F4, -10,-10,0);
|
|
|
|
ColorChecked := BrightnessColor($F5F0E1,-10,-10,0);
|
|
ColorCheckedTo := BrightnessColor($F9D2B2, -10,-10,0);
|
|
ColorMirrorChecked := BrightnessColor($F5C8AD, -10,-10,0);
|
|
ColorMirrorCheckedTo := BrightnessColor($FFF8F4, -10,-10,0);
|
|
|
|
ColorDisabled := BrightnessColor(clWhite,-5,-5,-5);
|
|
ColorDisabledTo := BrightnessColor(clWhite, -5,-5,-5);
|
|
ColorMirrorDisabled := BrightnessColor(clSilver, -5,-5,-5);
|
|
ColorMirrorDisabledTo := BrightnessColor(clWhite, -5,-5,-5);
|
|
|
|
BorderColor := clSilver;
|
|
BorderColorHot := clBlue;
|
|
BorderColorDown := clNavy;
|
|
BorderColorChecked := clBlue;
|
|
BorderColorDisabled := clGray;
|
|
|
|
Gradient := ggVertical;
|
|
GradientMirror := ggVertical;
|
|
|
|
GradientHot := ggRadial;
|
|
GradientMirrorHot := ggRadial;
|
|
|
|
GradientDown := ggRadial;
|
|
GradientMirrorDown := ggRadial;
|
|
|
|
GradientChecked := ggRadial;
|
|
GradientMirrorChecked := ggVertical;
|
|
|
|
GradientDisabled := ggRadial;
|
|
GradientMirrorDisabled := ggRadial;
|
|
|
|
FSystemFont := true;
|
|
end;
|
|
|
|
procedure TGlowButtonAppearance.SetSystemFont(const Value: boolean);
|
|
begin
|
|
if (FSystemFont <> Value) then
|
|
begin
|
|
FSystemFont := Value;
|
|
Changed;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TGlowButtonAppearance.Assign(Source: TPersistent);
|
|
begin
|
|
if (Source is TGlowButtonAppearance) then
|
|
begin
|
|
Color := (Source as TGlowButtonAppearance).Color;
|
|
ColorTo := (Source as TGlowButtonAppearance).ColorTo;
|
|
ColorMirror := (Source as TGlowButtonAppearance).ColorMirror;
|
|
ColorMirrorTo := (Source as TGlowButtonAppearance).ColorMirrorTo;
|
|
|
|
ColorHot := (Source as TGlowButtonAppearance).ColorHot;
|
|
ColorHotTo := (Source as TGlowButtonAppearance).ColorHotTo;
|
|
ColorMirrorHot := (Source as TGlowButtonAppearance).ColorMirrorHot;
|
|
ColorMirrorHotTo := (Source as TGlowButtonAppearance).ColorMirrorHotTo;
|
|
|
|
ColorDown := (Source as TGlowButtonAppearance).ColorDown;
|
|
ColorDownTo := (Source as TGlowButtonAppearance).ColorDownTo;
|
|
ColorMirrorDown := (Source as TGlowButtonAppearance).ColorMirrorDown;
|
|
ColorMirrorDownTo := (Source as TGlowButtonAppearance).ColorMirrorDownTo;
|
|
|
|
ColorChecked := (Source as TGlowButtonAppearance).ColorChecked;
|
|
ColorCheckedTo := (Source as TGlowButtonAppearance).ColorCheckedTo;
|
|
ColorMirrorChecked := (Source as TGlowButtonAppearance).ColorMirrorChecked;
|
|
ColorMirrorCheckedTo := (Source as TGlowButtonAppearance).ColorMirrorCheckedTo;
|
|
|
|
ColorDisabled := (Source as TGlowButtonAppearance).ColorDisabled;
|
|
ColorDisabledTo := (Source as TGlowButtonAppearance).ColorDisabledTo;
|
|
ColorMirrorDisabled := (Source as TGlowButtonAppearance).ColorMirrorDisabled;
|
|
ColorMirrorDisabledTo := (Source as TGlowButtonAppearance).ColorMirrorDisabledTo;
|
|
|
|
BorderColor := (Source as TGlowButtonAppearance).BorderColor;
|
|
BorderColorHot := (Source as TGlowButtonAppearance).BorderColorHot;
|
|
BorderColorDown := (Source as TGlowButtonAppearance).BorderColorDown;
|
|
BorderColorChecked := (Source as TGlowButtonAppearance).BorderColorChecked;
|
|
BorderColorDisabled := (Source as TGlowButtonAppearance).BorderColorDisabled;
|
|
|
|
Gradient := (Source as TGlowButtonAppearance).Gradient;
|
|
GradientMirror := (Source as TGlowButtonAppearance).GradientMirror;
|
|
|
|
GradientHot := (Source as TGlowButtonAppearance).GradientHot;
|
|
GradientMirrorHot := (Source as TGlowButtonAppearance).GradientMirrorHot;
|
|
|
|
GradientDown := (Source as TGlowButtonAppearance).GradientDown;
|
|
GradientMirrorDown := (Source as TGlowButtonAppearance).GradientMirrorDown;
|
|
|
|
GradientChecked := (Source as TGlowButtonAppearance).GradientChecked;
|
|
GradientMirrorChecked := (Source as TGlowButtonAppearance).GradientMirrorChecked;
|
|
|
|
GradientDisabled := (Source as TGlowButtonAppearance).GradientDisabled;
|
|
GradientMirrorDisabled := (Source as TGlowButtonAppearance).GradientMirrorDisabled;
|
|
|
|
SystemFont := (Source as TGlowButtonAppearance).SystemFont;
|
|
end
|
|
else
|
|
inherited Assign(Source);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TGlowButtonAppearance.Changed;
|
|
begin
|
|
if Assigned(FOnChange) then
|
|
FOnChange(Self);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
{$IFNDEF TMS_STD}
|
|
|
|
{ TDBATBButtonDataLink }
|
|
|
|
constructor TDBGlowButtonDataLink.Create;
|
|
begin
|
|
inherited Create;
|
|
FOnEditingChanged := nil;
|
|
FOnDataSetChanged := nil;
|
|
FOnActiveChanged := nil;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBGlowButtonDataLink.ActiveChanged;
|
|
begin
|
|
if Assigned(FOnActiveChanged) then FOnActiveChanged(Self);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBGlowButtonDataLink.DataSetChanged;
|
|
begin
|
|
if Assigned(FOnDataSetChanged) then FOnDataSetChanged(Self);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBGlowButtonDataLink.EditingChanged;
|
|
begin
|
|
if Assigned(FOnEditingChanged) then FOnEditingChanged(Self);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
{ TDBAdvToolBarButton }
|
|
|
|
constructor TDBAdvGlowButton.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
FAutoDisable := True;
|
|
FDBButtonType := dbCustom;
|
|
FDisableControls := [];
|
|
FDataLink := TDBGlowButtonDataLink.Create;
|
|
with FDataLink do
|
|
begin
|
|
OnEditingChanged := OnDataSetEvents;
|
|
OnDataSetChanged := OnDataSetEvents;
|
|
OnActiveChanged := OnDataSetEvents;
|
|
end;
|
|
FConfirmActionString := '';
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
destructor TDBAdvGlowButton.Destroy;
|
|
begin
|
|
FDataLink.Free;
|
|
FDataLink := nil;
|
|
if (FInternalImages <> nil) then
|
|
FInternalImages.Free;
|
|
inherited;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.CalcDisableReasons;
|
|
begin
|
|
case FDBButtonType of
|
|
dbPrior: FDisableControls := [drBOF, drEditing, drEmpty];
|
|
dbNext: FDisableControls := [drEOF, drEditing, drEmpty];
|
|
dbFirst: FDisableControls := [drBOF, drEditing, drEmpty];
|
|
dbLast: FDisableControls := [drEOF, drEditing, drEmpty];
|
|
dbInsert,
|
|
dbAppend: FDisableControls := [drReadonly, drEditing];
|
|
dbEdit: FDisableControls := [drReadonly, drEditing, drEmpty];
|
|
dbCancel: FDisableControls := [drNotEditing];
|
|
dbPost: FDisableControls := [drNotEditing];
|
|
dbRefresh: FDisableControls := [drEditing];
|
|
dbDelete: FDisableControls := [drReadonly, drEditing, drEmpty];
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.Click;
|
|
begin
|
|
inherited;
|
|
DoAction;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.CMEnabledChanged(var Message: TMessage);
|
|
begin
|
|
inherited;
|
|
if (not FInProcUpdateEnabled) and
|
|
(not (csLoading in ComponentState)) and
|
|
(not (csDestroying in ComponentState)) then
|
|
begin
|
|
UpdateEnabled;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.DoAction;
|
|
var
|
|
DoAction: Boolean;
|
|
ShowException: Boolean;
|
|
begin
|
|
if not DoConfirmAction then
|
|
Exit;
|
|
|
|
DoAction := (FDBButtonType <> dbCustom);
|
|
try
|
|
DoBeforeAction(DoAction);
|
|
if DoAction and (DataSource <> nil) and (DataSource.State <> dsInactive) then
|
|
begin
|
|
with DataSource.DataSet do
|
|
begin
|
|
case FDBButtonType of
|
|
dbPrior: Prior;
|
|
dbNext: Next;
|
|
dbFirst: First;
|
|
dbLast: Last;
|
|
dbInsert: Insert;
|
|
dbAppend: Append;
|
|
dbEdit: Edit;
|
|
dbCancel: Cancel;
|
|
dbPost: Post;
|
|
dbRefresh:Refresh;
|
|
dbDelete: Delete;
|
|
end;
|
|
end;
|
|
end;
|
|
ShowException := false;
|
|
except
|
|
ShowException := true;
|
|
if Assigned(FOnAfterAction) then
|
|
FOnAfterAction(self, ShowException);
|
|
if ShowException then
|
|
raise;
|
|
ShowException := true;
|
|
end;
|
|
if not ShowException and DoAction and Assigned(FOnAfterAction) then
|
|
FOnAfterAction(self, ShowException);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.DoBeforeAction(var DoAction: Boolean);
|
|
begin
|
|
if (not (csDesigning in ComponentState)) and Assigned(FOnBeforeAction) then
|
|
FOnBeforeAction(self, DoAction);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
function TDBAdvGlowButton.DoConfirmAction: Boolean;
|
|
var
|
|
Question: string;
|
|
QuestionButtons: TMsgDlgButtons;
|
|
QuestionHelpCtx: Longint;
|
|
QuestionResult: Longint;
|
|
begin
|
|
DoGetQuestion(Question, QuestionButtons, QuestionHelpCtx);
|
|
if (Question <> '') then
|
|
begin
|
|
QuestionResult := MessageDlg(Question, mtConfirmation, QuestionButtons, QuestionHelpCtx);
|
|
Result := (QuestionResult = idOk) or (QuestionResult = idYes);
|
|
end
|
|
else
|
|
Result := true;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.DoGetQuestion(var Question: string;
|
|
var Buttons: TMsgDlgButtons; var HelpCtx: Integer);
|
|
begin
|
|
Question := '';
|
|
if FConfirmAction then
|
|
begin
|
|
Question := FConfirmActionString;
|
|
Buttons := mbOKCancel;
|
|
HelpCtx := 0;
|
|
if Assigned(FOnGetConfirm) then
|
|
FOnGetConfirm(self, Question, Buttons, HelpCtx);
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
function TDBAdvGlowButton.GetDataSource: TDataSource;
|
|
begin
|
|
Result := FDataLink.DataSource;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.Notification(AComponent: TComponent;
|
|
AOperation: TOperation);
|
|
begin
|
|
inherited;
|
|
if (AOperation = opRemove) and (FDataLink <> nil) and (AComponent = DataSource) then
|
|
DataSource := nil;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.SetDataSource(const Value: TDataSource);
|
|
begin
|
|
FDataLink.DataSource := Value;
|
|
if not (csLoading in ComponentState) then
|
|
UpdateEnabled;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.SetDBButtonType(const Value: TDBGlowButtonType);
|
|
begin
|
|
if (Value = FDBButtonType) then
|
|
Exit;
|
|
|
|
if (Value = dbDelete) and (FConfirmActionString = ''){and ConfirmAction} then
|
|
FConfirmActionString := SDeleteRecordQuestion; //'Delete Record?';
|
|
|
|
if (csReading in ComponentState) or (csLoading in ComponentState) then
|
|
begin
|
|
FDBButtonType := Value;
|
|
CalcDisableReasons;
|
|
exit;
|
|
end;
|
|
|
|
FDBButtonType := Value;
|
|
LoadGlyph;
|
|
CalcDisableReasons;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.UpdateEnabled;
|
|
var
|
|
PossibleDisableReasons: TDBBDisableControls;
|
|
GetEnable: Boolean;
|
|
WasEnabled: Boolean;
|
|
begin
|
|
if (csDesigning in ComponentState) or (csDestroying in ComponentState) or not FAutoDisable then
|
|
Exit;
|
|
|
|
FInProcUpdateEnabled := true;
|
|
try
|
|
WasEnabled := Enabled;
|
|
if FDataLink.Active then
|
|
begin
|
|
PossibleDisableReasons := [];
|
|
if FDataLink.DataSet.BOF then
|
|
Include(PossibleDisableReasons, drBOF);
|
|
if FDataLink.DataSet.EOF then
|
|
Include(PossibleDisableReasons, drEOF);
|
|
if not FDataLink.DataSet.CanModify then
|
|
Include(PossibleDisableReasons, drReadonly);
|
|
if FDataLink.DataSet.BOF and FDataLink.DataSet.EOF then
|
|
Include(PossibleDisableReasons, drEmpty);
|
|
if FDataLink.Editing then
|
|
Include(PossibleDisableReasons, drEditing)
|
|
else
|
|
Include(PossibleDisableReasons, drNotEditing);
|
|
|
|
GetEnable := ((FDisableControls - [drEvent])* PossibleDisableReasons = []);
|
|
if (drEvent in FDisableControls) and (Assigned(FOnGetEnabled)) then
|
|
FOnGetEnabled(Self, GetEnable);
|
|
Enabled := GetEnable;
|
|
end
|
|
else
|
|
Enabled := false;
|
|
|
|
if (WasEnabled <> Enabled) and Assigned(FOnEnabledChanged) then
|
|
FOnEnabledChanged(self);
|
|
finally
|
|
FInProcUpdateEnabled := false;
|
|
end;
|
|
LoadGlyph;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.Loaded;
|
|
begin
|
|
inherited;
|
|
//if not Assigned(Images) then
|
|
LoadGlyph;
|
|
|
|
UpdateEnabled;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.OnDataSetEvents(Sender: TObject);
|
|
begin
|
|
UpdateEnabled;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TDBAdvGlowButton.LoadGlyph;
|
|
var
|
|
Glyph: TBitMap;
|
|
begin
|
|
if (csLoading in ComponentState) or Assigned(Images) or (not Enabled and Assigned(DisabledImages)) then
|
|
Exit;
|
|
|
|
if (FDBButtonType = dbCustom) then
|
|
Exit;
|
|
|
|
if (FInternalImages = nil) then
|
|
FInternalImages := TImageList.Create(self);
|
|
|
|
FInternalImages.Clear;
|
|
Glyph := TBitMap.Create;
|
|
Glyph.Width := 16;
|
|
Glyph.Height := 16;
|
|
Glyph.Transparent := True;
|
|
|
|
case FDBButtonType of
|
|
dbPrior:
|
|
begin
|
|
if Enabled then
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGPRIOR')
|
|
else
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGPRIORD');
|
|
end;
|
|
dbNext:
|
|
begin
|
|
if Enabled then
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGNEXT')
|
|
else
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGNEXTD');
|
|
end;
|
|
dbFirst:
|
|
begin
|
|
if Enabled then
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGFIRST')
|
|
else
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGFIRSTD');
|
|
end;
|
|
dbLast:
|
|
begin
|
|
if Enabled then
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGLAST')
|
|
else
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGLASTD');
|
|
end;
|
|
dbInsert:
|
|
begin
|
|
if Enabled then
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGINSERT')
|
|
else
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGINSERTD');
|
|
end;
|
|
dbAppend:
|
|
begin
|
|
if Enabled then
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGINSERT')
|
|
else
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGINSERTD');
|
|
end;
|
|
dbEdit:
|
|
begin
|
|
if Enabled then
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGEDIT')
|
|
else
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGEDITD');
|
|
end;
|
|
dbCancel:
|
|
begin
|
|
if Enabled then
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGCANCEL')
|
|
else
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGCANCELD');
|
|
end;
|
|
dbPost:
|
|
begin
|
|
if Enabled then
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGPOST')
|
|
else
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGPOSTD');
|
|
end;
|
|
dbRefresh:
|
|
begin
|
|
if Enabled then
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGREFRESH')
|
|
else
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGREFRESHD');
|
|
end;
|
|
dbDelete:
|
|
begin
|
|
if Enabled then
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGDELETE')
|
|
else
|
|
Glyph.LoadFromResourceName(HInstance, 'DBIMGDELETED');
|
|
end;
|
|
end;
|
|
|
|
FInternalImages.DrawingStyle := dsTransparent;
|
|
FInternalImages.Masked := true;
|
|
FInternalImages.AddMasked(Glyph, clFuchsia);
|
|
FImageIndex := 0;
|
|
Glyph.Free;
|
|
Invalidate;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
procedure TDBAdvGlowButton.SetConfirmActionString(const Value: String);
|
|
begin
|
|
if FConfirmActionString <> Value then
|
|
begin
|
|
FConfirmActionString := Value;
|
|
end;
|
|
end;
|
|
|
|
{$ENDIF}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
{$IFDEF DELPHI6_LVL}
|
|
|
|
{ TAdvGlowButtonActionLink }
|
|
|
|
procedure TAdvGlowButtonActionLink.AssignClient(AClient: TObject);
|
|
begin
|
|
inherited AssignClient(AClient);
|
|
FClient := AClient as TAdvCustomGlowButton;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
function TAdvGlowButtonActionLink.IsCheckedLinked: Boolean;
|
|
begin
|
|
Result := inherited IsCheckedLinked {and (FClient.GroupIndex <> 0) and
|
|
FClient.AllowAllUp} and (FClient.Down = (Action as TCustomAction).Checked);
|
|
|
|
FClient.CheckLinked := Result;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
function TAdvGlowButtonActionLink.IsGroupIndexLinked: Boolean;
|
|
begin
|
|
Result := (FClient is TAdvCustomGlowButton) and
|
|
(TAdvCustomGlowButton(FClient).GroupIndex = (Action as TCustomAction).GroupIndex);
|
|
|
|
FClient.GroupIndexLinked := Result;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvGlowButtonActionLink.SetImageIndex(Value: Integer);
|
|
begin
|
|
if IsGroupIndexLinked then
|
|
begin
|
|
FImageIndex := Value;
|
|
TAdvCustomGlowButton(FClient).ImageIndex := Value;
|
|
end;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
function TAdvGlowButtonActionLink.IsImageIndexLinked: boolean;
|
|
begin
|
|
Result := inherited IsImageIndexLinked and
|
|
(FImageIndex = (Action as TCustomAction).ImageIndex);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvGlowButtonActionLink.SetChecked(Value: Boolean);
|
|
begin
|
|
if IsCheckedLinked then
|
|
TAdvCustomGlowButton(FClient).Down := Value;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
procedure TAdvGlowButtonActionLink.SetGroupIndex(Value: Integer);
|
|
begin
|
|
if IsGroupIndexLinked then
|
|
TAdvCustomGlowButton(FClient).GroupIndex := Value;
|
|
end;
|
|
|
|
{$ENDIF}
|
|
|
|
{ TShortCutHintWindow }
|
|
|
|
procedure TShortCutHintWindow.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
inherited;
|
|
Params.Style := Params.Style and not WS_BORDER;
|
|
end;
|
|
|
|
procedure TShortCutHintWindow.Paint;
|
|
var
|
|
r: TRect;
|
|
begin
|
|
r := ClientRect;
|
|
DrawGradient(Canvas, Color, ColorTo, 16, r, false);
|
|
Canvas.Brush.Style := bsClear;
|
|
Canvas.Font.Assign(self.Font);
|
|
|
|
DrawText(Canvas.Handle,PChar(Caption),Length(Caption),r, DT_CENTER or DT_SINGLELINE or DT_VCENTER);
|
|
|
|
Canvas.Pen.Color := clGray;
|
|
RoundRect(Canvas.Handle, R.Left, R.Top, R.Right, R.Bottom, 3,3);
|
|
end;
|
|
|
|
|
|
procedure TShortCutHintWindow.Resize;
|
|
var
|
|
ow: integer;
|
|
begin
|
|
inherited;
|
|
ow := Canvas.TextWidth('O') + 8;
|
|
if Width < ow then
|
|
Width := ow;
|
|
end;
|
|
|
|
procedure TShortCutHintWindow.WMEraseBkGnd(var Message: TWMEraseBkGnd);
|
|
begin
|
|
Message.Result := 1;
|
|
end;
|
|
|
|
|
|
|
|
function TAdvCustomGlowButton.CanDrawBorder: Boolean;
|
|
begin
|
|
Result := (BorderStyle = bsSingle);
|
|
end;
|
|
|
|
function TAdvCustomGlowButton.CanDrawFocused: Boolean;
|
|
begin
|
|
Result := (GetFocus = self.Handle) and (FocusType in [ftBorder, ftHotBorder]);
|
|
end;
|
|
|
|
{$IFDEF FREEWARE}
|
|
{$I TRIAL.INC}
|
|
{$ENDIF}
|
|
|
|
|
|
|
|
|
|
end.
|