2

方法はわかりませんが、ウィンドウのメインメニューを開くと、プログラムのメインメッセージループ(PeekMessage / GetMessageなど)が停止しているようです。メッセージが到着したときにWindowProcが呼び出されるため、モーダルダイアログが開かれた場合の動作とよく似ているようです。そのため、どこかに他のメッセージループがあり、それを維持している必要があります。

どの関数またはメッセージがメインメッセージループをブロックするかはまだわかりません(まだテストしていません)。メニューを開くことに関係するメッセージについては、DefWindowProcのどこかで発生していると思います。

これはWindowsのメインメニューのデフォルトの動作ですか?その場合、これの本当のポイントは何ですか?内部メッセージループではなく、メインメッセージループが実行され続けるように変更できますか?

4

2 に答える 2

3

私は間違っていたので、この回答を更新しました。

Windows は通常、メニューを表示している間、内部モーダル メッセージ ループに入ります。WM_ENTERMENULOOPメッセージは、Windows がこのループに入ると通知します。

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);

残念ながら、これにより、メニューが開いたときにメイン ウィンドウがアクティブ化されなくなり、視覚的に気を散らしてしまいます。この回答の 2 番目の部分では、メニューがモーダル ケースでこの問題を回避する方法について説明します。 この答えは解決策を示唆しています。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 に答える