ModifyMenuでメニュー修正後GetMenuStringで取得できない

[戻る]
neko 2005/03/27(日) 21:52:11
WinXP VC6.0 SP2 MFC

起動時に

{
    CMenu    *pPopup;
    VERIFY(menu.LoadMenu(IDR_MENU1));
    pPopup = menu.GetSubMenu(0);
    pPopup->ModifyMenu(ID_MENU_ITEM_1,
                            MF_BYCOMMAND,
                            ID_MENU_ITEM_1,
                            "TEST");
    DrawMenuBar();
}

で、メニューにテキストを設定しておいて、
そのメニューをクリックした段階でメニューのテキストを
取得したいのですが、

LRESULT CMenutDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    .
    .
    .
         // wParamにメニューのIDが入る
    char    cstr[256];
    pPopup->GetMenuString(wParam, cstr, 256, MF_BYCOMMAND);
}

GetMenuStringで文字列が取得できません。(NULLでした)
なぜでしょうか?

おぉう 2005/03/28(月) 18:10:27
ttp://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vclib/html/_mfc_cmenu.3a3a.getsubmenu.asp

>CMenu オブジェクトが存在しない場合、一時的な CMenu オブジェクトが作成されます。
>返された CMenu ポインタを保存しないでください。

neko 2005/03/28(月) 21:04:30
回答ありがとうございます。

省略しましたが、(←分かりづらくて、すいません)
LRESULT CMenutDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    .
    .
    .
   // wParamにメニューのIDが入る
   char    cstr[256];
   CMenu    *pPopup;
   VERIFY(menu.LoadMenu(IDR_MENU1));
   pPopup = menu.GetSubMenu(0);
   pPopup->GetMenuString(wParam, cstr, 256, MF_BYCOMMAND);
}

とやっているのですが。。。
駄目です。

変更していないメニューはちゃんと文字列は取得できるのですが、
変更したメニューだけ文字列が取得できないのです。。。
なんででしょうか?・・・(*_*)

neko 2005/03/28(月) 21:48:21
ちょっと色々いじってやって見ました。

あらかじめリソースエディタで
メニューID_MENU_ITEM_1の項目を“DEFAULT”にしておき、

その後
pPopup->ModifyMenu(ID_MENU_ITEM_1,
                   MF_BYCOMMAND | MF_STRING,
                   ID_MENU_ITEM_1,
                   "TEST");
とすると
メニューの見た目は“TEST”に変わるけど、
pPopup->GetMenuString(ID_MENU_ITEM_1, cstr, 256, MF_BYCOMMAND);
で取得するとcstrは“DEFAULT”のままでした。

内部のデータが更新されていないようなのですが、
更新の仕方分かりませんか?

dairygoods 2005/03/28(月) 21:53:05
>   VERIFY(menu.LoadMenu(IDR_MENU1));
>   pPopup = menu.GetSubMenu(0);
>   pPopup->GetMenuString(wParam, cstr, 256, MF_BYCOMMAND);

ここで、ロードしなおしているのですから、
以前の変更はどこかに行ってしまうでしょう。

neko 2005/03/28(月) 23:56:52
[[解決]]
なるほどー!
そういうことですか。

ロードすると一番最初のメニューに戻ってしまうのですね。

おぉうさん、dairygoodsさん
真に回答ありがとうございました!<(_ _)>

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