MDIでアプリケーションを作成しています。
メニューが選択できない状態(無効)の時、
アクセラレータキーも無効になっているのが正常だと考えています。
しかし、あるメニュー(アクセラレータキー)だけメニューが無効になっているにも関わらず
アクセラレータキーが有効になり実行できてしまいます。(意図しない動き)
このような状態でメニューをポップアップ表示させた後、
アクセラレーターを押下した場合はアクセラレータキーが無効の状態になっているようで
何も起こりません。(意図した動き)
メニューのアップデートハンドラでpCmdUI->Enable();でTRUE/FALSEを呼び分けています。
このメニューと同一のIDで作成したツールバーのボタンも表示してあります。
そのため、アップデートハンドラは必ず呼び出されています。
アップデートハンドラはアプリケーション本体とは別に作成されていて、別dllとなっていま
す。
本体からOnCmdMsg(nID, nCode, pExtra, pHandlerInfo); を使用して情報を受け取っていま
す。
アップデートハンドラとアクセラレータキーの有効/無効の関係についてご教授いただけないで
しょうか?
調べてみた所、以下のことがわかりました。
アップデートハンドラは呼び出し元(メニュー/ツールバー)でpCmdUI->Enable()
内の処理が違いました。
アクセラレータキーの有効/無効はメニューの方で決まるようで、ツールバーの方に影響は受け
ないようです。
そして、ポップアップ以下のメニューの場合、表示直前でないと「1」の個所でreturn;
するため、メニュー表示までアクセラレータキの有効/無効が前回の状態のままのようです。
if (m_pMenu != NULL)
{
if (m_pSubMenu != NULL) //1 ここ!
return; // don't change popup menus indirectly
ASSERT(m_nIndex < m_nIndexMax);
m_pMenu->EnableMenuItem(m_nIndex, MF_BYPOSITION |
(bOn ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
省略
}
上記のことが解かりましたので、
後は、プログラム側からメニューの更新を行なうことで問題が解決すると考えています。