我正在使用Delphi。我已准备好弹出菜单,并且在我要点击的子菜单中,但我不希望弹出菜单消失。我想点击并让它留下来。
答案 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软件)可以做到这一点。