MENUのアイテムの変更方法

[戻る]
DIO 2007/01/02(火) 22:02:18
VC8 SDK winXP

こんにちは。
早速ですが質問です。

メニューアイテムのスタイルを変更したいのですが、
|ファイル 編集 ・・・・・
     |アイテム0←ここの
     |アイテム1←項目を灰色(選択不可)にしたい。
     |・・・・・

メニューアイテムの取得に失敗してしまいます。

以下のコードの問題点等ありましたら
ご指摘お願いいたします。

以下ソース

    //メニュー表示操作
    HMENU hMenu,hSubMenu;
    MENUITEMINFO nInfo,dInfo;

    hMenu = GetMenu(hWnd);
    hSubMenu = GetSubMenu(hMenu, 1);//ここまでは値が入る
    
    BOOL rtn = GetMenuItemInfo(hSubMenu ,0 ,true ,&nInfo);←ここでrtn=0になる
    rtn = GetMenuItemInfo(hSubMenu ,1 ,true ,&dInfo);

    nInfo.fState = MFS_ENABLED;
    dInfo.fState = MFS_ENABLED;

        if(???)
        Info.fState = MFS_DISABLED ;
    }else{
        dInfo.fState = MFS_DISABLED ;
    }

    rtn = SetMenuItemInfo(hSubMenu ,0 ,true ,&nInfo);
    rtn = SetMenuItemInfo(hSubMenu ,1 ,true ,&dInfo);

瀬戸っぷ [E-Mail] 2007/01/03(水) 00:11:01
> BOOL rtn = GetMenuItemInfo(hSubMenu ,0 ,true ,&nInfo);←ここでrtn=0になる

MSDNより…
> 戻り値
> 関数が成功すると、0 以外の値が返ります。
> 関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関
数を使います。

と、いうことでGetLastError()で原因を調べてみたらどうでしょうか?

未初期化のnInfo変数が原因だと思いますが…
MENUITEMINFO構造体の最初に、構造体のサイズを指定(設定)するメンバ変数のcbSizeがあ
ります。
Win32APIでは、このメンバを参照して下位互換をとるようになっているモノが多々あります。
API内部で設定して返してくれるモノの場合でも、互換のためにこのメンバを参照してい
る可能性があります。
未初期化の場合だと、想定している構造体とは違う構造体へのポインタが渡された…と判
定するかもしれません。

# APIに渡す構造体の場合、どんな内容なのかも確認しておいた方がいいかと思います。

DIO 2007/01/03(水) 10:16:30
瀬戸っぷさん
ありがとうございます。

以下のように構造体サイズを設定しましたが改善せず、
    nInfo.cbSize = sizeof(MENUITEMINFO);
    dInfo.cbSize = sizeof(MENUITEMINFO);

GetLastErr()でエラーコードをとったところ、
以下のエラーでした。
ERROR_INVALID_PARAMETER    87    0x00000057    パラメータが間違っています。

パラメータが間違っているとは
構造体の未初期化が原因ということでしょうか?

理解不足でこれ以上自分で進めれておりません。

ご助言よろしくお願いします。

瀬戸っぷ [E-Mail] 2007/01/03(水) 14:18:50
> ERROR_INVALID_PARAMETER    87    0x00000057    パラメータが間違っています。
> パラメータが間違っているとは
> 構造体の未初期化が原因ということでしょうか?

サイズのみの初期化しかしていなかったからではないでしょうか?

ZeroMemory(&nInfo, sizeof(MENUITEMINFO));
nInfo.cbSize = sizeof(MENUITEMINFO);
nInfo.fMask = MIIM_STATE;
でどうでしょうか。
状態のみの変更であればOKかと…
これで、nInfo.fStateに状態が返されるかと。

なお、状態によってはMFS_ENABLEDのみが
設定されていない場合もありますので注意してください。
(==での判定では失敗する可能性があります)
# 詳しくはwinuser.hを確認してみてください。

DIO 2007/01/03(水) 14:26:44
[[解決]]
瀬戸っぷさん
ありがとうございます。

理解しました。
fMaskに対して使う構造体の種類を前もって
設定するのですね。

年始から丁寧に答えていただきありがとうございました。

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