📄 menus.pas
字号:
{*******************************************************}
{ }
{ Borland Delphi Visual Component Library }
{ }
{ Copyright (c) 1995-2002 Borland Software Corporation }
{ }
{*******************************************************}
unit Menus;
{$S-,W-,R-,T-,H+,X+}
{$C PRELOAD}
interface
{$IFDEF LINUX}
uses WinUtils, Windows, SysUtils, Classes, Contnrs, Messages, Graphics, ImgList, ActnList;
{$ENDIF}
{$IFDEF MSWINDOWS}
uses Windows, SysUtils, Classes, Contnrs, Messages, Graphics, ImgList, ActnList;
{$ENDIF}
type
TMenuItem = class;
EMenuError = class(Exception);
TMenu = class;
TMenuBreak = (mbNone, mbBreak, mbBarBreak);
TMenuChangeEvent = procedure (Sender: TObject; Source: TMenuItem; Rebuild: Boolean) of object;
TMenuDrawItemEvent = procedure (Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean) of object;
TAdvancedMenuDrawItemEvent = procedure (Sender: TObject; ACanvas: TCanvas;
ARect: TRect; State: TOwnerDrawState) of object;
TMenuMeasureItemEvent = procedure (Sender: TObject; ACanvas: TCanvas;
var Width, Height: Integer) of object;
TMenuItemAutoFlag = (maAutomatic, maManual, maParent);
TMenuAutoFlag = maAutomatic..maManual;
{ TMenuActionLink }
TMenuActionLink = class(TActionLink)
protected
FClient: TMenuItem;
procedure AssignClient(AClient: TObject); override;
function IsAutoCheckLinked: Boolean; virtual;
function IsCaptionLinked: Boolean; override;
function IsCheckedLinked: Boolean; override;
function IsEnabledLinked: Boolean; override;
function IsHelpContextLinked: Boolean; override;
function IsHintLinked: Boolean; override;
function IsGroupIndexLinked: Boolean; override;
function IsImageIndexLinked: Boolean; override;
function IsShortCutLinked: Boolean; override;
function IsVisibleLinked: Boolean; override;
function IsOnExecuteLinked: Boolean; override;
procedure SetAutoCheck(Value: Boolean); override;
procedure SetCaption(const Value: string); override;
procedure SetChecked(Value: Boolean); override;
procedure SetEnabled(Value: Boolean); override;
procedure SetHelpContext(Value: THelpContext); override;
procedure SetHint(const Value: string); override;
procedure SetImageIndex(Value: Integer); override;
procedure SetShortCut(Value: TShortCut); override;
procedure SetVisible(Value: Boolean); override;
procedure SetOnExecute(Value: TNotifyEvent); override;
end;
TMenuActionLinkClass = class of TMenuActionLink;
{ TMenuItem }
TMenuItem = class(TComponent)
private
FCaption: string;
FHandle: HMENU;
FChecked: Boolean;
FEnabled: Boolean;
FDefault: Boolean;
FAutoHotkeys: TMenuItemAutoFlag;
FAutoLineReduction: TMenuItemAutoFlag;
FRadioItem: Boolean;
FVisible: Boolean;
FGroupIndex: Byte;
FImageIndex: TImageIndex;
FActionLink: TMenuActionLink;
FBreak: TMenuBreak;
FBitmap: TBitmap;
FCommand: Word;
FHelpContext: THelpContext;
FHint: string;
FItems: TList;
FShortCut: TShortCut;
FParent: TMenuItem;
FMerged: TMenuItem;
FMergedWith: TMenuItem;
FMenu: TMenu;
FStreamedRebuild: Boolean;
FImageChangeLink: TChangeLink;
FSubMenuImages: TCustomImageList;
FOnChange: TMenuChangeEvent;
FOnClick: TNotifyEvent;
FOnDrawItem: TMenuDrawItemEvent;
FOnAdvancedDrawItem: TAdvancedMenuDrawItemEvent;
FOnMeasureItem: TMenuMeasureItemEvent;
FAutoCheck: Boolean;
procedure AppendTo(Menu: HMENU; ARightToLeft: Boolean);
procedure DoActionChange(Sender: TObject);
procedure ReadShortCutText(Reader: TReader);
procedure MergeWith(Menu: TMenuItem);
procedure RebuildHandle;
procedure PopulateMenu;
procedure SubItemChanged(Sender: TObject; Source: TMenuItem; Rebuild: Boolean);
procedure TurnSiblingsOff;
procedure VerifyGroupIndex(Position: Integer; Value: Byte);
function GetAction: TBasicAction;
function GetBitmap: TBitmap;
procedure SetAction(Value: TBasicAction);
procedure SetBitmap(Value: TBitmap);
procedure SetSubMenuImages(Value: TCustomImageList);
procedure ImageListChange(Sender: TObject);
procedure InitiateActions;
function IsCaptionStored: Boolean;
function IsCheckedStored: Boolean;
function IsEnabledStored: Boolean;
function IsHelpContextStored: Boolean;
function IsHintStored: Boolean;
function IsImageIndexStored: Boolean;
function IsOnClickStored: Boolean;
function IsShortCutStored: Boolean;
function IsVisibleStored: Boolean;
function InternalRethinkHotkeys(ForceRethink: Boolean): Boolean;
procedure SetAutoHotkeys(const Value: TMenuItemAutoFlag);
function InternalRethinkLines(ForceRethink: Boolean): Boolean;
procedure SetAutoLineReduction(const Value: TMenuItemAutoFlag);
protected
procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); dynamic;
procedure AdvancedDrawItem(ACanvas: TCanvas; ARect: TRect;
State: TOwnerDrawState; TopLevel: Boolean); virtual;
procedure AssignTo(Dest: TPersistent); override;
procedure DefineProperties(Filer: TFiler); override;
procedure DoDrawText(ACanvas: TCanvas; const ACaption: string;
var Rect: TRect; Selected: Boolean; Flags: Longint);
procedure DrawItem(ACanvas: TCanvas; ARect: TRect; Selected: Boolean); virtual;
function GetActionLinkClass: TMenuActionLinkClass; dynamic;
function GetHandle: HMENU;
function GetCount: Integer;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
function GetItem(Index: Integer): TMenuItem;
function GetMenuIndex: Integer;
function GetAutoHotkeys: Boolean;
function GetAutoLineReduction: Boolean;
function InsertNewLine(ABefore: Boolean; AItem: TMenuItem): Integer;
procedure MeasureItem(ACanvas: TCanvas; var Width, Height: Integer); virtual;
procedure MenuChanged(Rebuild: Boolean); virtual;
procedure Loaded; override;
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
procedure SetBreak(Value: TMenuBreak);
procedure SetCaption(const Value: string);
procedure SetChecked(Value: Boolean);
procedure SetChildOrder(Child: TComponent; Order: Integer); override;
procedure SetDefault(Value: Boolean);
procedure SetEnabled(Value: Boolean);
procedure SetGroupIndex(Value: Byte);
procedure SetImageIndex(Value: TImageIndex);
procedure SetMenuIndex(Value: Integer);
procedure SetParentComponent(Value: TComponent); override;
procedure SetRadioItem(Value: Boolean);
procedure SetShortCut(Value: TShortCut);
procedure SetVisible(Value: Boolean);
procedure UpdateItems;
property ActionLink: TMenuActionLink read FActionLink write FActionLink;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure InitiateAction; virtual;
procedure Insert(Index: Integer; Item: TMenuItem);
procedure Delete(Index: Integer);
procedure Clear;
procedure Click; virtual;
function Find(ACaption: string): TMenuItem;
function IndexOf(Item: TMenuItem): Integer;
function IsLine: Boolean;
function GetImageList: TCustomImageList;
function GetParentComponent: TComponent; override;
function GetParentMenu: TMenu;
function HasParent: Boolean; override;
function NewTopLine: Integer;
function NewBottomLine: Integer;
function InsertNewLineBefore(AItem: TMenuItem): Integer;
function InsertNewLineAfter(AItem: TMenuItem): Integer;
procedure Add(Item: TMenuItem); overload;
procedure Add(const AItems: array of TMenuItem); overload;
procedure Remove(Item: TMenuItem);
function RethinkHotkeys: Boolean;
function RethinkLines: Boolean;
property Command: Word read FCommand;
property Handle: HMENU read GetHandle;
property Count: Integer read GetCount;
property Items[Index: Integer]: TMenuItem read GetItem; default;
property MenuIndex: Integer read GetMenuIndex write SetMenuIndex;
property Parent: TMenuItem read FParent;
published
property Action: TBasicAction read GetAction write SetAction;
property AutoCheck: Boolean read FAutoCheck write FAutoCheck default False;
property AutoHotkeys: TMenuItemAutoFlag read FAutoHotkeys write SetAutoHotkeys default maParent;
property AutoLineReduction: TMenuItemAutoFlag read FAutoLineReduction write SetAutoLineReduction default maParent;
property Bitmap: TBitmap read GetBitmap write SetBitmap;
property Break: TMenuBreak read FBreak write SetBreak default mbNone;
property Caption: string read FCaption write SetCaption stored IsCaptionStored;
property Checked: Boolean read FChecked write SetChecked stored IsCheckedStored default False;
property SubMenuImages: TCustomImageList read FSubMenuImages write SetSubMenuImages;
property Default: Boolean read FDefault write SetDefault default False;
property Enabled: Boolean read FEnabled write SetEnabled stored IsEnabledStored default True;
property GroupIndex: Byte read FGroupIndex write SetGroupIndex default 0;
property HelpContext: THelpContext read FHelpContext write FHelpContext stored IsHelpContextStored default 0;
property Hint: string read FHint write FHint stored IsHintStored;
property ImageIndex: TImageIndex read FImageIndex write SetImageIndex stored IsImageIndexStored default -1;
property RadioItem: Boolean read FRadioItem write SetRadioItem default False;
property ShortCut: TShortCut read FShortCut write SetShortCut stored IsShortCutStored default 0;
property Visible: Boolean read FVisible write SetVisible stored IsVisibleStored default True;
property OnClick: TNotifyEvent read FOnClick write FOnClick stored IsOnClickStored;
property OnDrawItem: TMenuDrawItemEvent read FOnDrawItem write FOnDrawItem;
property OnAdvancedDrawItem: TAdvancedMenuDrawItemEvent read FOnAdvancedDrawItem write FOnAdvancedDrawItem;
property OnMeasureItem: TMenuMeasureItemEvent read FOnMeasureItem write FOnMeasureItem;
end;
TFindItemKind = (fkCommand, fkHandle, fkShortCut);
TMenu = class(TComponent)
private
FBiDiMode: TBiDiMode;
FItems: TMenuItem;
FWindowHandle: HWND;
FMenuImage: string;
FOwnerDraw: Boolean;
FParentBiDiMode: Boolean;
FImageChangeLink: TChangeLink;
FImages: TCustomImageList;
FOnChange: TMenuChangeEvent;
procedure SetBiDiMode(Value: TBiDiMode);
procedure SetOwnerDraw(Value: Boolean);
procedure SetImages(Value: TCustomImageList);
procedure SetParentBiDiMode(Value: Boolean);
procedure SetWindowHandle(Value: HWND);
procedure ImageListChange(Sender: TObject);
function IsBiDiModeStored: Boolean;
function UpdateImage: Boolean;
function GetAutoHotkeys: TMenuAutoFlag;
procedure SetAutoHotkeys(const Value: TMenuAutoFlag);
function GetAutoLineReduction: TMenuAutoFlag;
procedure SetAutoLineReduction(const Value: TMenuAutoFlag);
protected
procedure AdjustBiDiBehavior;
procedure DoChange(Source: TMenuItem; Rebuild: Boolean); virtual;
procedure DoBiDiModeChanged;
function DoGetMenuString(Menu: HMENU; ItemID: UINT; Str: PChar;
MaxCount: Integer; Flag: UINT): Integer;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
function GetHandle: HMENU; virtual;
function IsOwnerDraw: Boolean;
procedure Loaded; override;
procedure MenuChanged(Sender: TObject; Source: TMenuItem; Rebuild: Boolean); virtual;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure SetChildOrder(Child: TComponent; Order: Integer); override;
procedure UpdateItems;
property OnChange: TMenuChangeEvent read FOnChange write FOnChange;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function DispatchCommand(ACommand: Word): Boolean;
function DispatchPopup(AHandle: HMENU): Boolean;
function FindItem(Value: Integer; Kind: TFindItemKind): TMenuItem;
function GetHelpContext(Value: Integer; ByCommand: Boolean): THelpContext;
property Images: TCustomImageList read FImages write SetImages;
function IsRightToLeft: Boolean;
function IsShortCut(var Message: TWMKey): Boolean; dynamic;
procedure ParentBiDiModeChanged; overload;
procedure ParentBiDiModeChanged(AControl: TObject); overload;
procedure ProcessMenuChar(var Message: TWMMenuChar);
property AutoHotkeys: TMenuAutoFlag read GetAutoHotkeys write SetAutoHotkeys default maAutomatic;
property AutoLineReduction: TMenuAutoFlag read GetAutoLineReduction write SetAutoLineReduction default maAutomatic;
property BiDiMode: TBiDiMode read FBiDiMode write SetBiDiMode stored IsBiDiModeStored;
property Handle: HMENU read GetHandle;
property OwnerDraw: Boolean read FOwnerDraw write SetOwnerDraw default False;
property ParentBiDiMode: Boolean read FParentBiDiMode write SetParentBiDiMode default True;
property WindowHandle: HWND read FWindowHandle write SetWindowHandle;
published
property Items: TMenuItem read FItems;
end;
TMainMenu = class(TMenu)
private
FOle2Menu: HMENU;
FAutoMerge: Boolean;
procedure ItemChanged;
procedure SetAutoMerge(Value: Boolean);
protected
procedure MenuChanged(Sender: TObject; Source: TMenuItem; Rebuild: Boolean); override;
function GetHandle: HMENU; override;
public
procedure Merge(Menu: TMainMenu);
procedure Unmerge(Menu: TMainMenu);
procedure PopulateOle2Menu(SharedMenu: HMenu; const Groups: array of Integer;
var Widths: array of Longint);
procedure GetOle2AcceleratorTable(var AccelTable: HAccel;
var AccelCount: Integer; const Groups: array of Integer);
procedure SetOle2MenuHandle(Handle: HMENU);
published
property AutoHotkeys;
property AutoLineReduction;
property AutoMerge: Boolean read FAutoMerge write SetAutoMerge default False;
property BiDiMode;
property Images;
property OwnerDraw;
property ParentBiDiMode;
property OnChange;
end;
TPopupAlignment = (paLeft, paRight, paCenter);
TTrackButton = (tbRightButton, tbLeftButton);
TMenuAnimations = (maLeftToRight, maRightToLeft, maTopToBottom, maBottomToTop, maNone);
TMenuAnimation = set of TMenuAnimations;
TPopupMenu = class(TMenu)
private
FPopupPoint: TPoint;
FAlignment: TPopupAlignment;
FAutoPopup: Boolean;
FPopupComponent: TComponent;
FTrackButton: TTrackButton;
FMenuAnimation: TMenuAnimation;
FOnPopup: TNotifyEvent;
function GetHelpContext: THelpContext;
procedure SetHelpContext(Value: THelpContext);
procedure SetBiDiModeFromPopupControl;
protected
function UseRightToLeftAlignment: Boolean;
procedure DoPopup(Sender: TObject); virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Popup(X, Y: Integer); virtual;
property PopupComponent: TComponent read FPopupComponent write FPopupComponent;
property PopupPoint: TPoint read FPopupPoint;
published
property Alignment: TPopupAlignment read FAlignment write FAlignment default paLeft;
property AutoHotkeys;
property AutoLineReduction;
property AutoPopup: Boolean read FAutoPopup write FAutoPopup default True;
property BiDiMode;
property HelpContext: THelpContext read GetHelpContext write SetHelpContext default 0;
property Images;
property MenuAnimation: TMenuAnimation read FMenuAnimation write FMenuAnimation default [];
property OwnerDraw;
property ParentBiDiMode;
property TrackButton: TTrackButton read FTrackButton write FTrackButton default tbRightButton;
property OnChange;
property OnPopup: TNotifyEvent read FOnPopup write FOnPopup;
end;
TPopupList = class(TList)
protected
FWindow: HWND;
procedure MainWndProc(var Message: TMessage);
procedure WndProc(var Message: TMessage); virtual;
public
property Window: HWND read FWindow;
procedure Add(Popup: TPopupMenu);
procedure Remove(Popup: TPopupMenu);
end;
PMenuItem = ^TMenuItem;
TMenuItemStack = class(TStack)
public
procedure ClearItem(AItem: TMenuItem);
end;
var
PopupList: TPopupList;
ShortCutItems: TMenuItemStack;
function ShortCut(Key: Word; Shift: TShiftState): TShortCut;
procedure ShortCutToKey(ShortCut: TShortCut; var Key: Word; var Shift: TShiftState);
function ShortCutToText(ShortCut: TShortCut): string;
function TextToShortCut(Text: string): TShortCut;
function NewMenu(Owner: TComponent; const AName: string; const Items: array of TMenuItem): TMainMenu;
function NewPopupMenu(Owner: TComponent; const AName: string;
Alignment: TPopupAlignment; AutoPopup: Boolean; const Items: array of TMenuItem): TPopupMenu;
function NewSubMenu(const ACaption: string; hCtx: THelpContext;
const AName: string; const Items: array of TMenuItem; AEnabled: Boolean = True): TMenuItem;
function NewItem(const ACaption: string; AShortCut: TShortCut;
AChecked, AEnabled: Boolean; AOnClick: TNotifyEvent; hCtx: THelpContext;
const AName: string): TMenuItem;
function NewLine: TMenuItem;
procedure DrawMenuItem(MenuItem: TMenuItem; ACanvas: TCanvas; ARect: TRect;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -