システムメニューの変更


ジュン  2004-12-08 01:42:41  No: 55528

いつもお世話になっております。

現在、オプション設定時にシステムメニューの構成を
それにあわせて変更する処理を作っております。

まず以下のようなメニュー構成になっており
Menu0       Menu1                Menu2
  ∟Menu_A    ∟Menu_C−Menu_a     ∟Menu_F
    Menu_B      Menu_D  Menu_b
                Menu_E

*************************************************
Menu0       Menu1                Menu2
  ∟Menu_A    ∟Menu_C−Menu_a     ∟Menu_F
    Menu_B      Menu_D  Menu_b
                Menu_G(※)
                Menu_E
*************************************************
とMenu_Gを追加するのには
CWnd* pMainWnd = AfxGetMainWnd();
CMenu* pMenu = pMainWnd->GetMenu();
pMenu->InsertMenu(Menu_EのID, MF_BYCOMMAND, Menu_GのID, "Menu_G");
pWnd->DrawMenuBar();

*************************************************
Menu0       Menu1                Menu2
  ∟Menu_A    ∟Menu_C−Menu_a     ∟Menu_F
    Menu_B      Menu_D  Menu_c(※)
                Menu_E  Menu_b
*************************************************
とMenu_Cを追加するのには
CWnd* pMainWnd = AfxGetMainWnd();
CMenu* pMenu = pMainWnd->GetMenu();
pMenu->InsertMenu(Menu_bのID, MF_BYCOMMAND, Menu_cのID, "Menu_c");
pWnd->DrawMenuBar();
と言うように記述し思ったように変更できました。

今わからなくて困っているのは
*************************************************
Menu0       Menu1                Menu2
  ∟Menu_A    ∟Menu_C−Menu_a     ∟Menu_F
    Menu_B      Menu_D  Menu_b
                Menu_E  Menu_c(※)
*************************************************
と言うように、Menu1−Menu_Cの最後にMenu_cを追加する場合と

*************************************************
Menu0       Menu1                Menu2
  ∟Menu_A    ∟Menu_C−Menu_a     ∟Menu_F
    Menu_B      Menu_D  Menu_b
                Menu_E
                Menu_G−Menu_c(※)
                        Menu_d(※)

*************************************************
と言うようにMenu_1の最後にMenu_Gを作成しその中に
Menu_c、Menu_dを追加する場合はどのようにすればいいのでしょうか。

どなたかアドバイスいただけないでしょうか。


ジュン  2004-12-08 21:35:12  No: 55529

自己レスになってしまいますが、色々調べて試験したところ
問題のひとつが解決しましたので報告します。

*****************************************************
Menu0    Menu1      Menu2
  ∟Menu_A  ∟Menu_C−Menu_a    ∟Menu_F
    Menu_B     Menu_D  Menu_b
       Menu_E  Menu_c(※)
*****************************************************
と言うように、Menu1−Menu_Cの最後にMenu_cを追加する場合ですが

CMenu* pMenu = pMainWnd->GetMenu();    //メニュー全体の取得
CMenu* pSubMenu_1 = pMenu->GetSubMenu(1);  //Menu1の取得
CMenu* pInvSubMenu = pSubMenu_1->GetSubMenu(0);  //Menu_Cの取得

//Menu_Cの最後にMenu_cの追加
pInvSubMenu->InsertMenu(-1, MF_BYPOSITION, Menu_CのID, "Menu_c");
と記述することにより解決しました。

残す問題は
*****************************************************
Menu0    Menu1      Menu2
  ∟Menu_A  ∟Menu_C−Menu_a    ∟Menu_F
    Menu_B     Menu_D  Menu_b
       Menu_E
       Menu_G−Menu_c(※)
               Menu_d
*****************************************************
Menu1内に新規にサブメニューを持つMenu_Gを作ることです。
今回上記で記述したものを使用すればMenu_G内にMenu_c、Menu_dを
作成することが可能だと思うのですが、
ポップアップのステータスを持つMenu_Gはどのようにつくればいいのでしょうか?


RAPT  2004-12-09 11:48:52  No: 55530

>ポップアップのステータスを持つMenu_Gはどのようにつくればいいのでしょうか?

そのまま。CreatePopupMenu()で作って、InsertMenu()で追加する。
MFCで書いているのなら、MSDNでCMenuのクラスメンバを見ればよい。


シャノン  2004-12-09 19:01:00  No: 55531

激しく図が見にくいんで勘ですけど…

> ポップアップのステータスを持つMenu_Gはどのようにつくればいいのでしょうか

これは、Menu_G 自体がポップアップメニュー(右クリックメニューみたいなの)ではなく、メインウィンドウのメニューバーに属し、サブメニューを持つもの、という理解でよろしいでしょうか。

CMenu::AppendMenu や CMenu::InsertMenu ならば nIDNewItem 引数、CMenu::InsertMenuItem ならばMENUITEMINFO 構造体の hSubMenu メンバあたりに注目してみてください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加