MFC CMenu<菜单>

菜单消息响应顺序:

1:OnUpdateXXXXXX(CCmdUI *pCmdUI) //调用以启用/禁用菜单项或命令按钮

2:OnXXXXXX //在已选择菜单项或命令按钮之后调用


//动态增加菜单的子菜单项

//获取应用类句柄->获取窗口句柄->获取菜单句柄->获取菜单子项-(位置)->添加子菜单一条分割线
AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(6)->AppendMenuW(MF_SEPARATOR);
//获取应用类句柄->获取窗口句柄->获取菜单句柄->获取菜单子项-(位置)->添加子菜单项
AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(6)->AppendMenuW(MF_STRING, IDS_ID_MENUSTOP, _T("停止程序(&T)"));


//动态删除菜单的子菜单项

//获取应用类句柄->获取窗口句柄->获取菜单句柄->获取菜单子项-(位置)->删除子菜单项并销毁句柄(子菜单项位置,指示前参数索引类型)
AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(6)->DeleteMenu(1, MF_BYPOSITION);

//获取应用类句柄->获取窗口句柄->获取菜单句柄->获取菜单子项-(位置)->删除子菜单项(子菜单项位置,指示前参数索引类型)

AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(6)->RemoveMenu(2, MF_BYPOSITION);


//动态创建菜单

CMenu menu;
menu.CreateMenu();
//menu.CreatePopupMenu();//也可以
AfxGetApp()->GetMainWnd()->GetMenu()->AppendMenu(MF_POPUP, (UINT)menu.m_hMenu, _T("Test"));//插入尾部
AfxGetApp()->GetMainWnd()->GetMenu()->InsertMenu(2, MF_POPUP | MF_BYPOSITION, (UINT)menu.m_hMenu, _T("TEST1"));//插入第二个菜单项
menu.AppendMenu(MF_STRING, ID_MENU_TEST, _T("Hello"));//菜单项里的子菜单(XXX,ID,子菜单项名)
menu.AppendMenu(MF_STRING, 111, _T("Bye"));
menu.AppendMenu(MF_STRING, 333, _T("Mybole"));
menu.Detach();//在局部对象中,设置句柄和对象分离;


//响应创建子菜单消息函数

1:在Resource.h,添加子菜单项ID

2:在源文件中,添加映射消息 ON_COMMAND(ID_MENU_TEST/*子菜单项ID*/, OnMenuTest/*响应函数*/)

3:在头文件中,添加响应消息函数 afx_msg void OnMenuTest();

4:实现消息响应函数


//动态插入子菜单项

方法1://CFrameWnd::OnCreate函数中,在现有的菜单项中插入子菜单
GetMenu()->GetSubMenu(0/*需要所插入的子菜单项位置*/)->AppendMenuA(MF_STRING/*增加到菜单中的新菜单项状态*/, 114/*ID*/, _T("TEST")/*菜单名*/);


方法2://任意函数中,但必须要窗口,及菜单创建后
AfxGetApp()->GetMainWnd()-> GetMenu()->GetSubMenu(0/*需要所插入的子菜单项位置*/)->AppendMenuA(MF_STRING/*增加到菜单中的新菜单项状态*/, 114/*ID*/, _T("TEST")/*菜单名*/);


//菜单字体加粗

//获取应用类句柄->获取窗口句柄->获取菜单句柄->获取菜单子项-(位置)->设置菜单项粗字体
AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(6)->SetDefaultItem(0, TRUE);


//菜单子项打勾

AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(1/*菜单项位置*/))->CheckMenuItem(1/*子菜单项位置*/, MF_BYPOSITION | MF_CHECKED);


//右击菜单

方法1:

CPoint pt;
GetCursorPos(&pt);//获取光标坐标
//获取应用类句柄->获取窗口句柄->获取菜单句柄->获取菜单子项-(位置)->显示浮动弹出菜单
AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(5)->TrackPopupMenu(TPM_LEFTALIGN, pt.x, pt.y, this);


方法2:

CMenu menu;
menu.LoadMenu(IDR_MENU1);//加载菜单资源ID
ClientToScreen(&point);//从屏幕坐标转换为客户区坐标

//获取窗口子菜单句柄->设置弹出菜单(风格,坐标X,坐标Y,句柄)
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);


//菜单加载图片

//重绘函数中<OnPoint> <OnDraw>

方法1:

或将 CBitmap 定义成类成员变量,并在构造函数中加载图片资源,再到重绘函数中,设置菜单编号图片;

CBitmap m_bitmap;定义成类成员函数
m_bitmap.LoadBitmap(IDB_BITMAP1);//在构造函数中加载图片资源,或在重绘函数中加载图片资源

//获取应用类句柄->获取窗口句柄->获取菜单句柄->获取菜单子项-(位置)->设置菜单子项图片(菜单ID或位置,指示第一个参数所接收模式,图片资源,图片资源)

ASSERT(AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(5)->SetMenuItemBitmaps(0, MF_BYPOSITION, &m_bitmap, &m_bitmap));


方法2:

CBitmap bitmap;
m_bitmap.LoadBitmap(IDB_BITMAP1);//加载图片资源

//获取应用类句柄->获取窗口句柄->获取菜单句柄->获取菜单子项-(位置)->设置菜单子项图片(菜单ID或位置,指示第一个参数所接收模式,图片资源,图片资源)
ASSERT(AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(5)->SetMenuItemBitmaps(0, MF_BYPOSITION, &bitmap, &bitmap));
bitmap.Detach();//在局部对象中,设置句柄和对象分离;


//ASSERT(test)可在Debug环境测试,如test为空时报告错误信息,

//在MFC的发行版本中,ASSERT并不计算表达式的值,因而也不会中断程序。如果不管环境如何,表达式都必须被计算

//在Release发行版本中,VERIFY计算表达式的值,但不管值为0还是非0都不会输出诊断信息




//设置菜单快捷键

VS2008编译环境

1:工程资源视图中Accelerator,写入子菜单ID到资源ID选项中,修饰符为辅助键,键为某个可视化键,类型VIRTKEY;


//子菜单无效有效或变灰

方法1:

在CFrameWnd类中的构造函数m_bAutoMenuEnable = false;

CFrameWnd::OnCreate函数中 GetMenu()->GetSubMenu(1)->EnableMenuItem(1, MF_BYPOSITION | MF_GRAYED);

//获取菜单句柄->获取子项菜单(位置)->设置菜单项无效(位置,给出已存在菜单项的位置 | 使菜单项无效,以便它不能被选择并同时变灰)

说明:

指定了将要进行的动作。它可以是MF_DISABLED, MF_ENABLED,或MF_GRAYED与 MF_BYCOMMAND或MF_BYPOSITION的组合。这些值通过位与操作进行组合。这些值有下列含义:

·MF_BYCOMMAND指定参数给出已存在的菜单项的命令ID号。此为缺省值。
·MF_BYPOSITION指定参数给出已存在菜单项的位置。第一项所在的位置是0。
·MF_DISABLED使菜单项无效,以便它不能被选择,但不变灰。
·MF_ENABLED使菜单项有效,以便它能够被选择,并可从变灰的状态中恢复出来。
·MF_GRAYED使菜单项无效,以便它不能被选择并同时变灰。

方法2:

1:包含 CFrameWnd 类成员对象 *pFrameWnd;

2:构造函数中

    if ((pFrameWnd =  dynamic_cast<CFrameWnd *>(AfxGetApp()->GetMainWnd())) != NULL)
    {
        pFrameWnd->m_bAutoMenuEnable = false;
    }

3:可根据需要在某函数调用,必须在菜单初始化完成后

AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(6/*子菜单位置*/)->EnableMenuItem(1, MF_BYPOSITION | MF_DISABLED);
















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值