cxtrackbar.pas

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

PAS
1,699
字号
  private
    FSlideState: TcxTrackBarSlideState;
    FStartSelectionPosition: Integer;
    function GetStyle: TcxTrackBarStyle;
    procedure SetStyle(Value: TcxTrackBarStyle);
    procedure SetNewSelectionPosition(const ANewPosition: Integer);
    function GetPosition: Integer;
    procedure SetPosition(Value: Integer);
    function GetProperties: TcxCustomTrackBarProperties;
    function GetActiveProperties: TcxCustomTrackBarProperties;
    procedure GetOnGetThumbRect(out AValue: TcxGetThumbRectEvent);
    function GetViewInfo: TcxCustomTrackBarViewInfo;
    procedure SetProperties(Value: TcxCustomTrackBarProperties);
    procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
    procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
  protected
    function DefaultParentColor: Boolean; override;
    procedure FillSizeProperties(var AEditSizeProperties: TcxEditSizeProperties); override;
    procedure Initialize; override;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure KeyUp(var Key: Word; Shift: TShiftState); override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseEnter(AControl: TControl); override;
    procedure MouseLeave(AControl: TControl); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure SynchronizeDisplayValue; override;
    function WantNavigationKeys: Boolean; override;
    procedure InternalSetPosition(Value: Integer);
    property ViewInfo: TcxCustomTrackBarViewInfo read GetViewInfo;
  public
    class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
    property ActiveProperties: TcxCustomTrackBarProperties
      read GetActiveProperties;
    property Position: Integer read GetPosition write SetPosition default 0;
    property Properties: TcxCustomTrackBarProperties read GetProperties
      write SetProperties;
    property Style: TcxTrackBarStyle read GetStyle write SetStyle;
    property Transparent;
  end;

  { TcxCustomTrackBar }
  
  TcxTrackBar = class(TcxCustomTrackBar)
  private
    function GetActiveProperties: TcxTrackBarProperties;
    function GetProperties: TcxTrackBarProperties;
    procedure SetProperties(Value: TcxTrackBarProperties);
  public
    class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
    property ActiveProperties: TcxTrackBarProperties read GetActiveProperties;
  published
    property Align;
    property Anchors;
    property Constraints;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property Position;
    property Properties: TcxTrackBarProperties read GetProperties
      write SetProperties;
    property ShowHint;
    property Style;
    property StyleDisabled;
    property StyleFocused;
    property StyleHot;
    property TabOrder;
    property TabStop;
    property Transparent;
    property Visible;
    property OnContextPopup;
    property OnDragDrop;
    property OnDragOver;
    property OnEditing;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseEnter;
    property OnMouseLeave;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
  end;

implementation

uses
  cxEditConsts, cxEditPaintUtils, cxEditUtils, cxExtEditUtils, cxSpinEdit,
  dxThemeConsts, dxThemeManager, dxUxTheme;

const
  BetweenTrackAndTick = 1;
  FromBorderIndent = 7;

type
  { TcxFilterTrackBarHelper }

  TcxFilterTrackBarHelper = class(TcxFilterSpinEditHelper)
  public
    class procedure InitializeProperties(AProperties,
      AEditProperties: TcxCustomEditProperties; AHasButtons: Boolean); override;
  end;

procedure CalculateCustomTrackBarViewInfo(ACanvas: TcxCanvas; AViewData: TcxCustomTrackBarViewData;
  AViewInfo: TcxCustomTrackBarViewInfo);

  procedure CheckFocusRectBounds;
  begin
    with AViewInfo do
    begin
      if FocusRect.Left < TextRect.Left - 1 then
        FocusRect.Left := TextRect.Left - 1;
      if FocusRect.Top < TextRect.Top - 1 then
        FocusRect.Top := TextRect.Top - 1;
      if FocusRect.Right > TextRect.Right + 1 then
        FocusRect.Right := TextRect.Right + 1;
      if FocusRect.Bottom > TextRect.Bottom + 1 then
        FocusRect.Bottom := TextRect.Bottom + 1;
    end;
  end;

begin
  with AViewInfo do
  begin
    BackgroundColor := AViewData.Style.Color;
    if not IsInplace and Focused then
      if Length(Text) = 0 then
        FocusRect := cxEmptyRect
      else
      begin
        FocusRect := TextRect;
        InflateRect(FocusRect, 1, 1);
        CheckFocusRectBounds;
      end;
  end;
end;

procedure DrawBottomRightThumb(ACanvas: TcxCanvas; const AThumbRect: TRect;
  const AOrientation: TcxTrackBarOrientation; const AThumbSize: Integer;
  const AKind: TcxLookAndFeelKind; const AThumbColor: TColor);
var
  FX, FY: Integer;
  FLightPolyLine: array[0..3] of TPoint;
  FShadowPolyLine: array[0..2] of TPoint;
  FDarkPolyLine: array[0..2] of TPoint;
  FPolygon: array[0..5] of TPoint;
begin
  if AOrientation = tboVertical then
  begin
    FX := AThumbRect.Right - (AThumbSize div 2);

    FLightPolyLine[0] := Point(AThumbRect.Left, AThumbRect.Bottom);
    FLightPolyLine[1] := Point(AThumbRect.Left, AThumbRect.Top);
    FLightPolyLine[2] := Point(FX, AThumbRect.Top);
    FLightPolyLine[3] := Point(AThumbRect.Right, AThumbRect.Top + (AThumbSize div 2));

    FShadowPolyLine[0] := Point(AThumbRect.Left + 1, AThumbRect.Bottom);
    FShadowPolyLine[1] := Point(AThumbRect.Right - (AThumbSize div 2), AThumbRect.Bottom);
    FShadowPolyLine[2] := Point(AThumbRect.Right - 1, AThumbRect.Bottom - (AThumbSize div 2) + 1);

    FDarkPolyLine[0] := Point(AThumbRect.Left, AThumbRect.Bottom + 1);
    FDarkPolyLine[1] := Point(AThumbRect.Right - (AThumbSize div 2), AThumbRect.Bottom + 1);
    FDarkPolyLine[2] := Point(AThumbRect.Right, AThumbRect.Bottom - (AThumbSize div 2) + 1);

    FPolygon[0] := Point(AThumbRect.Left + 1, AThumbRect.Bottom);
    FPolygon[1] := Point(AThumbRect.Left + 1, AThumbRect.Top + 1);
    FPolygon[2] := Point(FX, AThumbRect.Top + 1);
    FPolygon[3] := Point(AThumbRect.Right - 1, AThumbRect.Top + (AThumbSize div 2));
    FPolygon[4] := Point(AThumbRect.Right - 1, AThumbRect.Top + (AThumbSize div 2) + 1);
    FPolygon[5] := Point(AThumbRect.Right - (AThumbSize div 2), AThumbRect.Bottom);
  end else
  begin
    FY := AThumbRect.Bottom - (AThumbSize div 2);

    FLightPolyLine[0] := Point(AThumbRect.Right, AThumbRect.Top);
    FLightPolyLine[1] := Point(AThumbRect.Left, AThumbRect.Top);
    FLightPolyLine[2] := Point(AThumbRect.Left, FY);
    FLightPolyLine[3] := Point(AThumbRect.Left + (AThumbSize div 2), AThumbRect.Bottom);

    FShadowPolyLine[0] := Point(AThumbRect.Left + (AThumbSize div 2), AThumbRect.Bottom - 1);
    FShadowPolyLine[1] := Point(AThumbRect.Right - 1, FY);
    FShadowPolyLine[2] := Point(AThumbRect.Right - 1, AThumbRect.Top + 1);

    FDarkPolyLine[0] := Point(AThumbRect.Left + (AThumbSize div 2), AThumbRect.Bottom);
    FDarkPolyLine[1] := Point(AThumbRect.Right, FY);
    FDarkPolyLine[2] := Point(AThumbRect.Right, AThumbRect.Top);

    FPolygon[0] := Point(AThumbRect.Right - 1, AThumbRect.Top + 1);
    FPolygon[1] := Point(AThumbRect.Left + 1, AThumbRect.Top + 1);
    FPolygon[2] := Point(AThumbRect.Left + 1, FY);
    FPolygon[3] := Point(AThumbRect.Left + (AThumbSize div 2) - 1, AThumbRect.Bottom - 1);
    FPolygon[4] := Point(AThumbRect.Left + (AThumbSize div 2), AThumbRect.Bottom - 1);
    FPolygon[5] := Point(AThumbRect.Right  - 1, FY);
  end;
  InternalPolyLine(ACanvas, FLightPolyLine, clWindow);
  InternalPolyLine(ACanvas, FShadowPolyLine, clBtnShadow);
  InternalPolyLine(ACanvas, FDarkPolyLine, clWindowText);
  ACanvas.Pen.Color := AThumbColor;
  ACanvas.Brush.Color := AThumbColor;
  ACanvas.Polygon(FPolygon);
  case AKind of
    lfStandard:
    begin
      InternalPolyLine(ACanvas, FLightPolyLine, clBtnHighlight);
      InternalPolyLine(ACanvas, FShadowPolyLine, clBtnShadow);
      InternalPolyLine(ACanvas, FDarkPolyLine, cl3DDkShadow);
    end;
    lfFlat:
    begin
      InternalPolyLine(ACanvas, FLightPolyLine, clBtnHighlight);
      InternalPolyLine(ACanvas, FDarkPolyLine, clBtnShadow);
    end;
    lfUltraFlat, lfOffice11:
    begin
      InternalPolyLine(ACanvas, FLightPolyLine, clWindowText);
      InternalPolyLine(ACanvas, FDarkPolyLine, clWindowText);
    end;
  end;
end;

procedure DrawTopLeftThumb(ACanvas: TcxCanvas; const AThumbRect: TRect;
  const AOrientation: TcxTrackBarOrientation; const AThumbSize: Integer;
  const AKind: TcxLookAndFeelKind; const AThumbColor: TColor);
var
  FX, FY: Integer;
  FLightPolyLine: array[0..2] of TPoint;
  FShadowPolyLine: array[0..3] of TPoint;
  FDarkPolyLine: array[0..3] of TPoint;
  FPolygon: array[0..5] of TPoint;
begin
  if AOrientation = tboVertical then
  begin
    FX := AThumbRect.Left + (AThumbSize div 2);

    FLightPolyLine[0] := Point(AThumbRect.Right, AThumbRect.Top);
    FLightPolyLine[1] := Point(FX, AThumbRect.Top);
    FLightPolyLine[2] := Point(AThumbRect.Left, AThumbRect.Top + (AThumbSize div 2));

    FShadowPolyLine[0] := Point(AThumbRect.Right - 1, AThumbRect.Top + 1);
    FShadowPolyLine[1] := Point(AThumbRect.Right - 1, AThumbRect.Bottom);
    FShadowPolyLine[2] := Point(AThumbRect.Left + (AThumbSize div 2), AThumbRect.Bottom);
    FShadowPolyLine[3] := Point(AThumbRect.Left + 1, AThumbRect.Bottom - (AThumbSize div 2) + 1);

    FDarkPolyLine[0] := Point(AThumbRect.Right, AThumbRect.Top);
    FDarkPolyLine[1] := Point(AThumbRect.Right, AThumbRect.Bottom + 1);
    FDarkPolyLine[2] := Point(AThumbRect.Left + (AThumbSize div 2), AThumbRect.Bottom + 1);
    FDarkPolyLine[3] := Point(AThumbRect.Left, AThumbRect.Bottom - (AThumbSize div 2) + 1);

    FPolygon[0] := Point(AThumbRect.Right - 2, AThumbRect.Bottom);
    FPolygon[1] := Point(AThumbRect.Right - 2, AThumbRect.Top + 1);
    FPolygon[2] := Point(FX, AThumbRect.Top + 1);
    FPolygon[3] := Point(AThumbRect.Left + 1, AThumbRect.Top + (AThumbSize div 2));
    FPolygon[4] := Point(AThumbRect.Left + 1, AThumbRect.Top + (AThumbSize div 2) + 1);
    FPolygon[5] := Point(AThumbRect.Left + (AThumbSize div 2), AThumbRect.Bottom);
  end else
  begin
    FY := AThumbRect.Top + (AThumbSize div 2);

    FLightPolyLine[0] := Point(AThumbRect.Left, AThumbRect.Bottom);
    FLightPolyLine[1] := Point(AThumbRect.Left, FY);
    FLightPolyLine[2] := Point(AThumbRect.Left + (AThumbSize div 2), AThumbRect.Top);

    FShadowPolyLine[0] := Point(AThumbRect.Left + (AThumbSize div 2), AThumbRect.Top + 1);
    FShadowPolyLine[1] := Point(AThumbRect.Right - 1, FY);
    FShadowPolyLine[2] := Point(AThumbRect.Right - 1, AThumbRect.Bottom - 1);
    FShadowPolyLine[3] := Point(AThumbRect.Left, AThumbRect.Bottom - 1);

    FDarkPolyLine[0] := Point(AThumbRect.Left + (AThumbSize div 2), AThumbRect.Top);
    FDarkPolyLine[1] := Point(AThumbRect.Right, FY);
    FDarkPolyLine[2] := Point(AThumbRect.Right, AThumbRect.Bottom);
    FDarkPolyLine[3] := Point(AThumbRect.Left, AThumbRect.Bottom);

    FPolygon[0] := Point(AThumbRect.Right - 1, AThumbRect.Bottom - 2);
    FPolygon[1] := Point(AThumbRect.Left + 1, AThumbRect.Bottom - 2);
    FPolygon[2] := Point(AThumbRect.Left + 1, FY);
    FPolygon[3] := Point(AThumbRect.Left + (AThumbSize div 2) - 1, AThumbRect.Top + 2);
    FPolygon[4] := Point(AThumbRect.Left + (AThumbSize div 2), AThumbRect.Top + 2);
    FPolygon[5] := Point(AThumbRect.Right  - 1, FY);
  end;
  ACanvas.Pen.Color := AThumbColor;
  ACanvas.Brush.Color := AThumbColor;
  ACanvas.Polygon(FPolygon);
  case AKind of
    lfStandard:
    begin
      InternalPolyLine(ACanvas, FLightPolyLine, clBtnHighlight);
      InternalPolyLine(ACanvas, FShadowPolyLine, clBtnShadow);
      InternalPolyLine(ACanvas, FDarkPolyLine, cl3DDkShadow);
    end;
    lfFlat:
    begin
      InternalPolyLine(ACanvas, FLightPolyLine, clBtnHighlight);
      InternalPolyLine(ACanvas, FDarkPolyLine, clBtnShadow);
    end;
    lfUltraFlat, lfOffice11:
    begin
      InternalPolyLine(ACanvas, FLightPolyLine, clWindowText);
      InternalPolyLine(ACanvas, FDarkPolyLine, clWindowText);
    end;
  end;
end;

{ TcxTrackBarStyle }

function TcxTrackBarStyle.DefaultBorderStyle: TcxContainerBorderStyle;
begin
  if IsBaseStyle then
    Result := cbsNone
  else
    Result := inherited DefaultBorderStyle;
end;

function TcxTrackBarStyle.DefaultHotTrack: Boolean;
begin
  Result := False;
end;

{ TcxCustomTrackBarViewInfo }

constructor TcxCustomTrackBarViewInfo.Create;
begin
  inherited Create;
  FLookAndFeel := TcxLookAndFeel.Create(nil);
  FTBBitmap := TBitmap.Create;
  FTBBitmap.PixelFormat := pfDevice;
  FTBCanvas := TcxCanvas.Create(FTBBitmap.Canvas);
  MouseStates := [];
end;

⌨️ 快捷键说明

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