1.菜单的概念
1.窗口自带菜单 --- 即创建窗口时最上面的菜单
2.弹出式菜单 ---- 点击右键时的菜单 或者 点击窗口自带菜单后的子菜单
2.菜单的类图
3.创建普通菜单
HMENU hmnu; //菜单句柄
MENUITEMINFO mii; //每一个菜单项的菜单信息
//1.创建菜单栏 主菜单栏 一个横条
hmnu = CreateMenu();
//2.创建子菜单项
HMENU child_hmnu;
memset (&mii, 0, sizeof(MENUITEMINFO));
mii.type = MFT_STRING;
mii.id = 0;
mii.typedata = (DWORD)"文件";
child_hmnu = CreatePopupMenu (&mii); //创建子菜单
//3.子菜单项的子菜单项
memset (&mii, 0, sizeof(MENUITEMINFO));
mii.type = MFT_STRING;
mii.state = 0;
mii.id = IDM_NEW;
mii.typedata = (DWORD)"新建";
InsertMenuItem(child_hmnu, 0, TRUE, &mii);
//2.设置菜单项的菜单信息
memset (&mii, 0, sizeof(MENUITEMINFO));
mii.type = MFT_STRING ; //字符串类型
mii.state = 0; //菜单项灰化
mii.id = IDM_ABOUT_THIS; //菜单的id项
mii.typedata = (DWORD)"文件..."; //菜单的文字
mii.hsubmenu = child_hmnu;//创建子菜单项
//3.将菜单项与菜单绑定
InsertMenuItem(hmnu, 0, TRUE, &mii);
编程实例
效果
源码
static HMENU createpmenufile (void)
{
HMENU hmnu;
MENUITEMINFO mii;
memset (&mii, 0, sizeof(MENUITEMINFO));
mii.type = MFT_STRING;
mii.id = 0;
mii.typedata = (DWORD)"文件";
hmnu = CreatePopupMenu (&mii); //创建弹出式菜单栏
memset (&mii, 0, sizeof(MENUITEMINFO));
mii.type = MFT_STRING;
mii.state = 0;
mii.id = IDM_NEW;
mii.typedata = (DWORD)"新建";
InsertMenuItem(hmnu, 0, TRUE, &mii);
mii.type = MFT_STRING;
mii.state = 0;
mii.id = IDM_OPEN;
mii.typedata = (DWORD)"打开...";
InsertMenuItem(hmnu, 1, TRUE, &mii);
mii.type = MFT_STRING;
mii.state = 0;
mii.id = IDM_SAVE;
mii.typedata = (DWORD)"保存";
InsertMenuItem(hmnu, 2, TRUE, &mii);
mii.type = MFT_STRING;
mii.state = 0;
mii.id = IDM_SAVEAS;
mii.typedata = (DWORD)"另存为...";
InsertMenuItem(hmnu, 3, TRUE, &mii);
mii.type = MFT_SEPARATOR;
mii.state = 0;
mii.id = 0;
mii.typedata = 0;
InsertMenuItem(hmnu, 4, TRUE, &mii);
mii.type = MFT_SEPARATOR;
mii.state = 0;
mii.id = 0;
mii.typedata = 0;
InsertMenuItem(hmnu, 5, TRUE, &mii);
mii.type = MFT_STRING;
mii.state = 0;
mii.id = IDM_EXIT;
mii.typedata = (DWORD)"退出";
InsertMenuItem(hmnu, 6, TRUE, &mii);
return hmnu;
}
/* 创建菜单栏 */
static HMENU createmenu (void)
{
HMENU hmnu;
MENUITEMINFO mii;
hmnu = CreateMenu();
memset (&mii, 0, sizeof(MENUITEMINFO));
mii.type = MFT_STRING;
mii.id = 100;
mii.typedata = (DWORD)"文件";
mii.hsubmenu = createpmenufile ();
InsertMenuItem(hmnu, 0, TRUE, &mii);
...
return hmnu;
}
/* 处理 MSG_ACTIVEMENU,以确保正确设定菜单项的选中状态 */
case MSG_ACTIVEMENU:
if (wParam == 2) {
/* 用 CheckMenuRadioItem 来设定菜单项的选中状态 */
CheckMenuRadioItem ((HMENU)lParam,IDM_40X15,IDM_CUSTOMIZE,pNoteInfo->winType, MF_BYCOMMAND);
CheckMenuRadioItem ((HMENU)lParam,IDM_DEFAULT,IDM_BIG5,pNoteInfo->editCharset, MF_BYCOMMAND);
}
break;
/* 处理 MSG_COMMAND 消息,处理各个菜单命令 */
case MSG_COMMAND:
switch (wParam) { //子菜单的id 标识符
case IDM_NEW:
break;
case IDM_OPEN:
break;
case IDM_SAVE:
break;
case IDM_SAVEAS:
break;
};
4.创建弹出式菜单
HMENU hNewMenu;
MENUITEMINFO mii;
HMENU hMenuFloat;
memset (&mii, 0, sizeof(MENUITEMINFO));
mii.type = MFT_STRING;
mii.id = 0;
mii.typedata = (DWORD)"File";
hNewMenu = CreatePopupMenu (&mii); //创建弹出式菜单
hMenuFloat = StripPopupHead(hNewMenu); //删除弹出式菜单的头部
TrackPopupMenu (hMenuFloat, TPM_CENTERALIGN, 40, 151, hWnd)
编程实例
效果
static HMENU CreateQuickMenu (void)
{
int i;
HMENU hNewMenu;
MENUITEMINFO mii;
HMENU hMenuFloat;
char *msg[] = {
"A",
"F",
"H",
"L",
"P",
"S",
"X"
};
memset (&mii, 0, sizeof(MENUITEMINFO));
mii.type = MFT_STRING;
mii.id = 0;
mii.typedata = (DWORD)"File";
//创建弹出式菜单
hNewMenu = CreatePopupMenu (&mii);
for ( i = 0; i <7; i ++ ) {
memset ( &mii, 0, sizeof (MENUITEMINFO) );
mii.type = MFT_STRING;
mii.id = 100+ i;
mii.state = 0;
mii.typedata= (DWORD) msg[i];
InsertMenuItem ( hNewMenu, i, TRUE, &mii );
}
//删除菜单的头
hMenuFloat = StripPopupHead(hNewMenu);
TrackPopupMenu (hMenuFloat, TPM_CENTERALIGN | TPM_LEFTBUTTON , 40, 151, hWnd);//创建下拉菜单
}
5.菜单相关API
函数名 | 作用 |
---|---|
CreateMenu | 创建普通菜单 即窗口上面的最上层菜单的那一栏 |
CreatePopupMenu | 创建菜单 普通菜单和弹出式菜单都会用到它 |
TrackPopupMenu | 创建弹出式菜单 |
StripPopupHead | 去除Popup菜单头部 用于弹出式菜单 |
GetMenuItemInfo | 操作菜单 得到菜单信息 |
SetMenuItemInfo | 操作菜单 设置菜单信息 |
GetSubMenu | 得到子菜单 |
SetMenuItemBitmaps | 设置菜单位图 |
GetMenuItemID | 得到菜单item的标识符 |
EnableMenuItem | 使能菜单的item项 |
RemoveMenu | 该函数从菜单中删除指定的菜单项。如果菜单项含有子菜单,则会解除子菜单和该菜单项的关联,但并不删除子菜单 |
DeleteMenu | 该函数从菜单中删除指定的菜单项。如果菜单项含有子菜单,则同时会删除子菜单 |
DestroyMenu | 删除整个菜单 |
int GUIAPI GetMenuItemInfo (HMENU hmnu, int item, BOOL flag, PMENUITEMINFO pmii);
int GUIAPI SetMenuItemInfo (HMENU hmnu, int item, BOOL flag, PMENUITEMINFO pmii);
@humu:菜单句柄
@item:与flag搭配着使用
@flag: MF_BYCOMMAND item 参数取菜单项的标识符
MF_BYPOSITION item 参数取菜单项在菜单中的位置索引值,第一个菜单项取 0 值
在使用这个函数获取或设置菜单属性的时候,MENUITEMINFO 的 mask 成员要设置相应的值才能成功获取或设置菜单的属性
int GUIAPI TrackPopupMenu (HMENU hmnu, UINT uFlags, int x, int y, HWND hwnd);
@hmnu:菜单句柄
@uFlags: TPM_LEFTALIGN:菜单以 (x,y) 点为准水平左对齐,也就是说 x 参数指定的是菜单的左边位置。
TPM_CENTERALIGN:水平居中对齐。
TPM_RIGHTALIGN:水平右对齐。
TPM_TOPALIGN:垂直顶对齐。
TPM_VCENTERALIGN:垂直居中对齐。
TPM_BOTTOMALIGN:垂直底对齐。
@x:弹出菜单的屏幕坐标位置 它的具体含义是和 uFlags 参数相关的
@y:弹出菜单的屏幕坐标位置 它的具体含义是和 uFlags 参数相关的
@hwnd:对应的窗口
消息 | 说明 | WPARAM | LPARAM |
---|---|---|---|
MSG_ACTIVEMENU | 用户激活菜单栏中的某个弹出式菜单 | 被激活的弹出式菜单位置(在菜单的位置,0,1,2,3…) | 弹出式菜单的句柄 |
MSG_COMMAND | 点击菜单后 | LOWORD(Wparam): id号HIWORD(Wparam):通知码 | 通知消息的控件句柄 |