如果菜单有子项,Delphi TMenuItem OnClick不工作

如果菜单有子项,Delphi TMenuItem OnClick不工作,delphi,winapi,Delphi,Winapi,对于包含子项的菜单项,似乎不会处理Onclick事件 我意识到我可以创建一个用户可以使用的叶子项目,但我希望我的菜单文件夹能够响应OnClick(在我的例子中,是“启动”所有子项目) 有没有办法绕过这个限制?包含子项的菜单项确实会触发OnClick事件。但是当子菜单打开时,而不是当您单击父菜单项时,它们会触发 我很确定,在这种情况下,您不希望调用所有子项。每当子菜单打开时,父菜单的OnClick事件就会触发。单击父菜单项时,将鼠标悬停在其上,或通过键盘选择菜单项时按向右箭头键 因此,父菜单的On

对于包含子项的菜单项,似乎不会处理
Onclick
事件

我意识到我可以创建一个用户可以使用的叶子项目,但我希望我的菜单文件夹能够响应
OnClick
(在我的例子中,是“启动”所有子项目)


有没有办法绕过这个限制?

包含子项的菜单项确实会触发
OnClick
事件。但是当子菜单打开时,而不是当您单击父菜单项时,它们会触发

我很确定,在这种情况下,您不希望调用所有子项。每当子菜单打开时,父菜单的
OnClick
事件就会触发。单击父菜单项时,将鼠标悬停在其上,或通过键盘选择菜单项时按向右箭头键


因此,父菜单的
OnClick
事件对应于打开子菜单。当子菜单打开时调用所有子菜单项操作违反了所有标准的预期UI行为。您应该做的是添加另一个子项,该子项可用于调用所有操作。除非没有合理的替代方案,否则不要违背平台标准UI。

包含子项的菜单项确实会触发
OnClick
事件。但是当子菜单打开时,而不是当您单击父菜单项时,它们会触发

我很确定,在这种情况下,您不希望调用所有子项。每当子菜单打开时,父菜单的
OnClick
事件就会触发。单击父菜单项时,将鼠标悬停在其上,或通过键盘选择菜单项时按向右箭头键


因此,父菜单的
OnClick
事件对应于打开子菜单。当子菜单打开时调用所有子菜单项操作违反了所有标准的预期UI行为。您应该做的是添加另一个子项,该子项可用于调用所有操作。除非没有合理的替代方案,否则不要违背平台标准UI。

对于我的特定系统托盘启动器应用程序,用户必须明确指定菜单项上的点击操作。。。我希望我所计划的一切都会好起来。。。无论如何,我现在正在研究各种各样的解决方案。如果有人感兴趣,我会向你汇报。(可能看起来有点麻烦。)看起来确实有用。然而,正常点击似乎不会触发包含子项的菜单项上的任何消息,但我将尝试进一步研究。对于包含子菜单的项,您将获得
WM_lbuttonown
WM_LBUTTONUP
。我用Spy++确定了这一点。您必须对pos消息进行解码,以确定单击是否在您的特殊菜单项上。你们还需要留意那个些使用键盘进入你们菜单的人。很明显,你可以做你要求做的事情,但是你真的应该认真思考如何制作这样一个奇怪和反直觉的UI。有一个非常好的选择,你自己已经确定了。你应该这么做。好吧,他们不会在我继承的popplist.WndProc(var Message:TMessage)中为我开火;只有WM_命令会这样做(而不是在单击带有子文件夹的项时)。可能是因为它是一个系统托盘菜单。如果我以后有更多信息,将重新启动。对于我的特定系统托盘启动器应用程序,用户必须在菜单项上明确指定单击操作。。。我希望我所计划的一切都会好起来。。。无论如何,我现在正在研究各种各样的解决方案。如果有人感兴趣,我会向你汇报。(可能看起来有点麻烦。)看起来确实有用。然而,正常点击似乎不会触发包含子项的菜单项上的任何消息,但我将尝试进一步研究。对于包含子菜单的项,您将获得
WM_lbuttonown
WM_LBUTTONUP
。我用Spy++确定了这一点。您必须对pos消息进行解码,以确定单击是否在您的特殊菜单项上。你们还需要留意那个些使用键盘进入你们菜单的人。很明显,你可以做你要求做的事情,但是你真的应该认真思考如何制作这样一个奇怪和反直觉的UI。有一个非常好的选择,你自己已经确定了。你应该这么做。好吧,他们不会在我继承的popplist.WndProc(var Message:TMessage)中为我开火;只有WM_命令会这样做(而不是在单击带有子文件夹的项时)。可能是因为它是一个系统托盘菜单。如果我以后有更多信息,将重新返回。