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);
> BOOL rtn = GetMenuItemInfo(hSubMenu ,0 ,true ,&nInfo);←ここでrtn=0になる
MSDNより…
> 戻り値
> 関数が成功すると、0 以外の値が返ります。
> 関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関
数を使います。
と、いうことでGetLastError()で原因を調べてみたらどうでしょうか?
未初期化のnInfo変数が原因だと思いますが…
MENUITEMINFO構造体の最初に、構造体のサイズを指定(設定)するメンバ変数のcbSizeがあ
ります。
Win32APIでは、このメンバを参照して下位互換をとるようになっているモノが多々あります。
API内部で設定して返してくれるモノの場合でも、互換のためにこのメンバを参照してい
る可能性があります。
未初期化の場合だと、想定している構造体とは違う構造体へのポインタが渡された…と判
定するかもしれません。
# APIに渡す構造体の場合、どんな内容なのかも確認しておいた方がいいかと思います。
瀬戸っぷさん
ありがとうございます。
以下のように構造体サイズを設定しましたが改善せず、
nInfo.cbSize = sizeof(MENUITEMINFO);
dInfo.cbSize = sizeof(MENUITEMINFO);
GetLastErr()でエラーコードをとったところ、
以下のエラーでした。
ERROR_INVALID_PARAMETER 87 0x00000057 パラメータが間違っています。
パラメータが間違っているとは
構造体の未初期化が原因ということでしょうか?
理解不足でこれ以上自分で進めれておりません。
ご助言よろしくお願いします。
> ERROR_INVALID_PARAMETER 87 0x00000057 パラメータが間違っています。
> パラメータが間違っているとは
> 構造体の未初期化が原因ということでしょうか?
サイズのみの初期化しかしていなかったからではないでしょうか?
ZeroMemory(&nInfo, sizeof(MENUITEMINFO));
nInfo.cbSize = sizeof(MENUITEMINFO);
nInfo.fMask = MIIM_STATE;
でどうでしょうか。
状態のみの変更であればOKかと…
これで、nInfo.fStateに状態が返されるかと。
なお、状態によってはMFS_ENABLEDのみが
設定されていない場合もありますので注意してください。
(==での判定では失敗する可能性があります)
# 詳しくはwinuser.hを確認してみてください。
瀬戸っぷさん
ありがとうございます。
理解しました。
fMaskに対して使う構造体の種類を前もって
設定するのですね。
年始から丁寧に答えていただきありがとうございました。