アクセラレータキーとアップデートハンドラ – プログラミング – Home

アクセラレータキーとアップデートハンド...
 
通知
すべてクリア

アクセラレータキーとアップデートハンドラ


MM
 MM
(@MM)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

MDIでアプリケーションを作成しています。

メニューが選択できない状態(無効)の時、
アクセラレータキーも無効になっているのが正常だと考えています。
しかし、あるメニュー(アクセラレータキー)だけメニューが無効になっているにも関わらず
アクセラレータキーが有効になり実行できてしまいます。(意図しない動き)

このような状態でメニューをポップアップ表示させた後、
アクセラレーターを押下した場合はアクセラレータキーが無効の状態になっているようで
何も起こりません。(意図した動き)

メニューのアップデートハンドラでpCmdUI->Enable();でTRUE/FALSEを呼び分けています。
このメニューと同一のIDで作成したツールバーのボタンも表示してあります。
そのため、アップデートハンドラは必ず呼び出されています。

アップデートハンドラはアプリケーション本体とは別に作成されていて、別dllとなっていま
す。
本体からOnCmdMsg(nID, nCode, pExtra, pHandlerInfo); を使用して情報を受け取っていま
す。

アップデートハンドラとアクセラレータキーの有効/無効の関係についてご教授いただけないで
しょうか?


引用解決済
トピックタグ
MM
 MM
(@MM)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

調べてみた所、以下のことがわかりました。

アップデートハンドラは呼び出し元(メニュー/ツールバー)で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)));

       省略
}

上記のことが解かりましたので、
後は、プログラム側からメニューの更新を行なうことで問題が解決すると考えています。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました