我有一个 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/