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

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("©\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"));

}

相关推荐

【大模型理论篇】GPT系列预训练模型原理讲解
365商城官网

【大模型理论篇】GPT系列预训练模型原理讲解

📅 07-20 👁️ 1648
捺的五笔:RDFI
365充值真人注册

捺的五笔:RDFI

📅 02-11 👁️ 2819
春节日本旅游多少钱
365商城官网

春节日本旅游多少钱

📅 07-29 👁️ 6884