MFC CMenu<菜单>
2014-03-08 18:21
295 查看
菜单消息响应顺序:
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的组合。这些值通过位与操作进行组合。这些值有下列含义:
方法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);
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 | 使菜单项无效,以便它不能被选择并同时变灰。 |
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);
相关文章推荐
- MFC CCmdUI<控制菜单,工具栏,状态条,CDialogBar按钮,点击状态类>
- MFC框架仿真<三>R T T I
- 从零開始学android<Menu菜单组件.三十.>
- 【MFC - 菜单】在对话框程序中添加菜单栏(CMenu)(转)
- MFC 学习之 界面美化<2>
- MFC工程中不要#include <windows.h>
- 解决struts2 <s:doubleselect>二级菜单没有值
- VC bug修改 MFC apps must not #include <windows.h>
- MFC工程去掉#include <windows.h>
- mfc cef<转>
- MFC: 右键弹出菜单-->选取菜单弹出窗口
- MFC 菜单编程(CMenu)
- <MFC>CString和<C++>标准库string的区别,及判断字符串是否为空
- Python 递归返回树形菜单JSON串 <flask>
- (转)MFC技巧学习<五>
- MFC框架仿真<四>动态创建
- MFC 知识总结<2>MFC CView
- iOS【TabBar菜单push隐藏菜单栏转场动画(仿<京东> 及 <东方财富通> tabBar效果)】
- menu菜单水平放置时每一项后多出一个<td style="width: 3px;">
- <MFC>创建对话框和新建对话框类