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 + -
显示快捷键?