typedef struct tagMENUITEMINFO {
UINT cbSize;
UINT fMask;
UINT fType;
UINT fState;
UINT wID;
HMENU hSubMenu;
HBITMAP hbmpChecked;
HBITMAP hbmpUnchecked;
DWORD dwItemData;
LPTSTR dwTypeData;
UINT cch;
} MENUITEMINFO, FAR *LPMENUITEMINFO;
cbSize は、この構造体のサイズをバイト単位で指定します| 定数 | 取得、またはセットするメンバ |
|---|---|
| MIIM_CHECKMARKS | hbmpChecked と hbmpUnchecked |
| MIIM_DATA | dwItemData |
| MIIM_ID | wID |
| MIIM_STATE | fState |
| MIIM_SUBMENU | hSubMenu |
| MIIM_TYPE | fType と dwTypeData |
| 定数 | 解説 |
|---|---|
| MFT_BITMAP | ビットマップのメニューを表示 dwTypeDataメンバーの下位ワードにビットマップのハンドルを指定します cchは無視されます |
| MFT_MENUBARBREAK | メニューバーの新しいラインにメニュー項目を配置 |
| MFT_MENUBREAK | メニューの新しいラインに項目を配置 |
| MFT_OWNERDRAW | オーナー描画メニュー 描画責任がメニューを所持するウィンドウに割り当てられる |
| MFT_RADIOCHECK | チェックマークではなく、ラジオボタンマークを使って メニュー項目をチェックする |
| MFT_RIGHTJUSTIFY | 右揃えする メニュー項目がメニューバーにある時のみ有効 |
| MFT_RIGHTORDER | Windows95 , NT5.0 以降 アラビア語など、右から左に読む言語をサポートする |
| MFT_SEPARATOR | セパレータであることを表す |
| MFT_STRING | 文字列のメニューであることを表す dwTypeDataメンバーはヌルで終わる文字列へのポインタ cchメンバーは文字列の長さである |
| 定数 | 解説 |
|---|---|
| MFS_CHECKED | 項目をチェックする |
| MFS_DEFAULT | 項目はデフォルトである |
| MFS_DISABLED | 項目を無効状態にする |
| MFS_ENABLED | 項目を有効状態にする(デフォルト) |
| MFS_GRAYED | 項目をグレー状態にする |
| MFS_HILITE | 項目をハイライト状態にする |
| MFS_UNCHECKED | 項目のチェックを外す |
| MFS_UNHILITE | 項目のハイライトを削除する |
BOOL SetMenuItemInfo( HMENU hMenu , UINT uItem , BOOL fByPosition , LPMENUITEMINFO lpmii );hMenu には、変更するメニューのハンドルを指定します
/*resorce.h*/ #define IDM_RENA 40001
/*リソーススクリプト*/
#include "resource.h"
KITTY MENU {
POPUP "Kitty on your lap" {
MENUITEM "RENA" , IDM_RENA
}
}
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
static HMENU hmenu;
static MENUITEMINFO menuInfo;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
hmenu = GetMenu(hwnd);
menuInfo.cbSize = sizeof (MENUITEMINFO);
menuInfo.fState = MFS_UNCHECKED;
return 0;
case WM_COMMAND:
menuInfo.fMask = MIIM_STATE;
if (menuInfo.fState == MFS_CHECKED)
menuInfo.fState = MFS_UNCHECKED;
else menuInfo.fState = MFS_CHECKED;
SetMenuItemInfo(hmenu , IDM_RENA , FALSE , &menuInfo);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = TEXT("KITTY");
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL ,
hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

BOOL GetMenuItemInfo( HMENU hMenu , UINT uItem , BOOL fByPosition , LPMENUITEMINFO lpmii );hMenu にはメニューのハンドル
/*resorce.h*/ #define IDM_RENA 40001
/*リソーススクリプト*/
#include "resource.h"
KITTY MENU {
POPUP "Kitty on your lap" {
MENUITEM "RENA" , IDM_RENA
}
}
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
static HMENU hmenu;
MENUITEMINFO menuInfo;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
hmenu = GetMenu(hwnd);
return 0;
case WM_INITMENUPOPUP:
menuInfo.cbSize = sizeof (MENUITEMINFO);
menuInfo.fMask = MIIM_STATE;
GetMenuItemInfo(hmenu , IDM_RENA , FALSE , &menuInfo);
if (menuInfo.fState & MFS_GRAYED)
menuInfo.fState = MFS_ENABLED;
else menuInfo.fState = MFS_GRAYED;
SetMenuItemInfo(hmenu , IDM_RENA , FALSE , &menuInfo);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = TEXT("KITTY");
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL ,
hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

/*リソーススクリプト*/
KITTY MENU {
POPUP "Kitty on your lap" {
MENUITEM "レナ" , 40001
MENUITEM "ユキ" , 40002
MENUITEM "ミミ" , 40003
}
POPUP "Magical nyan nyan TARUTO" {
MENUITEM "たると" , 40004
MENUITEM "シャルロッテ" , 40005
MENUITEM "ちとせ" , 40006
MENUITEM "柿ピー" , 40007
}
}
#include <windows.h>
LPCTSTR strSub[] = {
TEXT("Kitty on your lap") ,
TEXT("Magical nyan nyan TARUTO")
};
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
static HMENU hmenu;
static HWND list , edit , label;
TCHAR strText[1024];
int iID;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
list = CreateWindow(
TEXT("LISTBOX") , NULL ,
WS_CHILD | WS_VISIBLE | LBS_STANDARD ,
0 , 0 , 200 , 50 , hwnd , (HMENU)1 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
SendMessage(list , LB_INSERTSTRING , 0 , (LPARAM)strSub[0]);
SendMessage(list , LB_INSERTSTRING , 1 , (LPARAM)strSub[1]);
edit = CreateWindow(
TEXT("EDIT") , NULL ,
WS_CHILD | WS_VISIBLE | WS_BORDER ,
0 , 50 , 200 , 30 , hwnd , (HMENU)2 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
label = CreateWindow(
TEXT("STATIC") , NULL ,
WS_CHILD | WS_VISIBLE ,
200 , 00 , 200 , 80 , hwnd , (HMENU)3 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
return 0;
case WM_COMMAND:
hmenu = GetSubMenu(GetMenu(hwnd) ,
SendMessage(list , LB_GETCURSEL , 0 , 0)
);
GetWindowText(edit , strText , 2);
iID = strText[0] & 0x0F;
wsprintf(strText , TEXT("メニュー項目 = %d\nID = %d") ,
GetMenuItemCount(hmenu) , GetMenuItemID(hmenu , iID)
);
SetWindowText(label , strText);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = TEXT("KITTY");
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL ,
hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

BOOL SetMenuItemInfo( HMENU hMenu , UINT uItem , BOOL fByPosition , LPMENUITEMINFO lpmii );メニューの状態を新しく設定します
BOOL GetMenuItemInfo( HMENU hMenu , UINT uItem , BOOL fByPosition , LPMENUITEMINFO lpmii );メニューの状態を取得します