cxgroupbox.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,801 行 · 第 1/5 页

PAS
1,801
字号
    procedure SetAlignment(Value: TcxCaptionAlignment);
    procedure SetCaptionBkColor(Value: TColor); // deprecated
    procedure SetColor(Value: TColor); // deprecated
    procedure SetFont(Value: TFont); // deprecated
    procedure SetPanelStyle(AValue: TcxPanelStyle);
    procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
    procedure WMNCPaint(var Message: TWMNCPaint);
  {$IFNDEF DELPHI7}
    procedure WMPrintClient(var Message: TMessage); message WM_PRINTCLIENT;
  {$ENDIF}
  protected
    procedure AdjustClientRect(var Rect: TRect); override;
    function CanAutoSize: Boolean; override;
    function CanFocusOnClick: Boolean; override;
    function CanHaveTransparentBorder: Boolean; override;

    procedure ContainerStyleChanged(Sender: TObject); override;
    function CreatePanelStyle: TcxPanelStyle; virtual;
    function DefaultParentColor: Boolean; override;
    procedure FontChanged; override;
    function GetShadowBounds: TRect; override;
    procedure Initialize; override;
    function InternalGetActiveStyle: TcxContainerStyle; override;
    function InternalGetNotPublishedStyleValues: TcxEditStyleValues; override;
    function IsContainerClass: Boolean; override;
    function IsNativeBackground: Boolean; override;
    function IsPanelStyle: Boolean;
    procedure LookAndFeelChanged(Sender: TcxLookAndFeel;
      AChangedValues: TcxLookAndFeelValues); override;
    procedure Paint; override;
    procedure TextChanged; override;
    function HasShadow: Boolean; override;
    procedure AdjustCanvasFontSettings(ACanvas: TcxCanvas);
    function DoCustomDraw: Boolean;
  {$IFDEF DELPHI7}
    function DoCustomDrawCaption(ACanvas: TcxCanvas; const ABounds: TRect; const APainter: TcxCustomLookAndFeelPainterClass): Boolean; virtual;
    function DoCustomDrawContentBackground(ACanvas: TcxCanvas; const ABounds: TRect; const APainter: TcxCustomLookAndFeelPainterClass): Boolean; virtual;
    procedure DoMeasureCaptionHeight(const APainter: TcxCustomLookAndFeelPainterClass; var ACaptionHeight: Integer);
  {$ENDIF}
    function GetCaptionDrawingFlags: Cardinal;
    function HasNonClientArea: Boolean; virtual;
    function IsNonClientAreaSupported: Boolean; virtual;
    function IsVerticalText: Boolean;
    procedure CalculateCaptionFont;
    procedure WndProc(var Message: TMessage); override;
    property CaptionBkColor: TColor read GetCaptionBkColor write SetCaptionBkColor stored False; // deprecated
    property Color: TColor read GetColor write SetColor stored False; // deprecated
    property Ctl3D;
    property Font: TFont read GetFont write SetFont stored False; // deprecated
    property PanelStyle: TcxPanelStyle read FPanelStyle write SetPanelStyle;
    property ParentBackground;
    property TabStop default False;
    property OnCustomDraw: TcxGroupBoxCustomDrawEvent read FOnCustomDraw write FOnCustomDraw;
  {$IFDEF DELPHI7}
    property OnCustomDrawCaption: TcxGroupBoxCustomDrawElementEvent read FOnCustomDrawCaption write FOnCustomDrawCaption;
    property OnCustomDrawContentBackground: TcxGroupBoxCustomDrawElementEvent read FOnCustomDrawContentBackground write FOnCustomDrawContentBackground;
    property OnMeasureCaptionHeight: TcxGroupBoxMeasureCaptionHeightEvent read FOnMeasureCaptionHeight write FOnMeasureCaptionHeight;
  {$ENDIF}
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
    property Alignment: TcxCaptionAlignment read FAlignment write SetAlignment
      default alTopLeft;
    property Transparent;
  end;

  { TcxGroupBox }

  TcxGroupBox = class(TcxCustomGroupBox)
  published
    property Align;
    property Alignment;
    property Anchors;
    property BiDiMode;
    property Caption;
    property CaptionBkColor; // deprecated
    property Color; // deprecated
    property Constraints;
    property Ctl3D;
    property DockSite;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property Font; // deprecated
    property LookAndFeel; // deprecated
    property ParentBackground;
    property ParentBiDiMode;
    property ParentColor;
    property ParentCtl3D;
    property ParentFont;
    property PanelStyle;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property Style;
    property StyleDisabled;
    property StyleFocused;
    property StyleHot;
    property TabOrder;
    property TabStop;
    property Transparent;
    property Visible;
    property OnClick;
    property OnContextPopup;
    property OnCustomDraw;
  {$IFDEF DELPHI7}
    property OnCustomDrawCaption;
    property OnCustomDrawContentBackground;
  {$ENDIF}
    property OnDblClick;
    property OnDockDrop;
    property OnDockOver;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnGetSiteInfo;
  {$IFDEF DELPHI7}
    property OnMeasureCaptionHeight;
  {$ENDIF}
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
    property OnUnDock;
  end;

  { TcxCustomButtonGroup }

  TcxCustomButtonGroup = class(TcxCustomGroupBox)
  private
    FButtons: TList;
    procedure DoButtonDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure DoButtonDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure DoButtonKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure DoButtonKeyPress(Sender: TObject; var Key: Char);
    procedure DoButtonKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure DoButtonMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure DoButtonMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    procedure DoButtonMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure DoButtonMouseWheel(Sender: TObject;
       Shift: TShiftState; WheelDelta: Integer;
      MousePos: TPoint; var Handled: Boolean);
    function GetProperties: TcxCustomButtonGroupProperties;
    function GetActiveProperties: TcxCustomButtonGroupProperties;
    procedure SetProperties(Value: TcxCustomButtonGroupProperties);
    procedure WMWindowPosChanged(var Message: TWMWindowPosChanged);
      message WM_WINDOWPOSCHANGED;
  protected
    function CanAutoSize: Boolean; override;
    procedure ContainerStyleChanged(Sender: TObject); override;
    procedure CursorChanged; override;
    procedure DoEditKeyDown(var Key: Word; Shift: TShiftState); override;
    procedure EnabledChanged; override;
    procedure Initialize; override;
    function IsButtonDC(ADC: THandle): Boolean; override;
    function IsContainerClass: Boolean; override;
    procedure PropertiesChanged(Sender: TObject); override;
    procedure ReadState(Reader: TReader); override;
    function RefreshContainer(const P: TPoint; Button: TcxMouseButton; Shift: TShiftState;
      AIsMouseEvent: Boolean): Boolean; override;
    procedure CreateHandle; override;
    procedure ArrangeButtons; virtual;
    function GetButtonDC(AButtonIndex: Integer): THandle; virtual; abstract;
    function GetButtonIndexAt(const P: TPoint): Integer;
    function GetButtonInstance: TWinControl; virtual; abstract;
    function GetFocusedButtonIndex: Integer;
    procedure InitButtonInstance(AButton: TWinControl); virtual;
    function IsNonClientAreaSupported: Boolean; override;
    procedure SetButtonCount(Value: Integer); virtual;
    procedure SynchronizeButtonsStyle; virtual;
    procedure UpdateButtons; virtual;
    property InternalButtons: TList read FButtons;
    property TabStop default True;
  public
    destructor Destroy; override;
    procedure ActivateByMouse(Shift: TShiftState; X, Y: Integer;
      var AEditData: TcxCustomEditData); override;
    function Focused: Boolean; override;
    class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
    procedure GetTabOrderList(List: TList); override;
    function IsButtonNativeStyle: Boolean;
    property AutoSize default False;
    property ActiveProperties: TcxCustomButtonGroupProperties
      read GetActiveProperties;
    property Properties: TcxCustomButtonGroupProperties read GetProperties
      write SetProperties;
  end;

implementation

uses
{$IFDEF DELPHI6}
  Variants,
{$ENDIF}
  dxThemeConsts, cxEditUtils, Math, Types, dxOffice11, TypInfo, dxThemeManager,
  dxUxTheme, cxDrawTextUtils, cxGeometry;

const
  cxCaptionRectLeftBound = 8;
  cxNativeState: array[Boolean] of Integer = (GBS_DISABLED, GBS_NORMAL);

  WM_DXUPDATENONCLIENTAREA: Cardinal = WM_DX + $10;

type
  TControlAccess = class(TControl);
  TWinControlAccess = class(TWinControl);

function cxGroupBoxAlignment2GroupBoxCaption(AAlignment: TcxCaptionAlignment): TcxGroupBoxCaptionPosition;
begin
  if AAlignment in [alTopLeft, alTopCenter, alTopRight] then
    Result := cxgpTop
  else
  if AAlignment in [alBottomLeft, alBottomCenter, alBottomRight] then
    Result := cxgpBottom
  else
  if AAlignment in [alLeftTop, alLeftCenter, alLeftBottom] then
    Result := cxgpLeft
  else
  if AAlignment in [alRightTop, alRightCenter, alRightBottom] then
    Result := cxgpRight
  else
    Result := cxgpCenter;
end;

{ TcxGroupBoxButtonViewInfo }

function TcxGroupBoxButtonViewInfo.GetGlyphRect(ACanvas: TcxCanvas; AGlyphSize: TSize; AAlignment: TLeftRight; AIsPaintCopy: Boolean): TRect;
begin
  Result.Top := Bounds.Top + (Bounds.Bottom - Bounds.Top - AGlyphSize.cy) div 2;
  Result.Bottom := Result.Top + AGlyphSize.cy;
  if AAlignment = taRightJustify then
  begin
    Result.Left := Bounds.Left;
    Result.Right := Result.Left + AGlyphSize.cx;
  end
  else
  begin
    Result.Right := Bounds.Right;
    Result.Left := Result.Right - AGlyphSize.cx;
  end;
end;

{ TcxGroupBoxViewInfo }

constructor TcxGroupBoxViewInfo.Create;
begin
  inherited Create;
end;

destructor TcxGroupBoxViewInfo.Destroy;
begin
  inherited Destroy;
end;

procedure TcxGroupBoxViewInfo.AdjustCaptionRect(ACaptionPosition: TcxGroupBoxCaptionPosition);
var
  ACaptionHeight: Integer;
begin
  if not Edit.IsVerticalText then
    ACaptionHeight := cxRectHeight(CaptionRect)
  else
    ACaptionHeight := cxRectWidth(CaptionRect);
{$IFDEF DELPHI7}
  Edit.DoMeasureCaptionHeight(Painter, ACaptionHeight);
{$ENDIF}
  case Edit.Alignment of
    alTopLeft, alTopCenter, alTopRight:
      CaptionRect.Bottom := CaptionRect.Top + ACaptionHeight;
    alBottomLeft, alBottomCenter, alBottomRight:
      CaptionRect.Top := CaptionRect.Bottom - ACaptionHeight;
    alLeftTop, alLeftCenter, alLeftBottom:
      CaptionRect.Right := CaptionRect.Left + ACaptionHeight;
    alRightTop, alRightCenter, alRightBottom:
      CaptionRect.Left := CaptionRect.Right - ACaptionHeight;
  end;
end;

procedure TcxGroupBoxViewInfo.DrawCaption(ACanvas: TcxCanvas);

  procedure AdjustRectForBordersNone(var R: TRect);
  var
    ACaptionPos: TcxGroupBoxCaptionPosition;
    ARect: TRect;
  begin
    if (BorderStyle = ebsNone) then
    begin
      ACaptionPos := cxGroupBoxAlignment2GroupBoxCaption(Edit.Alignment);
      case ACaptionPos of
        cxgpTop:
          ACaptionPos := cxgpBottom;
        cxgpBottom:
          ACaptionPos := cxgpTop;
        cxgpLeft:
          ACaptionPos := cxgpRight;
        cxgpRight:
          ACaptionPos := cxgpLeft;
      end;
      ARect := Painter.GroupBoxBorderSize(False, ACaptionPos);
      R := Rect(R.Left - ARect.Left, R.Top - ARect.Top, R.Right + ARect.Right, R.Bottom + ARect.Bottom);
    end;
  end;

var
  ACaptionPos: TcxGroupBoxCaptionPosition;
  ACaptionRect: TRect;
begin
  ACanvas.SaveClipRegion;
  try
    ACanvas.SetClipRegion(TcxRegion.Create(CaptionRect), roIntersect);
    if (Edit.FVisibleCaption = '') {$IFDEF DELPHI7}or Edit.DoCustomDrawCaption(ACanvas, CaptionRect, Painter){$ENDIF} then
      Exit;
    Edit.AdjustCanvasFontSettings(ACanvas);
    if Assigned(Painter) then
    begin
      ACaptionPos := cxGroupBoxAlignment2GroupBoxCaption(Edit.Alignment);
      if not Edit.IsPanelStyle then
      begin
        ACaptionRect := CaptionRect;
        AdjustRectForBordersNone(ACaptionRect);
        Painter.DrawGroupBoxCaption(ACanvas, ACaptionRect, ACaptionPos);
      end;
    end;
    ACanvas.Brush.Style := bsClear;
    if not Edit.IsVerticalText then
      DrawHorizontalTextCaption(ACanvas)
    else
      DrawVerticalTextCaption(ACanvas);
  finally
    ACanvas.RestoreClipRegion;
  end;
end;

function TcxGroupBoxViewInfo.GetButtonViewInfoClass: TcxEditButtonViewInfoClass;
begin
  Result := TcxGroupBoxButtonViewInfo;
end;

procedure TcxGroupBoxViewInfo.InternalPaint(ACanvas: TcxCanvas);
begin
  if IsInplace then
  begin
    if Edit = nil then
      inherited InternalPaint(ACanvas)
    else
      if IsCustomBackground then
        DrawBackground(ACanvas)
      else
        cxEditFillRect(ACanvas, Bounds, BackgroundColor);
    Exit;
  end;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?