cxlookandfeelpainters.pas
来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,181 行 · 第 1/5 页
PAS
1,181 行
class function ButtonColor(AState: TcxButtonState): TColor; override;
class function ButtonFocusRect(ACanvas: TcxCanvas; R: TRect): TRect; override;
class function ButtonGroupBorderSizes(AButtonCount, AButtonIndex: Integer): TRect; override;
class function ButtonSymbolColor(AState: TcxButtonState;
ADefaultColor: TColor = clDefault): TColor; override;
class function ButtonTextOffset: Integer; override;
class function ButtonTextShift: Integer; override;
class procedure DrawButton(ACanvas: TcxCanvas; R: TRect; const ACaption: string;
AState: TcxButtonState; ADrawBorder: Boolean = True; AColor: TColor = clDefault;
ATextColor: TColor = clDefault; AWordWrap: Boolean = False); override;
class procedure DrawExpandButton(ACanvas: TcxCanvas; const R: TRect; AExpanded: Boolean; AColor: TColor = clDefault); override;
class function DrawExpandButtonFirst: Boolean; override;
class procedure DrawGroupExpandButton(ACanvas: TcxCanvas; const R: TRect; AExpanded: Boolean; AState: TcxButtonState); override;
class procedure DrawSmallExpandButton(ACanvas: TcxCanvas; R: TRect; AExpanded: Boolean;
ABorderColor: TColor; AColor: TColor = clDefault); override;
class function ExpandButtonSize: Integer; override;
class function GroupExpandButtonSize: Integer; override;
class function SmallExpandButtonSize: Integer; override;
class function IsButtonHotTrack: Boolean; override;
class function IsPointOverGroupExpandButton(const R: TRect; const P: TPoint): Boolean; override;
// checkbox
class function CheckBorderSize: Integer; override;
class function CheckButtonSize: TSize; override;
class procedure DrawCheck(ACanvas: TcxCanvas; const R: TRect; AState: TcxButtonState;
AChecked: Boolean; AColor: TColor); override;
class procedure DrawCheckBorder(ACanvas: TcxCanvas; R: TRect; AState: TcxButtonState); override;
// RadioGroup
class procedure DrawRadioButton(ACanvas: TcxCanvas; X, Y: Integer;
AButtonState: TcxButtonState; AChecked: Boolean; AFocused: Boolean; ABrushColor: TColor; AIsDesigning: Boolean = False); override;
class function RadioButtonSize: TSize; override;
// header
class procedure DrawHeader(ACanvas: TcxCanvas; const ABounds, ATextAreaBounds: TRect;
ANeighbors: TcxNeighbors; ABorders: TcxBorders; AState: TcxButtonState;
AAlignmentHorz: TAlignment; AAlignmentVert: TcxAlignmentVert; AMultiLine, AShowEndEllipsis: Boolean;
const AText: string; AFont: TFont; ATextColor, ABkColor: TColor;
AOnDrawBackground: TcxDrawBackgroundEvent = nil; AIsLast: Boolean = False;
AInGroupByBox: Boolean = False); override;
class procedure DrawHeaderPressed(ACanvas: TcxCanvas; const ABounds: TRect); override;
class procedure DrawHeaderControlSection(ACanvas: TcxCanvas; const ABounds, ATextAreaBounds: TRect;
ANeighbors: TcxNeighbors; ABorders: TcxBorders; AState: TcxButtonState;
AAlignmentHorz: TAlignment; AAlignmentVert: TcxAlignmentVert; AMultiLine,
AShowEndEllipsis: Boolean; const AText: string; AFont: TFont; ATextColor,
ABkColor: TColor); override;
class procedure DrawSortingMark(ACanvas: TcxCanvas; const R: TRect; AAscendingSorting: Boolean); override;
class function HeaderBorderSize: Integer; override;
class function HeaderControlSectionBorderSize(
AState: TcxButtonState = cxbsNormal): Integer; override;
class function HeaderControlSectionContentBounds(const ABounds: TRect;
AState: TcxButtonState): TRect; override;
// class function HeaderDrawCellsFirst: Boolean; override;
class function IsHeaderHotTrack: Boolean; override;
class function SortingMarkSize: TPoint; override;
// footer
class procedure DrawFooterBorder(ACanvas: TcxCanvas; const R: TRect); override;
class procedure DrawFooterCell(ACanvas: TcxCanvas; const ABounds: TRect;
AAlignmentHorz: TAlignment; AAlignmentVert: TcxAlignmentVert; AMultiLine: Boolean;
const AText: string; AFont: TFont; ATextColor, ABkColor: TColor;
AOnDrawBackground: TcxDrawBackgroundEvent = nil); override;
class function FooterBorderSize: Integer; override;
class function FooterCellBorderSize: Integer; override;
class function FooterCellOffset: Integer; override;
class function FooterDrawCellsFirst: Boolean; override;
// filter
class procedure DrawFilterCloseButton(ACanvas: TcxCanvas; R: TRect; AState: TcxButtonState); override;
class procedure DrawFilterDropDownButton(ACanvas: TcxCanvas; R: TRect; AState: TcxButtonState; AIsFilterActive: Boolean); override;
class function FilterActivateButtonSize: TPoint; override;
class function FilterCloseButtonSize: TPoint; override;
// tabs
class procedure DrawTab(ACanvas: TcxCanvas; R: TRect; ABorders: TcxBorders;
const AText: string; AState: TcxButtonState; AVertical: Boolean; AFont: TFont;
ATextColor, ABkColor: TColor; AShowPrefix: Boolean = False); override;
class procedure DrawTabBorder(ACanvas: TcxCanvas; R: TRect; ABorder: TcxBorder; ABorders: TcxBorders; AVertical: Boolean); override;
class procedure DrawTabsRoot(ACanvas: TcxCanvas; const R: TRect; ABorders: TcxBorders; AVertical: Boolean); override;
class function IsDrawTabImplemented(AVertical: Boolean): Boolean; override;
class function IsTabHotTrack(AVertical: Boolean): Boolean; override;
class function TabBorderSize(AVertical: Boolean): Integer; override;
// indicator
class procedure DrawIndicatorItem(ACanvas: TcxCanvas; const R: TRect;
AKind: TcxIndicatorKind; AColor: TColor; AOnDrawBackground: TcxDrawBackgroundEvent = nil); override;
//class function IndicatorDrawItemsFirst: Boolean; override;
// scrollbars
class function ScrollBarMinimalThumbSize(AVertical: Boolean): Integer; override;
class procedure DrawScrollBarPart(ACanvas: TcxCanvas; AHorizontal: Boolean;
R: TRect; APart: TcxScrollBarPart; AState: TcxButtonState); override;
// ms outlook
class function DefaultSchedulerViewContentColor: TColor; override;
class procedure DrawMonthHeader(ACanvas: TcxCanvas; const ABounds: TRect;
const AText: string; ANeighbors: TcxNeighbors; const AViewParams: TcxViewParams;
AArrows: TcxHeaderArrows; ASideWidth: Integer; AOnDrawBackground: TcxDrawBackgroundEvent = nil); override;
class procedure DrawSchedulerEventProgress(ACanvas: TcxCanvas;
const ABounds, AProgressChunk: TRect; AViewParams: TcxViewParams;
ATransparent: Boolean); override;
class procedure DrawSchedulerNavigatorButton(ACanvas: TcxCanvas; R: TRect; AState: TcxButtonState); override;
class procedure DrawSchedulerSplitterBorder(ACanvas: TcxCanvas; R: TRect; const AViewParams: TcxViewParams; AIsHorizontal: Boolean); override;
class function SchedulerEventProgressOffsets: TRect; override;
// size grip
class procedure DrawSizeGrip(ACanvas: TcxCanvas; const ARect: TRect; ABackgroundColor: TColor = clDefault); override;
// Panel
class procedure DrawPanelBackground(ACanvas: TcxCanvas; AControl: TWinControl; ABounds: TRect;
AColorFrom: TColor = clDefault; AColorTo: TColor = clDefault); override;
end;
{ TcxExtendedStylePainters }
TcxExtendedStylePainterInfo = class
public
Data: TObject;
Name: string;
Painter: TcxCustomLookAndFeelPainterClass;
constructor Create(const AName: string;
APainter: TcxCustomLookAndFeelPainterClass; AData: TObject); virtual;
destructor Destroy; override;
end;
TcxExtendedStylePainters = class(TcxObjectList)
private
FListeners: TInterfaceList;
function GetData(AIndex: Integer): TObject;
function GetItem(AIndex: Integer): TcxExtendedStylePainterInfo;
function GetName(AIndex: Integer): string;
function GetPainter(AIndex: Integer): TcxCustomLookAndFeelPainterClass;
protected
procedure Changed(APainter: TcxCustomLookAndFeelPainterClass);
function FindInfoByName(const AName: string; var AInfo: TcxExtendedStylePainterInfo): Integer;
procedure SortPainters;
public
constructor Create; virtual;
destructor Destroy; override;
procedure AddListener(AListener: IcxLookAndFeelPainterListener);
procedure RemoveListener(AListener: IcxLookAndFeelPainterListener);
function Register(const AName: string;
APainter: TcxCustomLookAndFeelPainterClass; AData: TObject): Boolean;
function GetNameByPainter(APainter: TcxCustomLookAndFeelPainterClass;
out AName: string): Boolean;
function GetPainterData(APainter: TcxCustomLookAndFeelPainterClass; var Data): Boolean;
function GetPainterByName(const AName: string;
out Painter: TcxCustomLookAndFeelPainterClass): Boolean;
function Unregister(const AName: string): Boolean;
property Data[Index: Integer]: TObject read GetData;
property Listeners: TInterfaceList read FListeners write FListeners;
property Names[Index: Integer]: string read GetName;
property Items[Index: Integer]: TcxExtendedStylePainterInfo read GetItem;
property Painters[Index: Integer]: TcxCustomLookAndFeelPainterClass read GetPainter;
end;
function BtnStateToXPBtnState(AState: TcxButtonState): Integer;
function GetCurrentPainterClass: TcxCustomLookAndFeelPainterClass;
function GetExtendedStylePainters: TcxExtendedStylePainters;
procedure PrepareRadioButtonImageList;
procedure UpdateScrollBarBitmaps;
function cxTextRect(const R: TRect): TRect;
var
cxIndicatorImages: TImageList;
implementation
{$R cxLookAndFeelPainters.res}
uses
Messages,
Forms, SysUtils, dxThemeConsts, cxControls, cxLookAndFeels, Math;
const
FilterDropDownButtonWidth = 15;
SortingMarkAreaWidth = 16;
FilterActiveButtonWidth = 13;
FilterActiveButtonHeight = 13;
FilterCloseButtonWidth = 16;
FilterCloseButtonHeight = 14;
ActiveFilterButtonArrowColor = clBlue;
type
{ TSystemPaletteChangedNotifier }
TSystemPaletteChangedNotifier = class(TcxSystemPaletteChangedNotifier)
protected
procedure DoChanged; override;
end;
{ TcxRadioButtonImageList }
TcxRadioButtonImageList = class
private
FButtonMask: TBitmap;
FList: TImageList;
function GetImageIndex(ALookAndFeelKind: TcxLookAndFeelKind;
AButtonState: TcxButtonState;
AChecked, AFocused, AIsDesigning: Boolean): Integer;
function GetImageListIndexMapIndex(ALookAndFeelKind: TcxLookAndFeelKind;
AButtonState: TcxButtonState;
AChecked, AFocused, AIsDesigning: Boolean): Integer;
public
constructor Create;
destructor Destroy; override;
procedure Draw(ACanvas: TcxCanvas; X, Y: Integer; ABrushColor: TColor;
ALookAndFeelKind: TcxLookAndFeelKind; AButtonState: TcxButtonState;
AChecked, AFocused, AIsDesigning: Boolean);
function GetSize: TSize;
procedure Prepare;
procedure Reset;
end;
var
ExtendedStylePainters: TcxExtendedStylePainters;
FCheckButtonSize: TSize;
FRadioButtonImageList: TcxRadioButtonImageList;
FRadioButtonImageListIndexes: array of Integer;
FSystemPaletteChangedNotifier: TSystemPaletteChangedNotifier;
StdScrollBitmaps: array[Boolean] of TBitmap;
function LookAndFeelStyleToLookAndFeelKind(
ALookAndFeelStyle: TcxLookAndFeelStyle): TcxLookAndFeelKind;
begin
case ALookAndFeelStyle of
lfsFlat:
Result := lfFlat;
lfsStandard:
Result := lfStandard;
lfsUltraFlat:
Result := lfUltraFlat;
lfsOffice11:
Result := lfOffice11;
else
Result := lfStandard;
end;
end;
function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer;
begin
Result := Windows.MulDiv(nNumber, nNumerator, nDenominator)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?