MFC开发:菜单的实现

一、添加菜单

点击资源视图->选择Menu,然后添加即可
在这里插入图片描述
在这里插入图片描述

二、修改菜单选项的ID

每个菜单生成后都会有一个ID,这个ID用来标识是哪个菜单。如果想修改菜单的ID,可以右键点击上述的“画线”菜单,然后选择编辑ID(E)。
在这里插入图片描述
修改前:
在这里插入图片描述
修改后:
在这里插入图片描述
在类向导的命令中可以看出已经修改成功了
在这里插入图片描述
接下来就是为这些菜单选项添加消息处理函数,如下所示选择任意一个ID:
在这里插入图片描述
函数定义如下:

BEGIN_MESSAGE_MAP(CChildView, CWnd)
	ON_COMMAND(ID_DRAW_LINE, &CChildView::OnDrawLine)
END_MESSAGE_MAP()

void CChildView::OnDrawLine()
{
	// TODO: 在此添加命令处理程序代码
}

其他的菜单选项可以依次类推去添加消息处理函数。

三、添加菜单的快捷键

在这里插入图片描述
在这里插入图片描述
1.如何使菜单的快捷键生效?
在这里插入图片描述
选择并点击资源视图->Accelerator->IDR_MAINFRAME
在这里插入图片描述
在这里插入图片描述
我们将画线的快捷键添加进去:Ctrl+L
在这里插入图片描述
运行结果显示:
在这里插入图片描述
2.为菜单选项添加状态
在这里插入图片描述

void CChildView::OnUpdateDrawLine(CCmdUI* pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetCheck(true);
	//禁用菜单选项
    //pCmdUI->SetCheck(FALSE);
}

在这里插入图片描述

四、添加工具栏按钮

选择并点击资源视图->Toolbar->IDR_MAINFRAME
在这里插入图片描述
比如为画线功能添加工具按钮,画一条直线:
在这里插入图片描述
工具按钮的ID要与菜单选项的ID保持一致,上述是与画线功能绑定在一起,所以保证ID与画线菜单选项保持一致即可。

五、上下文菜单

上下文菜单,或者称之为“右键菜单”,这种菜单一般是在单击右键时弹出。

新建菜单资源
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ID要与菜单选项的ID保持一致。
在这里插入图片描述

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
{
	// CMenu m_Menu
	m_Menu.LoadMenu(IDR_MENU1);

	return TRUE;
}

void CChildView::OnRButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CMenu* mu = m_Menu.GetSubMenu(0);
	// 客户区坐标转换成屏幕坐标
	ClientToScreen(&point);
	mu->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);

	CWnd::OnRButtonUp(nFlags, point);
}

在这里插入图片描述

六、手写菜单

在这里插入图片描述

  • CWinApp:MFC应用程序抽象,管理Document Template。
  • CFrameWnd:框架窗口,负责创建应用主窗口,含标题栏,菜单栏,工具栏,状态栏等。
  • CView:负责展示应用数据,View其实是一个没有边框的窗口,客户区。
  • CDocument:负责存储应用数据。
  • CDocTemplate:Document Template负责管理MainFrame,View和Document。
enum ID_MSG {
	ID_MSG_DRAW_LINE = WM_USER + 1,
	ID_MSG_DRAW_RECT,
	ID_MSG_DRAW_ELLIPSE,
	ID_MSG_DRAW_PEN
};

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	// 定义菜单对象
	CMenu menu;
	// 创建菜单
	menu.CreateMenu();
	// 创建4个子项,并添加到菜单中去
	menu.AppendMenu(MF_STRING, ID_MSG_DRAW_LINE, _T("画线"));
	menu.AppendMenu(MF_STRING, ID_MSG_DRAW_RECT, _T("画矩形"));
	menu.AppendMenu(MF_STRING, ID_MSG_DRAW_ELLIPSE, _T("画椭圆"));
	menu.AppendMenu(MF_STRING, ID_MSG_DRAW_PEN, _T("画笔"));

	// 得到菜单栏上的菜单
	GetMenu()->AppendMenu(MF_POPUP, (UINT)menu.m_hMenu, _T("绘图"));
	// 分离窗口对象和窗口
	menu.Detach();

	return 0;
}

// 菜单选项ID与执行函数绑定

BEGIN_MESSAGE_MAP(CChildView, CWnd)
	ON_COMMAND(ID_MSG_DRAW_LINE, &CChildView::OnDrawLine)
END_MESSAGE_MAP()

void CChildView::OnDrawLine()
{
	// TODO: 在此添加命令处理程序代码
	MessageBox(_T("点击了画线菜单"));
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值