【问题标题】:How to know when a menu item has been clicked?如何知道何时单击了菜单项?
【发布时间】:2021-07-01 23:02:07
【问题描述】:

我正在使用winsafe crate,想知道某个菜单项何时在窗口中被点击。

flags & MF_MOUSESELECT as u16 应该是 1 如果是,0 如果不是,但每次触发事件时它总是 32768,即使它只是来自用户悬停菜单项,甚至点击离开它关闭了。

为什么?

self.wnd.on().wm(winsafe::co::WM::MENUSELECT, {
  move |params| {
    let wparam = params.wparam;
    let lparam = params.lparam;
    let flags = (wparam >> 16 & 0xffff) as u16;
    let MF_MOUSESELECT = 0x00008000 as u32;
    
    println!("{}", flags & MF_MOUSESELECT as u16);
    // always 32768

    0
  }
});

菜单由资源脚本生成,资源脚本编译并嵌入程序中:

1 MENU
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
{
  POPUP "&File"
  {
    MENUITEM "&Open",  1
    MENUITEM "&Save",  2
  }
  POPUP "&Help"
  {
    MENUITEM "&About",  3
  }
}

【问题讨论】:

  • 如果您还描述了您是如何创建菜单的,这可能会有所帮助。
  • @frankenapps 我添加了相关的资源脚本。完整代码可以在 Github 上看到:github.com/GirkovArpa/verpatch-gui-win32
  • MF_MOUSESELECT 是 32768,所以flags & MF_MOUSESELECT as u16 只能是 0 或 32768。
  • 是的,这是测试位域中是否存在标志的正确方法。
  • 无论如何,WM_MENUSELECT 不会告诉您用户何时真正调用 菜单项,WM_(SYS)COMMAND 会告诉您。 WM_MENUSELECT 告诉您用户何时选择(即突出显示)菜单项,但尚未调用它。选择和调用不是一回事。此外,MF_MOUSESELECT 仅告诉您用户是否使用鼠标选择菜单项(即翻转热跟踪),但也可以通过键盘选择菜单项(即通过箭头键),在这种情况下,MF_MOUSESELECT 标志将为 0。

标签: windows user-interface winapi rust win32gui


【解决方案1】:

您应该处理WM_COMMAND。实际上有内置的菜单功能。只需提供您在资源文件中指定的 id 即可检查相应菜单项何时被单击。

用这些替换你的事件监听器:

self.wnd.on().wm_command(co::CMD::Menu, 1, {
  move || {
    println!("Open clicked.")
  }
});

self.wnd.on().wm_command(co::CMD::Menu, 2, {
  move || {
    println!("Save clicked.")
  }
});

self.wnd.on().wm_command(co::CMD::Menu, 3, {
  move || {
    println!("About clicked.")
  }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2022-01-22
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 2019-08-25
    • 2021-11-25
    相关资源
    最近更新 更多