在项目上动态释放鼠标按钮时关闭弹出窗口 window

Make popup window close when releasing mouse button on an item on the fly

单击按钮时,我会打开一个弹出菜单,例如使用 popupMenu.popup()。 要 select 一个项目,我必须先释放鼠标按钮,然后单击一个菜单项来执行它。

这是 "normal",但我想要的是无需在菜单项上额外单击的行为。我希望能够单击按钮,移动菜单项(仍然按住按钮)并在释放鼠标按钮后立即执行它。 这类似于级联子菜单的工作方式。

我尝试了使用 TrackPopupMenu 挂钩消息并在释放按钮时执行项目的方式。这行得通,但是... 当将弹出菜单中的图像(位图或图像列表项)与 TrackPopupMenu 一起使用时,菜单不会显示任何条目。每个条目都是一些像素宽且空的。你可以盲目地使用它们,所以它们以某种方式工作但是绘图没有正确完成。

我正在使用 Delphi XE2 Pro。

我也试图找到一般文章来挂钩菜单消息,但没有找到任何不使用 TrackPopupMenu 的作品。也许有办法让 TrackPopupMenu 显示带有图像的菜单? 非常感谢任何帮助。

您将菜单消息路由到错误的 window 过程,您将表单的句柄传递给 TrackPopupMenu(您应该 post 您的代码,这样就不会需要猜测 你做错了什么。你可能会更快地收到回复。

表单支持 window 菜单。当表单 window 过程接收到一个,比如说 WM_DRAWITEM,它只绘制属于 window 菜单的项目。对于弹出菜单,VCL 使用实用程序 window,可通过全局 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);