MENUのアイテムの変更方法 – プログラミング – Home

MENUのアイテムの変更方法
 
通知
すべてクリア

[解決済] MENUのアイテムの変更方法


DIO
 DIO
(@DIO)
ゲスト
結合: 18年前
投稿: 62
Topic starter  

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);


引用未解決
トピックタグ
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

> BOOL rtn = GetMenuItemInfo(hSubMenu ,0 ,true ,&nInfo);←ここでrtn=0になる

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

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

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

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


返信引用
DIO
 DIO
(@DIO)
ゲスト
結合: 18年前
投稿: 62
Topic starter  

瀬戸っぷさん
ありがとうございます。

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

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

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

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

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


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

> 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
 DIO
(@DIO)
ゲスト
結合: 18年前
投稿: 62
Topic starter  

瀬戸っぷさん
ありがとうございます。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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