MFC框架界面开发(六):菜单、工具栏及状态栏
2017-10-20 15:51
537 查看
菜单和工具栏的实现都是通过对其相应类(CMenu和CToolBar)的使用来实现的。(VS2010实际上用的是CMFCMenu类和CMFCToolBar类)
自定义菜单的方式有两种:
1. 在原有的菜单上进行增添删除菜单项,以符合自己的要求;
2. 在资源->Menu中插入新的菜单,进行编辑。然后在相应的代码处用新菜单ID替换旧的ID。
a.窗口菜单(单文档):
b.上下文菜单:
ps:还可以自绘菜单,在菜单项上加图标等。通过创建一个自绘菜单类来实现。
此外,菜单栏的停靠等属性的设置与工具栏相似。
ps1:菜单项的消息映射函数可以直接在资源编辑时,右键添加。
ps:工具栏的消息映射函数通过类向导和其ID进行添加。
实战:
1.在资源中的String Table添加一个新的字符串资源:
ID_INDICATOR 101 00:00:00
2.在indicator数组中添加:
3.运行程序后可以看到状态栏多了一项00:00:00,要设置显示系统时间,添加一个定时器(用于定时刷新时间)和OnTimer函数,将获得的系统时间赋值给状态栏的第4个元素即可:
显示:
菜单
菜单分为两类:窗口菜单和上下文菜单。自定义菜单的方式有两种:
1. 在原有的菜单上进行增添删除菜单项,以符合自己的要求;
2. 在资源->Menu中插入新的菜单,进行编辑。然后在相应的代码处用新菜单ID替换旧的ID。
a.窗口菜单(单文档):
BOOL CMenuApp::InitInstance() { ... // 注册应用程序的文档模板。文档模板 // 将用作文档、框架窗口和视图之间的连接 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME,//>>>>>>在这里进行替换,比如IDR_NEWMENU RUNTIME_CLASS(CMenuDoc), RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口 RUNTIME_CLASS(CMenuView)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); ... }
b.上下文菜单:
//1.首先注释掉以下代码,保证原来的弹出菜单失效 void CMenuView::OnRButtonUp(UINT /* nFlags */, CPoint point) { //ClientToScreen(&point); //OnContextMenu(this, point); } //2.添加WM_RBUTTONDOWN的消息映射函数,实现新窗口的加载和弹出 void CMenuView::OnRButtonDown(UINT nFlags, CPoint point) { CMenu menu;//菜单(包括主菜单) CMenu *pSubMenu;//菜单的子菜单,要显示的 menu.LoadMenu(IDR_POPUP_EDIT);//载入编辑好的菜单 pSubMenu=menu.GetSubMenu(0);//获得子菜单的指针 ClientToScreen(&point); //坐标转换 //该函数用于弹出一个菜单 pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x, point.y,this); CView::OnRButtonDown(nFlags, point); }
ps:还可以自绘菜单,在菜单项上加图标等。通过创建一个自绘菜单类来实现。
此外,菜单栏的停靠等属性的设置与工具栏相似。
ps1:菜单项的消息映射函数可以直接在资源编辑时,右键添加。
工具栏
工具栏的创建是在OnCreate函数中完成的:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWndEx::OnCreate(lpCreateStruct) == -1) return -1; ... if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)) { TRACE0("未能创建工具栏\n"); return -1; // 未能创建 } /*去掉一些不必要的东西 CString strToolBarName; bNameValid =strToolBarName.LoadString(IDS_TOOLBAR_STANDARD); ASSERT(bNameValid); m_wndToolBar.SetWindowText(strToolBarName); CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); // 允许用户定义的工具栏操作: InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId); */ // TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行 m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);//启用工具栏停靠 EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_wndMenuBar); DockPane(&m_wndToolBar);//停靠工具栏 ... //注释掉一些其他不必要的代码 return 0; }
ps:工具栏的消息映射函数通过类向导和其ID进行添加。
状态栏
状态栏的创建与菜单栏和工具栏的类似,都是在CMainFrame的OnCreate函数中进行。//创建状态栏 if (!m_wndStatusBar.Create(this)) { TRACE0("未能创建状态栏\n"); return -1; // 未能创建 } //设置要显示的变量,indicators是一个存储变量的结构体 m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));
实战:
1.在资源中的String Table添加一个新的字符串资源:
ID_INDICATOR 101 00:00:00
2.在indicator数组中添加:
static UINT indicators[] = { ID_SEPARATOR, // 状态行指示器 ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, ID_INDICATOR_TIME, //添加项 };
3.运行程序后可以看到状态栏多了一项00:00:00,要设置显示系统时间,添加一个定时器(用于定时刷新时间)和OnTimer函数,将获得的系统时间赋值给状态栏的第4个元素即可:
CTime curTime=CTime::GetCurrentTiem(); CString strTime=curTime.Format(_T"%H:%M:%S"); m_wndStatusBar.SetPaneText(4,strTime);
显示:
相关文章推荐
- Qt界面添加菜单,工具栏以及状态栏
- C++开发人脸性别识别教程(7)——搭建MFC框架之界面绘制
- C++开发人脸性别识别教程(7)——搭建MFC框架之界面绘制
- MFC框架界面开发(一):视图和框架
- MFC之在对话框创建菜单、工具栏、状态栏
- VS2010/MFC编程入门之一(Ribbon界面开发:创建Ribbon样式的应用程序框架)
- MFC菜单、工具栏和状态栏
- VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)
- MFC单文档去掉默认的菜单、工具栏和状态栏
- VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)
- android快速开发框架,集成了底部tab键切换界面、toolbar、沉浸式状态栏、BaseActivity、BaseAdapter、BaseFragment等
- MFC对话框添加工具栏、菜单、状态栏
- MFC对话框添加工具栏、菜单、状态栏
- MFC界面库BCGControlBar v25.1新版亮点三:工具栏和菜单等
- MFC菜单、工具栏、状态栏
- MFC VS2008中的新用户界面 ————菜单栏、工具栏和状态栏
- MFC框架界面开发(三):多文档界面
- MFC框架界面开发(五):基于文档模板架构的软件
- Qt界面添加菜单,工具栏以及状态栏
- MFC框架界面开发(二):框架界面的分隔窗口