動的にファイルメニューを操作する方法




今回はリソースエディタを使わずに、プログラムから動的にファイルメニューを 操作する方法です。
これで、実行中の状態によりファイルメニューを変化させることができます。
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
まで送信してください。