2

我不知道怎么做,但似乎当打开窗口的主菜单时,我的程序中的主消息循环(PeekMessage/GetMessage 等)停止了。这种行为似乎很像打开模式对话框,因为当消息到达时我的 WindowProc 仍然被调用,所以一定有其他消息循环在某处保持这种情况发生。

我不知道这是怎么发生的(还没有测试),哪个函数或消息阻塞了主消息循环,我猜它发生在 DefWindowProc 的某个地方,因为某些消息与打开菜单有关。

这是 Windows 上主菜单的默认行为吗?在这种情况下,这样做的真正意义是什么?可以更改它以便主消息循环继续运行,而不是一些内部循环吗?

4

2 回答 2

3

我错了,所以我更新了这个答案。

Windows 在显示菜单时通常会进入内部模式消息循环。当Windows 进入此循环时, WM_ENTERMENULOOP消息会通知您。

您可以通过设置MNS_MODELESS标志使菜单无模式。例如,您可以对窗口执行以下操作hWnd

HMENU hMenu = GetMenu(hWnd);
MENUINFO menuInfo;
menuInfo.cbSize = sizeof(MENUINFO);
menuInfo.fMask = MIM_STYLE;
GetMenuInfo(hMenu, &menuInfo);
menuInfo.fMask = MIM_STYLE;
menuInfo.dwStyle |= MNS_MODELESS;
SetMenuInfo(hMenu, &menuInfo);

不幸的是,这会导致您的主窗口在打开菜单时失去激活,这在视觉上会分散注意力。这个答案的第二部分解释了菜单如何在模态情况下避免这个问题。 这个答案暗示了一个解决方案;您需要干扰WM_NCACTIVATE消息,以使主窗口的外观与其激活不同步。

于 2012-08-08T20:44:13.563 回答
0

对于 hMenuBar,您可以尝试以下方式:1) MENUINFO.fMask|MIM_STYLE|MIM_APPLYSUBMENUS, 2) GetMenuInfo(hMenuBar,addr MENUINFO), 3) MENUINFO.dwStyle|MNS_MODELESS, 4) SetMenuInfo(hMenuBar,addr MENUINFO)。

于 2014-01-05T16:29:27.160 回答