【问题标题】:Delphi TMenuItem OnClick not working if menu has sub items如果菜单有子项,Delphi TMenuItem OnClick 不起作用
【发布时间】:2012-12-29 07:49:47
【问题描述】:

似乎Onclick 事件未针对具有子项的菜单项进行处理。

我意识到我可以创建一个用户可以使用的叶子项目,但我想让我的菜单文件夹响应 OnClick(在我的情况下“启动”所有子项目)

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

【问题讨论】:

    标签: delphi winapi


    【解决方案1】:

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

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

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

    【讨论】:

    • 对于我的特定系统托盘启动器应用程序,用户必须明确地在菜单项上分配单击操作...我希望我的计划会没问题...无论如何,我现在正在研究各种潜在的解决方案。如果有人感兴趣,会报告回来。 (虽然看起来有点麻烦。)
    • stackoverflow.com/questions/6328497/… 似乎很有帮助。但是,似乎正常点击不会触发带有子项的菜单项上的任何消息,但我会尝试进一步调查。
    • 对于带有子菜单的项目,您会得到 WM_LBUTTONDOWNWM_LBUTTONUP。我使用 Spy++ 确定了这一点。您必须解码消息 pos 以确定点击是否在您的特殊菜单项上。您还需要注意那些使用键盘访问您的菜单的人。显然,可以按照您的要求去做,但是您真的应该非常努力地考虑制作这样一个奇怪且违反直觉的 UI。您自己已经确定了一个非常好的替代方案。你应该这样做。
    • 好吧,他们不会在我继承的 PopupList.WndProc(var Message: TMessage);只有 WM_COMMAND 可以(而不是在单击带有子文件夹的项目时)。哦,好吧。也许是因为它是一个系统托盘菜单。如果我稍后有更多信息会回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多