德尔福;向无源控件添加 PopupMenu 支持

标签 delphi menu contextmenu subclassing

我有一个 VCL 控件,但我没有该控件的源,该控件没有 PopupMenu 属性和关联的事件。我怎样才能添加这个?

该控件(根据文档)继承自 TCustomControl,而 TCustomControl 又继承自 TWinControl。

查看 Delphi VCL 源代码,它似乎涉及处理 WM_CONTEXTMENU 消息。

我可以在运行时创建控件,因此它不必支持设计时功能(如果这样可以更简单)。

德尔福10.3

最佳答案

作为documentation对于WM_CONTEXTMENU状态,当子窗口不处理消息时,默认窗口过程将消息发送到父窗口。

因此,您可以通过处理控件父级上的消息来显示弹出菜单。下面的示例显示了放置在窗体上的“Panel1”的“PopupMenu1”,如果您的控件没有直接放置在窗体上,您可能需要进行调整。

type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    Panel1: TPanel;
    ..
  protected
    procedure WMContextMenu(var Message: TWMContextMenu);
      message WM_CONTEXTMENU;
  end;

...

procedure TForm1.WMContextMenu(var Message: TWMContextMenu);
var
  Pt: TPoint;
  Control: TControl;
begin
  Pt := SmallPointToPoint(Message.Pos);
  Control := ControlAtPos(ScreenToClient(Pt), False, True, True);
  if Control = Panel1 then begin
    PopupMenu1.PopupComponent := Panel1;
    PopupMenu1.Popup(Pt.X, Pt.Y);
    Message.Result := 1;
  end;
  inherited;
end;

关于德尔福;向无源控件添加 PopupMenu 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54226308/

相关文章:

jQuery:单击外部元素到 "close"使用toggleClass 出现的菜单

WPF ContextMenu 使用 ItemsControl,错误地突出显示整个集合

delphi - Delphi 64位平台上的汇编函数

delphi - 无法使用 TMemoryStream 读取 bool 值

html - 为什么网络浏览器反转了我的菜单选项?

node.js - 如何在 Electron 中取消注册上下文菜单监听器

android - 从后面的代码显示上下文菜单

delphi - 有没有办法用 JCLDebug 捕获所有异常(甚至是已处理的异常)?

delphi - Delphi设置位标志

css - ASP.Net 菜单控件在选择子菜单项时不突出显示父菜单