cxsplitter.pas

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

PAS
1,764
字号

{********************************************************************}
{                                                                    }
{       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 cxSplitter;

{$I cxVer.inc}

interface

uses
  Windows, Classes, Controls, Forms, Graphics, Messages, SysUtils, cxClasses,
  cxControls, cxExtEditConsts, cxExtEditUtils, cxGraphics, cxLookAndFeels;

type
  TcxPositionAfterOpen = 2..High(Integer);
  TcxSplitterAlign = (salBottom, salLeft, salRight, salTop);
  TcxSplitterDragState = (sstNormal, sstResizing, sstHotZoneClick);
  TcxSplitterMouseState = (smsClicked, smsInHotZone);
  TcxSplitterMouseStates = set of TcxSplitterMouseState;
  TcxSplitterState = (ssOpened, ssClosed);
  TcxSplitterDirection = (cxsdLeftToRight, cxsdRightToLeft, cxsdTopToBottom, cxsdBottomToTop);
  TCanResizeEvent = procedure(Sender: TObject; var NewSize: Integer; var Accept: Boolean) of object;
  TBeforeOpenHotZoneEvent = procedure(Sender: TObject;
    var NewSize: Integer; var AllowOpen: Boolean) of object;
  TBeforeCloseHotZoneEvent = procedure(Sender: TObject; var AllowClose: Boolean) of object;

type
  TcxCustomSplitter = class;

  { TcxHotZoneStyle }

  TcxHotZoneStyle = class(TPersistent)
  private
    FOwner: TcxCustomSplitter;
    FSizePercent: TcxNaturalNumber;
    FVisible: Boolean;
    FHotZoneRect: TRect;
    procedure SetSizePercent(Value: TcxNaturalNumber);
    procedure SetVisible(Value: Boolean);
  protected
    procedure Changed; virtual;
    function SplitterDirection: TcxSplitterDirection; virtual;
    function CalculateHotZoneRect(const ABounds: TRect): TRect; virtual;
    function GetMinSize: TcxNaturalNumber; virtual;
    function GetMaxSize: TcxNaturalNumber; virtual;
    function DrawHotZone(ACanvas: TcxCanvas; const ARect: TRect;
      const AHighlighted, AClicked: Boolean): TRect; virtual;
    procedure DrawBackground(ACanvas: TcxCanvas; const ARect: TRect;
      const AHighlighted, AClicked: Boolean); virtual;
  public
    constructor Create(AOwner: TcxCustomSplitter); virtual;
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); override;
    property SizePercent: TcxNaturalNumber read FSizePercent write SetSizePercent default 30;
    property Visible: Boolean read FVisible write SetVisible default True;
    property HotZoneRect: TRect read FHotZoneRect write FHotZoneRect;
    property Owner: TcxCustomSplitter read FOwner;
  end;

  TcxHotZoneStyleClass = class of TcxHotZoneStyle;

  { TcxMediaPlayer9Style }
  TcxMediaPlayer9Style = class(TcxHotZoneStyle)
  private
    FArrowRect: TRect;
    FArrowColor: TColor;
    FArrowHighlightColor: TColor;
    FLightColor: TColor;
    FBorderColor: TColor;
    FShadowStartColor: TColor;
    FShadowHighlightStartColor: TColor;
    procedure SetArrowColor(Value: TColor);
    procedure SetArrowHighlightColor(Value: TColor);
    procedure SetLightColor(Value: TColor);
    procedure SetBorderColor(Value: TColor);
    procedure SetShadowStartColor(Value: TColor);
    procedure SetShadowHighlightStartColor(Value: TColor);
  protected
    function DrawHotZone(ACanvas: TcxCanvas; const ARect: TRect;
      const AHighlighted, AClicked: Boolean): TRect; override;
    procedure DrawBackground(ACanvas: TcxCanvas; const ARect: TRect;
      const AHighlighted, AClicked: Boolean); override;
    function CalculateHotZoneRect(const ABounds: TRect): TRect; override;
  public
    constructor Create(AOwner: TcxCustomSplitter); override;
    procedure Assign(Source: TPersistent); override;
  published
    property SizePercent;
    property Visible;
    property ArrowColor: TColor read FArrowColor write SetArrowColor default clWindowText;
    property ArrowHighlightColor: TColor read FArrowHighlightColor write SetArrowHighlightColor default clBlue;
    property LightColor: TColor read FLightColor write SetLightColor default clWindow;
    property BorderColor: TColor read FBorderColor write SetBorderColor default clBtnShadow;
    property ShadowStartColor: TColor read FShadowStartColor write SetShadowStartColor default $00F5E6CD;
    property ShadowHighlightStartColor: TColor read FShadowHighlightStartColor
      write SetShadowHighlightStartColor default $00AFF5C3;
  end;

  { TcxMediaPlayer8Style }
  TcxMediaPlayer8Style = class(TcxHotZoneStyle)
  private
    FLTPointsRect: TRect;
    FRBPointsRect: TRect;
    FArrowRect: TRect;
    FArrowColor: TColor;
    FArrowHighlightColor: TColor;
    FLightColor: TColor;
    FShadowColor: TColor;
    procedure SetArrowColor(Value: TColor);
    procedure SetArrowHighlightColor(Value: TColor);
    procedure SetLightColor(Value: TColor);
    procedure SetShadowColor(Value: TColor);
    procedure DrawArrowRect(ACanvas: TcxCanvas; const ARect: TRect;
      const AHighlighted, AClicked: Boolean);
  protected
    function DrawHotZone(ACanvas: TcxCanvas; const ARect: TRect;
      const AHighlighted, AClicked: Boolean): TRect; override;
    procedure DrawBackground(ACanvas: TcxCanvas; const ARect: TRect;
      const AHighlighted, AClicked: Boolean); override;
    function CalculateHotZoneRect(const ABounds: TRect): TRect; override;
  public
    constructor Create(AOwner: TcxCustomSplitter); override;
    procedure Assign(Source : TPersistent); override;
  published
    property SizePercent;
    property Visible;
    property ArrowColor: TColor read FArrowColor write SetArrowColor default clWindowText;
    property ArrowHighlightColor: TColor read FArrowHighlightColor write SetArrowHighlightColor default clWindow;
    property LightColor: TColor read FLightColor write SetLightColor default clWindow;
    property ShadowColor: TColor read FShadowColor write SetShadowColor default clBtnShadow;
  end;

  { TcxXPTaskBarStyle }
  TcxXPTaskBarStyle = class(TcxHotZoneStyle)
  private
    FLightColor: TColor;
    FShadowColor: TColor;
    FLTPointsRect: TRect;
    FRBPointsRect: TRect;
    procedure SetLightColor(Value: TColor);
    procedure SetShadowColor(Value: TColor);
  protected
    function DrawHotZone(ACanvas: TcxCanvas; const ARect: TRect;
      const AHighlighted, AClicked: Boolean): TRect; override;
    procedure DrawBackground(ACanvas: TcxCanvas; const ARect: TRect;
      const AHighlighted, AClicked: Boolean); override;
    function CalculateHotZoneRect(const ABounds: TRect): TRect; override;
  public
    constructor Create(AOwner: TcxCustomSplitter); override;
    procedure Assign(Source : TPersistent); override;
  published
    property SizePercent;
    property Visible;
    property LightColor: TColor read FLightColor write SetLightColor default clWindow;
    property ShadowColor: TColor read FShadowColor write SetShadowColor default clBtnShadow;
  end;

  { TcxSimpleStyle }
  TcxSimpleStyle = class(TcxHotZoneStyle)
  private
    FArrowColor: TColor;
    FArrowHighlightColor: TColor;
    FLightColor: TColor;
    FShadowColor: TColor;
    FDotsColor: TColor;
    FDotsShadowColor: TColor;
    FLTArrowRect: TRect;
    FRBArrowRect: TRect;
    procedure SetArrowColor(Value: TColor);
    procedure SetArrowHighlightColor(Value: TColor);
    procedure SetLightColor(Value: TColor);
    procedure SetShadowColor(Value: TColor);
    procedure SetDotsColor(Value: TColor);
    procedure SetDotsShadowColor(Value: TColor);
  protected
    function DrawHotZone(ACanvas: TcxCanvas; const ARect: TRect;
      const AHighlighted, AClicked: Boolean): TRect; override;
    procedure DrawBackground(ACanvas: TcxCanvas; const ARect: TRect;
      const AHighlighted, AClicked: Boolean); override;
    function CalculateHotZoneRect(const ABounds: TRect): TRect; override;
  public
    constructor Create(AOwner: TcxCustomSplitter); override;
    procedure Assign(Source : TPersistent); override;
  published
    property SizePercent;
    property Visible;
    property ArrowColor: TColor read FArrowColor write SetArrowColor default clWindowText;
    property ArrowHighlightColor: TColor read FArrowHighlightColor write SetArrowHighlightColor default clWindow;
    property LightColor: TColor read FLightColor write SetLightColor default clWindow;
    property ShadowColor: TColor read FShadowColor write SetShadowColor default clBtnShadow;
    property DotsColor: TColor read FDotsColor write SetDotsColor default clHighlight;
    property DotsShadowColor: TColor read FDotsShadowColor write SetDotsShadowColor default clWindow;
  end;

  {TdxSplitterDragImage}

  TdxSplitterDragImage = class(TcxCustomDragImage)
  protected
    procedure Paint; override;
  end;

  { TcxCustomSplitter }

  TcxCustomSplitter = class(TcxControl)
  private
    FActiveControl: TWinControl;
    FAlignSplitter: TcxSplitterAlign;
    FAllowHotZoneDrag: Boolean;
    FAutoPosition: Boolean;
    FAutoSnap: Boolean;
    FBrush: TBrush;
    FControl: TControl;
    FDragImage: TdxSplitterDragImage;
    FDragThreshold: TcxNaturalNumber;
    FDrawCanvas: TcxCanvas;
    FHotZone: TcxHotZoneStyle;
    FHotZoneClickPoint: TPoint;
    FHotZoneEvents: TNotifyEvent;
    FHotZoneStyleClass: TcxHotZoneStyleClass;
    FInvertDirection: Boolean;
    FLastPatternDrawPosition: Integer;
    FMaxSize: Word;
    FMinSize: TcxNaturalNumber;
    FMouseStates: TcxSplitterMouseStates;
    FNativeBackground: Boolean;
    FNewSize: Integer;
    FOldSize: Integer;
    FOnAfterClose: TNotifyEvent;
    FOnAfterOpen: TNotifyEvent;
    FOnBeforeClose: TBeforeCloseHotZoneEvent;
    FOnBeforeOpen: TBeforeOpenHotZoneEvent;
    FOnCanResize: TCanResizeEvent;
    FOnMoved: TNotifyEvent;
    FPositionAfterOpen: TcxPositionAfterOpen;
    FPrevKeyDown: TKeyEvent;
    FResizeIgnoreSnap: Boolean; //deprecated
    FResizeUpdate: Boolean;
    FSavedParentShowHint: Boolean;
    FSavedShowHint: Boolean;
    FSplit: Integer;
    FSplitterClickPoint: TPoint;
    FSplitterState: TcxSplitterDragState;
    FState: TcxSplitterState;
    procedure CalcSplitSize(X, Y: Integer; var NewSize, Split: Integer;
      ACorrectWithMaxMin: Boolean = True);
    procedure ControlResizing(X, Y: Integer);
    function FindControl: TControl;
    procedure FocusKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    function GetMaxControlSize: Integer;
    function IsAllControlHotZoneStyle: Boolean;
    procedure UpdateControlSize;
    procedure UpdateSize(X, Y: Integer);

    function GetDragImageTopLeft: TPoint;
    procedure InitDragImage;
    procedure MoveDragImage;
    procedure ReleaseDragImage;

    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
    procedure SetAlignSplitter(Value: TcxSplitterAlign);
    procedure SetSplitterState(Value: TcxSplitterState);
    procedure SetAllowHotZoneDrag(Value: Boolean);
    procedure SetInvertDirection(Value: Boolean);
    procedure SetHotZone(Value: TcxHotZoneStyle);
    procedure SetNativeBackground(Value: Boolean);
    procedure SetDefaultStates;
    procedure RecalcLastPosition;
    procedure NormalizeSplitterSize;
    procedure SetHotZoneStyleClass(const Value: TcxHotZoneStyleClass);
    function GetHotZoneClassName: string;
    procedure SetHotZoneClassName(Value: string);
    procedure InitResize(X, Y: Integer);
    procedure WMCancelMode(var Message: TWMCancelMode); message WM_CANCELMODE;
    procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR;
  protected
    { Protected declarations }
    FDrawBitmap: TBitmap;
    FPositionBeforeClose: Integer;
    function CanFocusOnClick: Boolean; override;
    function CanResize(var NewSize: Integer): Boolean; reintroduce; virtual;
    function DoCanResize(var NewSize: Integer): Boolean; virtual;
    procedure LookAndFeelChanged(Sender: TcxLookAndFeel;
      AChangedValues: TcxLookAndFeelValues); 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 HotZoneStyleChanged; virtual;
    procedure DrawHotZone; virtual;
    procedure Paint; override;
    procedure StopSizing; virtual;
    function GetSplitterMinSize: TcxNaturalNumber; virtual;
    function GetSplitterMaxSize: TcxNaturalNumber; virtual;
    procedure CreateHotZone; virtual;
    procedure DestroyHotZone; virtual;
    procedure DoEventBeforeOpen(var ANewSize: Integer;
      var AllowOpenHotZone: Boolean); virtual;
    procedure DoEventAfterOpen; virtual;
    procedure DoEventBeforeClose(var AllowCloseHotZone: Boolean); virtual;
    procedure DoEventAfterClose; virtual;
    procedure DoEventMoved; virtual;
    function InternalGetMinSize: Integer;
    procedure Notification(ACOmponent: TComponent; Operation: TOperation); override;
    procedure Loaded; override;
    function CalculateSplitterDirection: TcxSplitterDirection; virtual;
    procedure UpdateMouseStates(X, Y: Integer); virtual;
    property AlignSplitter: TcxSplitterAlign read FAlignSplitter
      write SetAlignSplitter default salLeft;
    property AutoPosition: Boolean read FAutoPosition write FAutoPosition default True;
    property AutoSnap: Boolean read FAutoSnap write FAutoSnap default False;
    property AllowHotZoneDrag: Boolean read FAllowHotZoneDrag write SetAllowHotZoneDrag default True;
    property DragThreshold: TcxNaturalNumber read FDragThreshold write FDragThreshold default 3;
    property InvertDirection: Boolean read FInvertDirection
      write SetInvertDirection default False;
    property MinSize: TcxNaturalNumber read FMinSize write FMinSize default 30;
    property PositionAfterOpen: TcxPositionAfterOpen read FPositionAfterOpen
      write FPositionAfterOpen default 30;
    property ResizeUpdate: Boolean read FResizeUpdate
      write FResizeUpdate default False;
    property ResizeIgnoreSnap: Boolean read FResizeIgnoreSnap
      write FResizeIgnoreSnap stored False; //deprecated
    property Control: TControl read FControl write FControl;

⌨️ 快捷键说明

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