欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > Windows图形界面(GUI)-MFC-C/C++ - MFC菜单

Windows图形界面(GUI)-MFC-C/C++ - MFC菜单

2026/3/10 4:43:14 来源:https://blog.csdn.net/2301_80612536/article/details/140702128  浏览:    关键词:Windows图形界面(GUI)-MFC-C/C++ - MFC菜单
  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

MFC菜单

菜单基础

创建顶层菜单

创建弹出式菜单

显示弹出式菜单

响应菜单消息

菜单状态管理

示例代码

代码关联菜单

资源关联菜单

右键弹出菜单

事件处理程序


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("&COPY\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"));
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词