⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gmpagenavigator.pas

📁 GmPrintSuite 2.96.7] a
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{******************************************************************************}
{                                                                              }
{                             GmPageNavigator.pas                              }
{                                                                              }
{           Copyright (c) 2003 Graham Murt  - www.MurtSoft.co.uk               }
{                                                                              }
{   Feel free to e-mail me with any comments, suggestions, bugs or help at:    }
{                                                                              }
{                           graham@murtsoft.co.uk                              }
{                                                                              }
{******************************************************************************}

unit GmPageNavigator;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, Buttons, GmPreview, GmClasses, GmConst, GmTypes;

{$I GMPS.INC}

type
  TGmButtonGroup = (gmNavigateGroup, gmEditGroup, gmZoomGroup, gmFitPageGroup, gmUnknownGroup);

  TGmNavigateBtn = (gmFirstPage, gmPrevPage, gmNextPage, gmLastPage,
    gmAddPage, gmDeletePage, gmClear, gmZoomIn, gmZoomOut, gmActualSize,
    gmFitWidth, gmFitHeight, gmFitWholePage);

  TGmNavButtonSet = set of TGmNavigateBtn;

const
  DEFAULT_HINTS: array[TGmNavigateBtn] of string = ('首页',
                                                    '前一页',
                                                    '下一页',
                                                    '末页',
                                                    '增加页码',
                                                    '删除当前页',
                                                    '清除所有页面',
                                                    '放大',
                                                    '缩小',
                                                    '实际大小',
                                                    '适合页宽',
                                                    '适合页高',
                                                    '满页显示');
type
  TGmGetNavButtonHint     = procedure(Sender: TObject; Button: TGmNavigateBtn; var Hint: string) of object;
  TGmClickNavButtonEvent  = procedure(Sender: TObject; Button: TGmNavigateBtn) of object;

  TGmPageNavigator = class;

  TGmNavButton = class(TSpeedButton)
  private
    FButtonKind: TGmNavigateBtn;
    FPageNavigator: TGmPageNavigator;
    procedure SetButtonKind(Value: TGmNavigateBtn);
  protected
    property ButtonKind: TGmNavigateBtn read FButtonKind write SetButtonKind;
  public
    constructor Create(AOwner: TComponent); override;
  end;

  // *** TGmPageNavigator ***

  TGmPageNavigator = class(TGmWinControl)
  private
    FAutoSize: Boolean;
    FBorderWidth: integer;
    FBtnHeight: integer;
    FBtnWidth: integer;
    FFlat: Boolean;
    FGroupButtons: Boolean;
    FGroupSpacing: integer;
    FPreview: TGmPreview;
    FShowButtonHints: Boolean;
    FVisibleButtons: TGmNavButtonSet;
    // events...
    FOnClickNavButton: TGmClickNavButtonEvent;
    FOnGetButtonHint: TGmGetNavButtonHint;
    function BevelWidth: integer;
    function GetTotalWidth: integer;
    {$IFDEF DELPHI3}
    procedure AdjustSize;
    {$ENDIF}
    procedure FreeButtons;
    procedure RedrawButtons;
    procedure SetBorderWidth(Value: integer);
    procedure SetBtnHeight(AHeight: integer);
    procedure SetBtnWidth(AWidth: integer);
    procedure SetFlat(AValue: Boolean);
    procedure SetGroupButtons(Value: Boolean);
    procedure SetGroupSpacing(Value: integer);
    procedure SetPreview(APreview: TGmPreview);
    procedure SetShowButtonHints(Value: Boolean);
    procedure SetVisibleButtons(AButtons: TGmNavButtonSet);
    procedure UpdateButtonStates;
  protected
    procedure ButtonClicked(Sender: TObject);
    procedure BeginUpdate(var Message: TMessage); message GM_BEGINUPDATE;
    procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED;
    procedure EndUpdate(var Message: TMessage); message GM_ENDUPDATE;
    procedure Loaded; override;
    procedure NumPagesChanged(var Message: TMessage); message GM_PAGE_COUNT_CHANGED;
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
    procedure PageChanged(var Message: TMessage); message GM_PAGE_NUM_CHANGED;
    procedure PreviewUpdated(var Message: TMessage); message GM_PREVIEW_UPDATED;
    procedure PreviewZoomChanged(var Message: TMessage); message GM_PREVIEW_ZOOM_CHANGED;
    procedure NavigatorResize(var Message: TMessage); message WM_SIZE;
    procedure SetAutoSize(Value: Boolean); {$IFDEF D6+} override; {$ENDIF}
    procedure SetCaption(var Message: TMessage); message WM_SETTEXT;
  public
    Buttons: array[TGmNavigateBtn] of TGmNavButton;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property AutoSize: Boolean read FAutoSize write SetAutoSize default False;
    property BorderWidth: integer read FBorderWidth write SetBorderWidth default 8;
    property ButtonHeight: integer read FBtnHeight write SetBtnHeight default 34;
    property ButtonWidth: integer read FBtnWidth write SetBtnWidth default 34;
    property Flat: Boolean read FFlat write SetFlat default False;
    property GroupButtons: Boolean read FGroupButtons write SetGroupButtons default True;
    property GroupSpacing: integer read FGroupSpacing write SetGroupSpacing default 8;
    property Preview: TGmPreview read FPreview write SetPreview;
    property ShowButtonHints: Boolean read FShowButtonHints write SetShowButtonHints default True;
    property VisibleButtons: TGmNavButtonSet read FVisibleButtons write SetVisibleButtons
      default [gmFirstPage, gmPrevPage, gmNextPage, gmLastPage,
               gmAddPage, gmDeletePage, gmClear, gmZoomIn, gmZoomOut, gmActualSize,
               gmFitWidth, gmFitHeight, gmFitWholePage];
    // events...
    property OnClickButton: TGmClickNavButtonEvent read FOnClickNavButton write FOnClickNavButton;
    property OnGetButtonHint: TGmGetNavButtonHint read FOnGetButtonHint write FOnGetButtonHint;
  end;


implementation

{$R PageNavRes.RES}

function ButtonGroup(AButton: TGmNavigateBtn): TGmButtonGroup;
begin
  case AButton of
    gmFirstPage,
    gmPrevPage,
    gmNextPage,
    gmLastPage    : Result := gmNavigateGroup;
    gmAddPage,
    gmDeletePage,
    gmClear       : Result := gmEditGroup;
    gmZoomIn,
    gmZoomOut,
    gmActualSize  : Result := gmZoomGroup;
    gmFitWidth,
    gmFitHeight,
    gmFitWholePage: Result := gmFitPageGroup;
  else
    Result := gmUnknownGroup;
  end;
end;

constructor TGmNavButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := ControlStyle + [csDesignInteractive];
  FPageNavigator := TGmPageNavigator(AOwner);
end;

procedure TGmNavButton.SetButtonKind(Value: TGmNavigateBtn);
begin
  FButtonKind := Value;
  case Value of
    gmFirstPage   : Glyph.LoadFromResourceName(HInstance, 'FIRST');
    gmPrevPage    : Glyph.LoadFromResourceName(HInstance, 'PREV');
    gmNextPage    : Glyph.LoadFromResourceName(HInstance, 'NEXT');
    gmLastPage    : Glyph.LoadFromResourceName(HInstance, 'LAST');
    gmZoomIn      : Glyph.LoadFromResourceName(HInstance, 'ZOOMIN');
    gmZoomOut     : Glyph.LoadFromResourceName(HInstance, 'ZOOMOUT');
    gmActualSize  : Glyph.LoadFromResourceName(HInstance, 'ACTUALSIZE');
    gmAddPage     : Glyph.LoadFromResourceName(HInstance, 'ADDPAGE');
    gmDeletePage  : Glyph.LoadFromResourceName(HInstance, 'DELETEPAGE');
    gmClear       : Glyph.LoadFromResourceName(HInstance, 'CLEAR');
    gmFitWidth    : Glyph.LoadFromResourceName(HInstance, 'FITWIDTH');
    gmFitHeight   : Glyph.LoadFromResourceName(HInstance, 'FITHEIGHT');
    gmFitWholePage: Glyph.LoadFromResourceName(HInstance, 'FITWHOLEPAGE');
  end;
end;

//------------------------------------------------------------------------------

constructor TGmPageNavigator.Create(AOwner: TComponent);
var
  ICount: TGmNavigateBtn;
begin
  inherited Create(AOwner);
  for ICount := Low(Buttons) to High(Buttons) do
  begin
    Buttons[ICount] := TGmNavButton.Create(Self);
    Buttons[ICount].ButtonKind := ICount;
    Buttons[ICount].OnClick := ButtonClicked;
    Buttons[ICount].Hint := DEFAULT_HINTS[ICount];
    Buttons[ICount].ShowHint := True;
    Buttons[ICount].PopupMenu := PopupMenu;
  end;
  {$IFDEF D4+}
  BevelInner := bvNone;
  BevelOuter := bvNone;
  {$ENDIF}
  BorderWidth := 6;
  Caption := '';
  FAutoSize := False;
  FBtnHeight := 34;
  FBtnWidth := 34;
  FFlat := False;
  FGroupButtons := True;
  FGroupSpacing := 8;
  FShowButtonHints := True;
  FVisibleButtons := [gmFirstPage, gmPrevPage, gmNextPage, gmLastPage,
                      gmAddPage, gmDeletePage, gmClear, gmZoomIn, gmZoomOut, gmActualSize,
                      gmFitWidth, gmFitHeight, gmFitWholePage];
  Width := GetTotalWidth+18;
  Height := FBtnHeight+16;
  UpdateButtonStates; 
end;

destructor TGmPageNavigator.Destroy;
begin
  if Assigned(FPreview) then FPreview.RemoveAssociatedComponent(Self);
  FreeButtons;
  inherited Destroy;
end;

procedure TGmPageNavigator.FreeButtons;
var
  ICount: TGmNavigateBtn;
begin
  for ICount := Low(Buttons) to High(Buttons) do
    Buttons[ICount].Free;
end;

function TGmPageNavigator.BevelWidth: integer;
begin
  if BorderStyle = bsSingle then Result := 4 else Result := 0;
  Inc(Result, 2*BorderWidth);
end;

function TGmPageNavigator.GetTotalWidth: integer;
var
  ICount: TGmNavigateBtn;
  LastGroup: TGmButtonGroup;
begin
  Result := 0;
  LastGroup := gmUnknownGroup;
  for ICount := Low(Buttons) to High(Buttons) do
  begin
    if (ICount in FVisibleButtons) then
    begin
      if LastGroup = gmUnknownGroup then LastGroup := ButtonGroup(ICount);
      Inc(Result, FBtnWidth);
      if (LastGroup <> ButtonGroup(ICount)) and (FGroupButtons) then
        Inc(Result, FGroupSpacing);
      LastGroup := ButtonGroup(ICount);

⌨️ 快捷键说明

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