作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我是一名优秀的程序员,十分优秀!