单击后如何使菜单保持可见?

时间:2010-05-04 14:19:31

标签: delphi menu

我正在使用Delphi。我已准备好弹出菜单,并且在我要点击的子菜单中,但我不希望弹出菜单消失。我想点击并让它留下来。

2 个答案:

答案 0 :(得分:2)

轻松一下,禁用该项目。 < g>


开个玩笑,不是一件容易的事。

如果您希望弹出菜单的行为类似于最顶层的形式(即您可以在不停用菜单的情况下与项目和表单上的控件进行交互),请忘记它,使用标准菜单无法完成

但是,如果您的要求与您的问题中所述完全相同(单击某个项目,并且菜单未关闭 - 请单击外部并关闭),通过一些工作,可能会有。


您的目标是subclass子菜单所在的窗口,以覆盖某些消息处理。首先,从'TPopupList'派生一个新类并覆盖它的'WndProc'。这是example这样做的。

如果您打算通过选择根项来阻止关闭菜单,那么在PopupList的WndProc中你将处理WM_ENTERIDLE并从消息的lParam获取弹出菜单的窗口句柄并将弹出菜单的窗口子类化。

如果您只打算通过选择子菜单项来阻止关闭菜单,那么在PopupList的WndProc中你会看到WM_INITMENUPOPUP消息,其中wParam是“不”PopupMenu本身的句柄,这意味着子菜单是即将展示。只有这样你才能处理WM_ENTERIDLE并获得子菜单所在的窗口句柄并将该窗口子类化。

在对弹出菜单或弹出子菜单所在的窗口进行子类化之后,您将拦截未记录的“MN_BUTTONDOWN”($ 01ED)消息并阻止进一步处理(不调用原始窗口过程)。可能你也想要用键盘来阻止关闭菜单;你会看到WM_KEYDOWN(回车)和WM_CHAR(加速器)消息。

嗯,我想我会做一些工作。

答案 1 :(得分:1)

我不知道你怎么能这样做,但TAdvStickyPopupMenu组件(TMS软件)可以做到这一点。