gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:47:31 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com