スポンサーリンク

Win32apiでメニュー追加

メニュー関連の関数として、以下がある。

CreateMenu

ウィンドウのタイトルバーの下に張り付く横長のメニューを作成するための関数。この関数で作成したメニューに対し、AppendMenuまたはInsertMenuItemで項目を追加する。

CreatePopupMenu

ポップアップメニュー、つまり縦に開かれるメニューを作成する関数。
この関数で作成したメニューに対し、AppendMenuまたはInsertMenuItemで項目を追加する。

AppendMenu

InsertMenuItemに取って代わられ、いまは互換性のために存在している。

 

InsertMenuItem メニューに項目を追加するための関数

 

従って、メニュー作成の手順は、

HMENU hMenuTop = CreateMenu();

としてメニューを作成し、

InsertMenuItem(hMenuTop , ID_MENU_TOP_1, FALSE, &mii1);
InsertMenuItem(hMenuTop , ID_MENU_TOP_2, FALSE, &mii2);

のようにメニュー項目を追加することになる。

最後に

SetMenu(hWnd,hMenuTop);

として、ウィンドウにメニューを関連づける。

ここで、上記mii1MENUITEMINFO型の構造体の変数であり、メニューのアイテム追加の時に、アイテムの性質を渡すための変数である。

MENUITEMINFOはわかりにくいので、まずここにまとめる。

下記MENUITEMINFOのメンバのうち、どれを使うかをfMaskで指定する。

 

MENUITEMINFO mii;

メンバ名 指定例 fMaskの指定 説明
mii.cbSize  = sizeof(MENUITEMINFO);  MENUITEMINFOのサイズ
mii.fMask  = MIIM_ID | MIIM_STRING; 以下のパラメータのうち使用する物
mii.fType  = MFT_RADIOCHECK; MIIM_FTYPE アイテムのタイプ
mii.fState  = MFS_ENABLED; MIIM_STATE アイテムの状態
mii.wID  = 100; //ユーザー定義 MIIM_ID アイテムID
mii.hSubMenu  = hSubMenu;//ユーザー定義 MIIM_SUBMENU サブメニューのハンドル
mii.hbmpChecked  = NULL; MIIM_CHECKMARKS チェック表示時のビットマップ
mii.hbmpUnchecked  = NULL; MIIM_CHECKMARKS チェック非表示時のビットマップ
mii.dwItemData  = 0;//ユーザー定義 MIIM_DATA 任意の32ビット値
mii.dwTypeData  = “ファイル(&F)”; MIIM_STRING アイテムの内容
mii.cch  = sizeof(“ファイル(&F)” アイテムの文字列の長さ
mii.hbmpItem  = NULL; MIIM_BITMAP ビットマップハンドル

 

例1 ポップアップメニューなし

////////////////////////////////////////////////
HMENU hmenu_top = CreateMenu(); // メニュー作成
const UINT ID_MENU_TOP_1 = 1;
const UINT ID_MENU_TOP_2 = 2;
////////////////////////////////////////////////
MENUITEMINFO mii;
memset(&mii, 0, sizeof(MENUITEMINFO));
mii.cbSize = sizeof(MENUITEMINFO);
////////////////////////////////////////////////
mii.fMask = MIIM_ID | MIIM_STRING;
mii.wID = ID_MENU_TOP_1;
mii.dwTypeData = _T("メニュー1");
InsertMenuItem(hmenu_top, ID_MENU_TOP_1, FALSE, &mii);
mii.wID = ID_MENU_TOP_2;
mii.dwTypeData = _T("メニュー2");
InsertMenuItem(hmenu_top, ID_MENU_TOP_2, FALSE, &mii);

SetMenu(hDlg, hmenu_top);//ウィンドウにメニューを関連づける

menu1

 

例1 ポップアップメニューあり

////////////////////////////////////////////////
HMENU hmenu_top = CreateMenu(); // メニュー作成
const UINT ID_MENU_TOP_1 = 1;
const UINT ID_MENU_TOP_2 = 2;
HMENU hmenu_Lv1_1 = CreatePopupMenu(); //◆サブメニューの作成
HMENU hmenu_Lv1_2 = CreatePopupMenu(); //◆サブメニューの作成 
////////////////////////////////////////////////
MENUITEMINFO mii;
memset(&mii, 0, sizeof(MENUITEMINFO));
mii.cbSize = sizeof(MENUITEMINFO);
////////////////////////////////////////////////
mii.fMask = MIIM_ID | MIIM_STRING | MIIM_SUBMENU ;
mii.wID = ID_MENU_TOP_1;
mii.hSubMenu = hmenu_Lv1_1; //◆サブメニューの追加
mii.dwTypeData = _T("メニュー1");
InsertMenuItem(hmenu_top, ID_MENU_TOP_1, FALSE, &mii);
mii.wID = ID_MENU_TOP_2;
mii.hSubMenu = hmenu_Lv1_2; //◆サブメニューの追加
mii.dwTypeData = _T("メニュー2");
InsertMenuItem(hmenu_top, ID_MENU_TOP_2, FALSE, &mii);
SetMenu(hDlg, hmenu_top);//ウィンドウにメニューを関連づける

////////////////////////////////////////////////
// ◆サブメニューの項目追加
const UINT ID_MENU_Lv1_1 = 3;
const UINT ID_MENU_Lv1_2 = 4;
const UINT ID_MENU_Lv1_3 = 5;
mii.fMask = MIIM_ID | MIIM_STRING;
mii.wID = ID_MENU_Lv1_1;
mii.dwTypeData = _T("サブ11");
InsertMenuItem(hmenu_Lv1_1, ID_MENU_Lv1_1, FALSE, &mii);
mii.wID = ID_MENU_Lv1_2;
mii.dwTypeData = _T("サブ12");
InsertMenuItem(hmenu_Lv1_1, ID_MENU_Lv1_2, FALSE, &mii);
mii.wID = ID_MENU_Lv1_3;
mii.dwTypeData = _T("サブ13");
InsertMenuItem(hmenu_Lv1_1, ID_MENU_Lv1_3, FALSE, &mii);
////////////////////////////////////////////////
const UINT ID_MENU_Lv2_1 = 6;
const UINT ID_MENU_Lv2_2 = 7;
mii.fMask = MIIM_ID | MIIM_STRING;
mii.wID = ID_MENU_Lv2_1;
mii.dwTypeData = _T("サブ21");
InsertMenuItem(hmenu_Lv1_2, ID_MENU_Lv2_1, FALSE, &mii);
mii.wID = ID_MENU_Lv2_2;
mii.dwTypeData = _T("サブ22");
InsertMenuItem(hmenu_Lv1_2, ID_MENU_Lv2_2, FALSE, &mii);

menu2

 

 

 

 

 

参考文献

http://gurigumi.s349.xrea.com/programming/visualcpp/sdk_menu3.html

 

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: