メニュー関連の関数として、以下がある。
CreateMenu |
ウィンドウのタイトルバーの下に張り付く横長のメニューを作成するための関数。この関数で作成したメニューに対し、AppendMenuまたはInsertMenuItemで項目を追加する。 |
CreatePopupMenu |
ポップアップメニュー、つまり縦に開かれるメニューを作成する関数。 |
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);
として、ウィンドウにメニューを関連づける。
ここで、上記mii1はMENUITEMINFO型の構造体の変数であり、メニューのアイテム追加の時に、アイテムの性質を渡すための変数である。
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);//ウィンドウにメニューを関連づける
例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);
参考文献
http://gurigumi.s349.xrea.com/programming/visualcpp/sdk_menu3.html