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()选中或取消选中菜单项。

示例代码
代码关联菜单
cpp 复制代码
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新建

  • 设置其对应属性等

cpp 复制代码
CMainWnd::CMainWnd()
{
	Create(NULL, NULL);

	CMenu menuMain;
	menuMain.LoadMenu(IDR_MENU_MAIN);
	SetMenu(&menuMain);
	menuMain.Detach();
}
右键弹出菜单
cpp 复制代码
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);
}
事件处理程序
cpp 复制代码
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"));
}
相关推荐
java资料站1 小时前
十一、评估测试
开发语言·人工智能·python
左手の明天2 小时前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++
海上小飞龙2 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
青少儿编程课堂3 小时前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
朝朝辞暮i3 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
狗凯之家源码网3 小时前
淘客口令落地页生成器 PHP 版深度评测
开发语言·php
画绛集美术3 小时前
本地化部署LLM用于美术史问答:一间美术教室的实践记录
开发语言·php
八解毒剂3 小时前
【计组】中央处理器CPU
java·开发语言·计算机组成原理
FakeOccupational4 小时前
【电路笔记 信号】DBPSK 波形查找表+脉冲成形(升余弦+根升余弦滤波)
开发语言·笔记
打工仔折腾 AI4 小时前
工业场景下时序库与实时计算一体化架构选型实践对比
java·开发语言·后端·python·性能优化·架构·ai agent 实战