【发布时间】: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