- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
MFC菜单
菜单基础
-
CMenu类:MFC提供的菜单管理类,用于创建和管理菜单。
-
菜单类型:顶层菜单(菜单栏)和弹出式菜单(上下文菜单)。
创建顶层菜单
-
资源编辑器:
-
在Visual Studio中,通过资源视图创建菜单资源。
-
设置菜单项的ID和标题。
-
-
代码创建:
-
使用
CMenu::CreateMenu()
创建空菜单。 -
使用
CMenu::AppendMenu()
或CMenu::InsertMenu()
添加菜单项。
-
创建弹出式菜单
-
资源编辑器:
-
创建弹出式菜单资源,设置菜单项。
-
-
代码创建:
-
使用
CMenu::CreatePopupMenu()
创建弹出式菜单。 -
使用
CMenu::AppendMenu()
添加菜单项。
-
显示弹出式菜单
-
TrackPopupMenu函数:
-
使用
CMenu::TrackPopupMenu()
在指定位置显示弹出式菜单。 -
参数包括菜单显示位置、对齐方式和拥有者窗口。
-
响应菜单消息
-
消息映射:
-
在MFC类中使用
BEGIN_MESSAGE_MAP()
和END_MESSAGE_MAP()
定义消息映射。 -
使用
ON_COMMAND()
宏将菜单ID与消息处理函数关联。
-
-
消息处理函数:
-
定义
afx_msg
类型的消息处理函数。 -
在函数中编写菜单命令的处理逻辑。
-
菜单状态管理
-
菜单项状态:
-
使用
CMenu::EnableMenuItem()
启用或禁用菜单项。 -
使用
CMenu::CheckMenuItem()
选中或取消选中菜单项。
-
示例代码
代码关联菜单
CMainWnd::CMainWnd()
{
Create(NULL, NULL);
CMenu menuMain, menuFile, menuEdit;
// 顶层菜单
menuMain.CreateMenu();
// 子菜单一
menuFile.CreatePopupMenu();
menuFile.AppendMenu(MF_STRING, ID_FILE_NEW, _T("&NEW\tCtrl+N"));
menuFile.AppendMenu(MF_STRING, ID_FILE_OPEN, _T("&OPEN\tCtrl+O"));
// 子菜单二
menuEdit.CreatePopupMenu();
menuEdit.AppendMenu(MF_STRING, ID_EDIT_COPY, _T("©\tCtrl+C"));
menuEdit.AppendMenu(MF_STRING, ID_EDIT_PASTE, _T("&PASTE\tCtrl+V"));
// 菜单关联
menuMain.AppendMenu(MF_POPUP, (UINT_PTR)menuFile.Detach(), _T("&FILE"));
menuMain.AppendMenu(MF_POPUP, (UINT_PTR)menuEdit.Detach(), _T("&EDIT"));
// 设置菜单
SetMenu(&menuMain);
menuMain.Detach();
}
资源关联菜单
-
工程项目右键资源文件
-
添加MENU新建
-
设置其对应属性等
-
CMainWnd::CMainWnd() { Create(NULL, NULL); CMenu menuMain; menuMain.LoadMenu(IDR_MENU_MAIN); SetMenu(&menuMain); menuMain.Detach(); }
右键弹出菜单
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
ON_WM_RBUTTONDOWN()
ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()
void CMainWnd::OnRButtonDown(UINT nFlags, CPoint point)
{
//ClientToScreen(&point);
//
//CMenu menuMain;
//menuMain.LoadMenu(IDR_MENU1);
//CMenu* pSubMenu = menuMain.GetSubMenu(0);
//pSubMenu->TrackPopupMenu(
// TPM_LEFTALIGN | TPM_RIGHTBUTTON,
// point.x,
// point.y,
// this);
//
//CFrameWnd::OnRButtonDown(nFlags, point);
}
void CMainWnd::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu menuMain;
menuMain.LoadMenu(IDR_MENU1);
CMenu* pSubMenu = menuMain.GetSubMenu(0);
pSubMenu->TrackPopupMenu(
TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x,
point.y,
this);
}
事件处理程序
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
ON_COMMAND(ID_111_222, &CMainWnd::On111222)
ON_COMMAND(ID_111_334, &CMainWnd::On111334)
END_MESSAGE_MAP()
void CMainWnd::On111222()
{
// TODO: 在此添加命令处理程序代码
AfxMessageBox(_T("On111222"));
m_bAutoMenuEnable = FALSE;
CMenu* pMenu = GetMenu();
pMenu->EnableMenuItem(ID_111_334, MF_BYCOMMAND | MF_GRAYED | MF_DISABLED);
}
void CMainWnd::On111334()
{
// TODO: 在此添加命令处理程序代码
AfxMessageBox(_T("On111334"));
}