動的にファイルメニューを操作する方法
今回はリソースエディタを使わずに、プログラムから動的にファイルメニューを
操作する方法です。
これで、実行中の状態によりファイルメニューを変化させることができます。
N村はこれで、最近使ったファイルを表示させました。
(サンプル)
CMenu *Menu_Ptr; // メニューのポインタ
CMenu *SubMenu_Ptr; // ファイルメニューのポインタ
// メニューのポインタを取得する
Menu_Ptr = GetMenu();
// ファイルメニューのポインタを取得する
SubMenu_Ptr = Menu_Ptr->GetSubMenu( 0 );
まずは上記サンプルのような記述をMainFrmのOnCreateなどの起動時に一度だけ
通るロジックに追加します。
N村は初期化関数を用意してそこで行なっていますが、GetMenuがCWndのメンバ関数なので
初期化関数を使用する場合はMainFrmのメンバ関数になるようにして下さい。
GetMenu関数でメニューへのポインタを取得して、GetSubMenu関数で各メニューへの
ポインタを取得します。各メニューというのは例えば、ファイル、編集、表示、ヘルプ
など並んでいるそれぞれのメニューのことです。
GetSubMenu関数のパラメータは各メニューの位置を指定します。左から順に0からの連番
です。さっきのファイル、編集、表示、ヘルプであれば、ファイルが0、編集が1、表示が2、
ヘルプが3という具合です。defineにしておいた方が分かりやすいでしょう。
(サンプル)
while( 1 )
{
// 1件目がなければメニュー追加処理終了
if( E_OldFileName[0][0] == NULL )
{
break;
}
SubMenu_Ptr->AppendMenu( MF_SEPARATOR, NULL );
SubMenu_Ptr->AppendMenu( MF_STRING, OLD_FILENAME1, E_OldFileName[0] );
メニューへのポインタ取得が完了すれば、後はメニューを操作できます。
N村はメニューへの項目追加しかしていないので追加の方法について説明します。それ
以外の操作方法は自分で調べて下さい。追加と同じようなものだと思います。
メニューへの項目追加はAppendMenu関数を使います。最初のAppendMenuはセパレータ、
ようはメニュー区切り用の横線を追加しています。細かい説明は抜きでそのまま記述
して下さい。
2番目のAppendMenu関数は新規メニュー項目の文字列を追加します。1番目のパラメータ
で文字列であることを宣言します。2番目のパラメータは追加したメニューに割り当て
られるコマンドIDを渡します。イベント発生時にあがってくるアレです。3番目のパラメータ
にはメニューに表示させる文字列を渡します。
以上で完了です。メニューを追加すると、その追加分はプログラム終了まで保持されている
ので注意して下さい。N村はファイルメニューが開くたびに、最近使ったファイルを
メニューに追加させていたのですが、そうすると、ファイルメニューに次から次へと追加
されてしまいました。
N総研ソフトウェア開発部のTOPに戻る。
このページに関するご意見・質問は
ドンタコスN村 E-mail:wnaka@coco.ned.co.jp
まで送信してください。