点击按钮时,我打开一个弹出菜单,例如使用popupMenu.popup()。 要选择一个项目,我必须首先释放鼠标按钮,然后单击一个菜单项来执行它。
这是"正常",但我想要的是我赢得的行为不必额外点击菜单项。我希望能够单击按钮,移动菜单项(仍然按住按钮)并在释放鼠标按钮后立即执行它。 这类似于级联子菜单的工作方式。
我尝试使用TrackPopupMenu挂钩消息并在释放按钮时执行该项目。这有效,但...... 当在弹出菜单中使用图像(位图或图像列表项)和TrackPopupMenu时,菜单不显示任何条目。每个条目都是一些像素宽且空的。你可以盲目地使用它们,所以它们以某种方式工作,但绘图没有正确完成。
我使用的是Delphi XE2 Pro。
我还尝试查找一般文章以挂钩菜单消息,但没有使用TrackPopupMenu找不到任何有用的东西。也许有一种方法让TrackPopupMenu显示带图像的菜单? 非常感谢任何帮助。
答案 0 :(得分:1)
您正在将菜单消息路由到错误的窗口过程,您将表单的句柄传递给TrackPopupMenu
(您应该发布您的代码,然后就不需要猜测你做错了什么。你可能会收到更快的回复。)
表单具有窗口菜单的菜单支持。当表单窗口过程接收到一个,例如WM_DRAWITEM
时,它只绘制项目,如果它属于窗口菜单。对于弹出菜单,VCL使用可通过全局PopupList
访问的实用程序窗口。见下面的例子。
var
Pt: TPoint;
begin
Pt := Button1.ClientToScreen(Point(0, Button1.Height));
TrackPopupMenu(PopupMenu1.Handle, TPM_LEFTBUTTON, Pt.X, Pt.Y, 0,
PopupList.Window, nil);