cxradiogroup.pas

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

PAS
2,138
字号

{********************************************************************}
{                                                                    }
{       Developer Express Visual Component Library                   }
{       ExpressEditors                                               }
{                                                                    }
{       Copyright (c) 1998-2008 Developer Express Inc.               }
{       ALL RIGHTS RESERVED                                          }
{                                                                    }
{   The entire contents of this file is protected by U.S. and        }
{   International Copyright Laws. Unauthorized reproduction,         }
{   reverse-engineering, and distribution of all or any portion of   }
{   the code contained in this file is strictly prohibited and may   }
{   result in severe civil and criminal penalties and will be        }
{   prosecuted to the maximum extent possible under the law.         }
{                                                                    }
{   RESTRICTIONS                                                     }
{                                                                    }
{   THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES            }
{   (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE     }
{   SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS    }
{   LICENSED TO DISTRIBUTE THE EXPRESSEDITORS AND ALL                }
{   ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{                                                                    }
{   THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED       }
{   FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE         }
{   COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE        }
{   AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT   }
{   AND PERMISSION FROM DEVELOPER EXPRESS INC.                       }
{                                                                    }
{   CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON        }
{   ADDITIONAL RESTRICTIONS.                                         }
{                                                                    }
{********************************************************************}

unit cxRadioGroup;

{$I cxVer.inc}

interface

uses
   Windows,
  Messages,
{$IFDEF DELPHI6}
  Variants,
{$ENDIF}
  Classes, Controls, Forms, Graphics, ImgList, StdCtrls, SysUtils, cxClasses,
  cxContainer, cxControls, cxDataStorage, cxEdit, cxGraphics, cxLookAndFeels,
  Menus, cxTextEdit, cxGroupBox, dxUxTheme, cxDropDownEdit, cxFilterControlUtils;

type
  TcxRadioButtonState = (rbsDisabled, rbsHot, rbsNormal, rbsPressed);
  TcxRadioGroupState = (rgsActive, rgsDisabled, rgsHot, rgsNormal);

  TcxCustomRadioGroup = class;
  TcxCustomRadioGroupProperties = class;

  { TcxRadioButton }

  TcxRadioButton = class(TRadioButton, IUnknown,
    IcxMouseTrackingCaller, IcxLookAndFeelContainer, IdxSkinSupport)
  private
    FButtonRect: TRect;
    FCanvas: TcxCanvas;
    FColumn: Integer;
    FControlCanvas: TControlCanvas;
    FLookAndFeel: TcxLookAndFeel;
    FPopupMenu: TComponent;
    FRow: Integer;
    FState: TcxRadioButtonState;
    FTransparent: Boolean;
  {$IFNDEF DELPHI7}
    FParentBackground: Boolean;
    FWordWrap: Boolean;
  {$ENDIF}
    function GetTextColor: TColor;
    procedure DrawItem(const DrawItemStruct: TDrawItemStruct);
    function IsDisabledTextColorAssigned: Boolean;
    function GetRadioButtonRect(const ARadioButtonSize: TSize;
      ANativeStyle: Boolean): TRect;
    procedure SetLookAndFeel(Value: TcxLookAndFeel);
    procedure SetPopupMenu(Value: TComponent);
    procedure SetState(Value: TcxRadioButtonState);
    procedure SetTransparent(Value: Boolean);
  {$IFNDEF DELPHI7}
    procedure SetParentBackground(Value: Boolean);
    procedure SetWordWrap(Value: Boolean);
  {$ENDIF}
    procedure WMContextMenu(var Message: TWMContextMenu); message WM_CONTEXTMENU;
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
    procedure WMWindowPosChanged(var Message: TWMWindowPosChanged);
      message WM_WINDOWPOSCHANGED;
    procedure BMSetCheck(var Message: TMessage); message BM_SETCHECK;
    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
    procedure CMSysColorChange(var Message: TMessage); message CM_SYSCOLORCHANGE;
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
    procedure CNKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN;
    procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;
    procedure CNSysKeyDown(var Message: TWMSysKeyDown); message CN_SYSKEYDOWN;
  protected
    procedure CreateHandle; override;
    procedure CreateParams(var Params: TCreateParams); override;
    procedure DoEnter; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;

    procedure CorrectTextRect(var R: TRect; ANativeStyle: Boolean); virtual;
    procedure DoContextPopup(MousePos: TPoint;
      var Handled: Boolean); {$IFNDEF DELPHI5}virtual{$ELSE}override{$ENDIF};
    function DoShowPopupMenu(APopupMenu: TComponent;
      X, Y: Integer): Boolean; virtual;
    procedure DrawBackground; virtual;
    procedure DrawCaption(ACanvas: TcxCanvas; ANativeStyle: Boolean); virtual;
    procedure EnabledChanged; dynamic;
    procedure InternalPolyLine(const APoints: array of TPoint);
    function IsInplace: Boolean; virtual;
    function IsNativeBackground: Boolean; virtual;
    function IsNativeStyle: Boolean; virtual;
    function IsTransparent: Boolean; virtual;
    function IsTransparentBackground: Boolean; virtual;
    procedure LookAndFeelChanged(Sender: TcxLookAndFeel;
      AChangedValues: TcxLookAndFeelValues); virtual;
    procedure MouseEnter(AControl: TControl); dynamic;
    procedure MouseLeave(AControl: TControl); dynamic;
    procedure Paint(ADrawOnlyFocusedState: Boolean); virtual;
    procedure ShortUpdateState;
    procedure UpdateState(Button: TcxMouseButton; Shift: TShiftState;
      const P: TPoint); virtual;

    // IcxMouseTrackingCaller
    procedure IcxMouseTrackingCaller.MouseLeave = MouseTrackingCallerMouseLeave;
    procedure MouseTrackingCallerMouseLeave;

    // IcxLookAndFeelContainer
    function GetLookAndFeel: TcxLookAndFeel;

    property Canvas: TcxCanvas read FCanvas;
    property Column: Integer read FColumn;
    property Row: Integer read FRow;
    property State: TcxRadioButtonState read FState write SetState;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function Focused: Boolean; override;
    procedure Invalidate; override;
  published
    property LookAndFeel: TcxLookAndFeel read FLookAndFeel write SetLookAndFeel;
    property PopupMenu: TComponent read FPopupMenu write SetPopupMenu;
    property ParentBackground{$IFNDEF DELPHI7}: Boolean read FParentBackground write SetParentBackground{$ENDIF} default True;
    property Transparent: Boolean read FTransparent write SetTransparent default False;
  {$IFNDEF DELPHI7}
    property WordWrap: Boolean read FWordWrap write SetWordWrap default False;
  {$ENDIF}
  end;

  {  TcxRadioGroupButtonViewInfo  }

  TcxRadioGroupButtonViewInfo = class(TcxGroupBoxButtonViewInfo)
  public
    function GetGlyphRect(ACanvas: TcxCanvas; AGlyphSize: TSize; AAlignment: TLeftRight; AIsPaintCopy: Boolean): TRect; override;
  end;

  { TcxCustomRadioGroupViewInfo }

  TcxCustomRadioGroupViewInfo = class(TcxButtonGroupViewInfo)
  private
    function GetEdit: TcxCustomRadioGroup;
    function ThemeHandle: TdxTheme;
  protected
    procedure DrawButtonCaption(ACanvas: TcxCanvas;
      AButtonViewInfo: TcxGroupBoxButtonViewInfo; const AGlyphRect: TRect); override;
    procedure DrawButtonGlyph(ACanvas: TcxCanvas;
      AButtonViewInfo: TcxGroupBoxButtonViewInfo; const AGlyphRect: TRect); override;
    function GetButtonViewInfoClass: TcxEditButtonViewInfoClass; override;
    function IsButtonGlypthTransparent(AButtonViewInfo: TcxGroupBoxButtonViewInfo): Boolean; override;
  public
    ItemIndex: Integer;
    constructor Create; override;
    property Edit: TcxCustomRadioGroup read GetEdit;
  end;

  { TcxCustomRadioGroupViewData }

  TcxCustomRadioGroupViewData = class(TcxButtonGroupViewData)
  private
    function GetProperties: TcxCustomRadioGroupProperties;
  protected
    procedure GetEditMetrics(AAutoHeight: Boolean; ACanvas: TcxCanvas;
      out AMetrics: TcxEditMetrics); override;
    procedure CalculateButtonNativeState(AViewInfo: TcxCustomEditViewInfo;
      AButtonViewInfo: TcxGroupBoxButtonViewInfo); override;
  public
    procedure Calculate(ACanvas: TcxCanvas; const ABounds: TRect; const P: TPoint;
      Button: TcxMouseButton; Shift: TShiftState; AViewInfo: TcxCustomEditViewInfo;
      AIsMouseEvent: Boolean); override;
    procedure EditValueToDrawValue(ACanvas: TcxCanvas; const AEditValue: TcxEditValue;
      AViewInfo: TcxCustomEditViewInfo); override;
    property Properties: TcxCustomRadioGroupProperties read GetProperties;
  end;

  { TcxRadioGroupItem }

  TcxRadioGroupItem = class(TcxButtonGroupItem)
  private
    FValue: TcxEditValue;
    function IsValueStored: Boolean;
    procedure SetValue(const Value: TcxEditValue);
  public
    constructor Create(Collection: TCollection); override;
    procedure Assign(Source: TPersistent); override;
  published
    property Caption;
    property Value: TcxEditValue read FValue write SetValue stored IsValueStored;
    property Tag;
  end;

  { TcxRadioGroupItems }

  TcxRadioGroupItems = class(TcxButtonGroupItems)
  private
    function GetItem(Index: Integer): TcxRadioGroupItem;
    procedure SetItem(Index: Integer; Value: TcxRadioGroupItem);
  public
    function Add: TcxRadioGroupItem;
    property Items[Index: Integer]: TcxRadioGroupItem
      read GetItem write SetItem; default;
  end;

  { TcxCustomRadioGroupProperties }

  TcxCustomRadioGroupProperties = class(TcxCustomButtonGroupProperties)
  private
    FDefaultCaption: WideString;
    FDefaultValue: TcxEditValue;
    function GetItems: TcxRadioGroupItems;
    function IsDefaultCaptionStored: Boolean;
    function IsDefaultValueStored: Boolean;
    procedure SetDefaultValue(const Value: TcxEditValue);
    procedure SetItems(Value: TcxRadioGroupItems);
  protected
    function CreateItems: TcxButtonGroupItems; override;
    function GetColumnCount: Integer; override;
    class function GetViewDataClass: TcxCustomEditViewDataClass; override;
    function HasDisplayValue: Boolean; override;
  public
    constructor Create(AOwner: TPersistent); override;
    procedure Assign(Source: TPersistent); override;
    function CanCompareEditValue: Boolean; override;
    function CompareDisplayValues(
      const AEditValue1, AEditValue2: TcxEditValue): Boolean; override;
    class function GetContainerClass: TcxContainerClass; override;
    function GetDisplayText(const AEditValue: TcxEditValue;
      AFullText: Boolean = False; AIsInplace: Boolean = True): WideString; override;
    function GetRadioGroupItemIndex(const AEditValue: TcxEditValue): Integer;
    function GetSupportedOperations: TcxEditSupportedOperations; override;
    class function GetViewInfoClass: TcxContainerViewInfoClass; override;
    function IsResetEditClass: Boolean; override;
    procedure PrepareDisplayValue(const AEditValue: TcxEditValue;
      var DisplayValue: TcxEditValue; AEditFocused: Boolean); override;
    // !!!
    property DefaultCaption: WideString read FDefaultCaption
      write FDefaultCaption stored IsDefaultCaptionStored;
    property DefaultValue: TcxEditValue read FDefaultValue write SetDefaultValue
      stored IsDefaultValueStored;
    property Items: TcxRadioGroupItems read GetItems write SetItems;
  end;

  { TcxRadioGroupProperties }

  TcxRadioGroupProperties = class(TcxCustomRadioGroupProperties)
  published
    property AssignedValues;
    property ClearKey;
    property Columns;
    property DefaultCaption;
    property DefaultValue;
    property ImmediatePost;
    property Items;
    property ReadOnly;
    property WordWrap;
    property OnChange;
    property OnEditValueChanged;
  end;

  { TcxCustomRadioGroupButton }

  TcxCustomRadioGroupButton = class(TcxRadioButton, IUnknown,
    IcxContainerInnerControl)
  private
    FFocusingByMouse: Boolean;
    FInternalSettingChecked: Boolean;
    FIsClickLocked: Boolean;
    function GetRadioGroup: TcxCustomRadioGroup;
    procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
    procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
    procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
    procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
  protected
    procedure Click; override;
    procedure CorrectTextRect(var R: TRect; ANativeStyle: Boolean); override;
    procedure DoEnter; override;
    procedure DoExit; override;
    procedure DrawBackground; override;
    function IsInplace: Boolean; override;
    function IsNativeBackground: Boolean; override;
    function IsNativeStyle: Boolean; override;
    function IsTransparent: Boolean; override;
    function IsTransparentBackground: Boolean; override;
    procedure KeyPress(var Key: Char); override;
    procedure Paint(ADrawOnlyFocusedState: Boolean); override;
    procedure SetChecked(Value: Boolean); override;
    procedure WndProc(var Message: TMessage); override;

    // IcxContainerInnerControl
    function GetControl: TWinControl;
    function GetControlContainer: TcxContainer;

    procedure InternalSetChecked(AValue: Boolean);

    property RadioGroup: TcxCustomRadioGroup read GetRadioGroup;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function ExecuteAction(Action: TBasicAction): Boolean; override;
    function UpdateAction(Action: TBasicAction): Boolean; override;
{$IFDEF DELPHI5}
    function CanFocus: Boolean; override;
{$ENDIF}
    procedure DefaultHandler(var Message); override;
  end;

  TcxCustomRadioGroupButtonClass = class of TcxCustomRadioGroupButton;

  { TcxCustomRadioGroup }

  TcxCustomRadioGroup = class(TcxCustomButtonGroup)
  private
    FLoadedItemIndex: Integer;
    FSkinsPaintCopy: Boolean;
    function GetCheckedIndex: Integer;
    function GetButton(Index: Integer): TcxCustomRadioGroupButton;
    function GetProperties: TcxCustomRadioGroupProperties;
    function GetActiveProperties: TcxCustomRadioGroupProperties;
    function GetItemIndex: Integer;
    function GetViewInfo: TcxCustomRadioGroupViewInfo;
    procedure SetItemIndex(Value: Integer);
    procedure SetProperties(Value: TcxCustomRadioGroupProperties);
    procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
    procedure CMCtl3DChanged(var Message: TMessage); message CM_CTL3DCHANGED;
  protected
    procedure CursorChanged; override;
    function GetButtonDC(AButtonIndex: Integer): THandle; override;
    procedure Initialize; override;
    procedure InternalSetEditValue(const Value: TcxEditValue;
      AValidateEditValue: Boolean); override;
    function IsContainerFocused: Boolean; override;
    function IsDBEditPaintCopyDrawing: Boolean; override;
    function IsInternalControl(AControl: TControl): Boolean; override;
    procedure SetDragMode(Value: TDragMode); override;
    procedure SetInternalValues(const AEditValue: TcxEditValue;
      AValidateEditValue, AFromButtonChecked: Boolean);
    procedure SynchronizeButtonsStyle; override;
    procedure ParentBackgroundChanged; override;
    procedure Resize; override;
    procedure SetDragKind(Value: TDragKind); override;
    procedure ArrangeButtons; override;
    function GetButtonInstance: TWinControl; override;
    procedure UpdateButtons; override;

    procedure AfterLoading;
    function IsLoading: Boolean;
    procedure Loaded; override;
    procedure Updated; override;

    procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;

    procedure ButtonChecked(AButton: TcxCustomRadioGroupButton);

    property ViewInfo: TcxCustomRadioGroupViewInfo read GetViewInfo;
    property SkinsPaintCopy: Boolean read FSkinsPaintCopy write FSkinsPaintCopy;
  public
    procedure Activate(var AEditData: TcxCustomEditData); override;
    procedure Clear; override;
    procedure FlipChildren(AllLevels: Boolean); override;
    class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
    procedure GetTabOrderList(List: TList); override;
    procedure PrepareEditValue(const ADisplayValue: TcxEditValue;
      out EditValue: TcxEditValue; AEditFocused: Boolean); override;
    procedure SetFocus; override; 
    property ActiveProperties: TcxCustomRadioGroupProperties read GetActiveProperties;
    property Buttons[Index: Integer]: TcxCustomRadioGroupButton read GetButton;
    property ItemIndex: Integer read GetItemIndex write SetItemIndex default -1;
    property Properties: TcxCustomRadioGroupProperties read GetProperties
      write SetProperties;
    property Transparent;
  end;

  { TcxRadioGroup }

  TcxRadioGroup = class(TcxCustomRadioGroup)
  private
    function GetActiveProperties: TcxRadioGroupProperties;
    function GetProperties: TcxRadioGroupProperties;
    procedure SetProperties(Value: TcxRadioGroupProperties);
  public
    class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
    property ActiveProperties: TcxRadioGroupProperties read GetActiveProperties;
  published
    property Align;
    property Alignment;
    property Anchors;
    property BiDiMode;
    property Caption;
    property Constraints;
    property Ctl3D;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property ParentBackground;
    property ParentBiDiMode;

⌨️ 快捷键说明

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