一、添加菜单
点击资源视图->选择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("点击了画线菜单"));
}