minigui[基础篇][7]—— 菜单

1.菜单的概念

1.窗口自带菜单 --- 即创建窗口时最上面的菜单
2.弹出式菜单  ---- 点击右键时的菜单 或者 点击窗口自带菜单后的子菜单

2.菜单的类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6t4HqSsw-1665049226556)(C:\Users\cjy\AppData\Roaming\Typora\typora-user-images\image-20221006160410288.png)]

3.创建普通菜单

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gLlP473K-1665049226559)(C:\Users\cjy\AppData\Roaming\Typora\typora-user-images\image-20221006162732692.png)]

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);

编程实例

效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rjf5Kitn-1665049226560)(C:\Users\cjy\AppData\Roaming\Typora\typora-user-images\image-20221006173842734.png)]

源码

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.创建弹出式菜单

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qr67OB4q-1665049226561)(C:\Users\cjy\AppData\Roaming\Typora\typora-user-images\image-20221006165234065.png)]](https://img-blog.csdnimg.cn/104ef66ac9ef495ebdf9f179a45f68b8.png

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)

编程实例

效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gD5o45dx-1665049226563)(C:\Users\cjy\AppData\Roaming\Typora\typora-user-images\image-20221006170319940.png)]

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:对应的窗口
消息说明WPARAMLPARAM
MSG_ACTIVEMENU用户激活菜单栏中的某个弹出式菜单被激活的弹出式菜单位置(在菜单的位置,0,1,2,3…)弹出式菜单的句柄
MSG_COMMAND点击菜单后LOWORD(Wparam): id号HIWORD(Wparam):通知码通知消息的控件句柄
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值