UpdatecommandUIが呼ばれるタイミング

[戻る]
せんず 2009/11/01(日) 01:23:11
Windows Vista/VC++ 2005/MFC/ダイアログベースで開発しています。
ダイアログにポップアップメニューにチェック付きのメニューを複数項目つくって
UpdatecommandUIで変数aに応じてどれか一つにチェックマークをつけたいと思っていま
す。

しかし
1.変数aにかかわらずチェック付きメニューの全ての項目にチェックが入ってしまう。
  (どれかひとつにチェックが入っている状態を望んでいる)
2.デバッグモードで確かめるとポップアップメニューを表示した時ではなく
  当該メニュー項目をクリックしたときにUpdatecommandUIが呼び出されている
  (ポップアップメニューが表示される時に呼び出されるようにしたつもり)

具体的なコードは
void CHogeDlg::OnMenu1()
{
    // TODO: ここにコマンド ハンドラ コードを追加します。
    g_hoge.mode = 1;
}

void CHogeDlg::OnUpdateMenu1(CCmdUI *pCmdUI)
{
    // TODO: ここにコマンド更新 UI ハンドラ コードを追加します。
    pCmdUI->SetCheck(g_hoge.mode==1);
}
というコードがメニュー数存在します。
私のコーディングが悪いのか、はたまたそれが仕様なのかわかりかねます。
お分かりになる方がいらっしゃったら、原因・解決法をご教授いただければ幸いです。

FlatWest 2009/11/01(日) 02:27:28
>ポップアップメニューが表示される時に呼び出されるようにしたつもり

この「つもり」というのが結構コワかったりする。(笑)

確か ON_UPDATE_COMMAND_UI() マクロって、ダイアログベースのメニューには
対応してないから、WM_INITMENUPOPUP メッセージを処理して
そこで CCmdUI::DoUpdate() を呼び出してあげるんじゃなかったかな。

最近あまりMFCを使ってないので、記憶違いだったらゴメンなさい。


>というコードがメニュー数存在します。

世の中には ON_UPDATE_COMMAND_UI_RANGE() というマクロもございまして・・・。

Ismaell. 2009/11/02(月) 11:10:56
g_hoge_modeはメニュー(a?)の連番でしょうか

それなら例えばOnUpdateMenuNのとき
pCmdUI->SetCheck((g_hoge_mode==N)?1:0);
とか。
(VC++6ですが)

bun 2009/11/02(月) 11:41:36
FlatWestさんの話通りで良いと思います。

詳しくは以下を参照してください。
 http://support.microsoft.com/kb/242577/ja

せんず 2009/11/04(水) 22:39:06
[[解決]]
回答いただいた皆様
ありがとうございます。
おかげ様で無事問題を解決することができました。
ダイアログベースでダメだとは全く予想ができませんでした…驚きです。
なぜこんな仕様にしたんでしょうねぇ…

古いスレッドには追加発言できません。