none
Win32 MDI アプリケーションでの子フレームメニュー追加の方法は? RRS feed

  • 質問

  • お世話になります。

    MFC MDI アプリケーションで子フレームをアイコン化した際に位置がずれる購読している

    から続く質問です。

    以前の質問と回答が余りにも一人よがりで中途半端に終わっているので、MFC を使わず、Win32 MDI アプリケーションを作成してみました。

    Win32 アプリケーションとしてプロジェクトを作成し、メインフレームと子フレームを表示する所までは出来ているのですが、子フレーム用のメニューがメインフレームに上手く挿入されません。もっとも、MDI と言いつつドキュメントは作成していませんが・・・。

    MFC を使っている時と同じ感覚で、メインフレームのメニューリソースをコピーして、子フレームのメニューリソースを作成し、メニュー項目を追加しました。

    子フレーム作成後、WM_MDISETMENU メッセージをメインフレームのクラスアントに送出したのですが、子フレームのメニューが、メインフレームの ファイル 内に全て配置されてしまいました。

    WM_MDISETMENU メッセージを使う方法が間違っているのでしょうか?
    2009年10月15日 6:26

回答

  • 症状から、GetSubMenu()を使うのではないかと思いましたが、そうではないようです。すみません。

    もしかして、g_hMainFrame は、MDI子ウィンドウのメニューハンドルではなく、MDI親ウィンドウのメニューハンドルでは?

    WM_MDISETMENUのwParamはメニューハンドル、lParamは[ウィンドウ]メニューハンドルです。

    おそらく、

    ::SendMessage(g_hMDIClient, WM_MDISETMENU, (WPARAM)hMenu, (LPARAM)::GetSubMenu(hMenu, [ウィンドウ]メニューの位置));
    とすればいいのではないでしょうか?
    • 回答としてマーク ミッヒー 2009年10月15日 8:53
    2009年10月15日 8:45

すべての返信

  • もしかして、HMENU hMenu = ::LoadMenu(…)したメニューハンドルをそのままWM_MDISETMENUしていませんか?
    ::GetSubMenu(hMenu, 0)のメニューハンドルを使ってみてください。

    2009年10月15日 7:15
  • Atsushi777 さん、いつもお世話になっております。

    ::GetSubMenu(hMenu, 0) のメニューハンドルは子フレーム用のメニューでしょうか?

    子フレームであっている場合ですが、メニューリソースを hMenu にロードしてから、

    ::SendMessage(g_hMDIClient, WM_MDISETMENU, (WPARAM) ::GetMenu(g_hMainFrame), (LPARAM) ::GetSubMenu(hMenu, 0));

    としてみたのですが、メニュー項目はメインフレームのメニューから全く変化しませんでした。
    なお、直後に

    ::SendMessage(g_hMDIClient, WM_MDIREFRESHMENU, 0, 0);
    ::DrawMenuBar(g_hMainFrame);

    処理は入っていますが・・・。


    追記

    ::SendMessage(g_hMDIClient, WM_MDISETMENU, (WPARAM) ::GetMenu(g_hMainFrame), (LPARAM) ::GetSubMenu(hMenu, 0));

    この呼び出しは成功して、元のメニューハンドルだと思われる値が返って来ています ( 失敗の 0 が返ってきてはいません ) 。
    2009年10月15日 7:27
  • 症状から、GetSubMenu()を使うのではないかと思いましたが、そうではないようです。すみません。

    もしかして、g_hMainFrame は、MDI子ウィンドウのメニューハンドルではなく、MDI親ウィンドウのメニューハンドルでは?

    WM_MDISETMENUのwParamはメニューハンドル、lParamは[ウィンドウ]メニューハンドルです。

    おそらく、

    ::SendMessage(g_hMDIClient, WM_MDISETMENU, (WPARAM)hMenu, (LPARAM)::GetSubMenu(hMenu, [ウィンドウ]メニューの位置));
    とすればいいのではないでしょうか?
    • 回答としてマーク ミッヒー 2009年10月15日 8:53
    2009年10月15日 8:45
  • Atsushi777 さん、ありがとうございます。

    おかげでメニューがちゃんと表示されるようになりました。
    これで本題の

    MFC MDI アプリケーションで子フレームをアイコン化した際に位置がずれる

    原因についての調査が続行できます。

    私の拙い英語力のせいでお手数をお掛けしました。
    ありがとうございました。
    2009年10月15日 8:53