版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章菜单、工具栏与状态栏
主要内容4.1菜单4.2工具栏4.3状态栏4.4应用实例4.1菜单4.1.1菜单的类型
常见菜单有3种:主菜单、弹出菜单和快捷菜单。1.主菜单
指出现在应用程序主窗口或最上层窗口的菜单。通常对应有一个弹出菜单作为它的子菜单。2.弹出菜单指选择主菜单或一个菜单项时弹出的子菜单。3.快捷菜单
当右击某个界面对象时,通常会弹出快捷菜单,它出现在鼠标箭头的位置,快速展示当前对象可用的命令功能。菜单设计一般需要经过下面三步:(1)使用菜单编辑器编辑菜单资源,设置菜单属性(包括菜单名和ID);(2)使用ClassWizard进行消息映射(3)编辑成员函数,完成菜单所要实现的功能。4.1.2编辑菜单
使用菜单编辑器来编辑菜单资源。双击ResourceView视图中的Menu菜单资源,打开菜单编辑器。1.插入新菜单项在当前空白菜单项位置插入选定窗口中的空白菜单项后按回车键(或双击空白菜单项),系统弹出菜单属性对话框。在某菜单项前插入选中该菜单项并按Ins键,再双击该空白菜单项进行编辑。2.属性对话框的设置
用于输入菜单项的标识符(ID)、标题(Caption)和菜单项在状态栏上显示的提示(Prompt)信息等。菜单项的标识符(ID)菜单项在状态栏上显示的提示信息标题3.调整菜单项位置
选中某菜单项将其拖至适当位置。4.删除菜单项
用鼠标单击菜单项或用上、下、左、右光标键选择菜单项,然后单击Cut按钮或按Del键删除。【例4.1】编写一个单文档应用程序MyDraw,在菜单栏中增加一个“绘图”主菜单,并在其中添加“矩形”和“椭圆”两个菜单项。绘图菜单:绘图(D)/弹出式子菜单/子菜单间添加分割线(1)矩形ID号:IDM_RECTANGLE
快捷方式:Ctrl+R(2)椭圆ID号:
IDM_ELLIPSE
快捷方式:
Ctrl+L提示如果菜单中要使用中文,则除了在菜单名一项中输入中文外,还要将菜单资源的语言属性设置为中文。方法是:鼠标右键单击资源视图的菜单资源IDR_MAINFRAME选择Properties在Languages下拉列表框中选择Chinese(P.R.C.)。4.1.3建立消息映射
在上例中仅添加了菜单,并没有实现菜单的功能,即没有对应的命令处理函数与菜单项对应,因此,添加的菜单项是灰色的,即处于当前不可用状态。添加新的菜单项后,还应该为菜单项指定一个处理函数,即利用ClassWizard类向导添加一个消息处理函数。【例4.2】为例4.1中增加的菜单项添加消息处理函数。voidCLi4_1View::OnRectangle(){
//TODO:Addyourcommandhandlercodehere
CClientDCdc(this); dc.Rectangle(10,10,200,100);}voidCLi4_1View::OnEllipse(){
//TODO:Addyourcommandhandlercodehere
CClientDCdc(this); dc.Ellipse(250,100,450,250);}菜单命令的路由菜单命令响应顺序为:视图类、文档类、框架类、应用程序类消息路由框架类接收消息,转给子窗口(即视图类)视图类命令消息机制处理,若无,转文档类。文档类命令消息机制处理,若无,转还视图类,视图类转还框架类处理。框架类命令消息机制处理,若无,转还应用程序类。基本菜单操作2002012022031230012访问菜单项:ID或位置索引访问子菜单:仅索引号访问基本菜单操作获取菜单栏CMenu*GetMenu()获取子菜单CMenu*GetSubMenu(intnPos)添加移除标记UINTCheckMenuItem(UINTnIDCheckItem,UINTnCheck)示例intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){……
GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);return0;}替换为GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);4.1.4菜单的有效控制
一般情况下,菜单项都不止一种状态。
例如,在没有选择任何内容时,Edit菜单下的Copy、Cut等菜单项是无效的(灰色显示)。有时,我们还会看到,在菜单项旁边可能还会有检查标记,表示它是选中的还是不选中的。比如,在Word的视图菜单项下,当用户选用【网格线】或【标尺】时,相应菜单项前会出现一个“√”。
MFC通过消息映射机制和CCmdUI类更新菜单项的显示。在类向导ClassWizard的MessageMap标签中,如果选择一个菜单ID,在Messages列表框中就会出现以下两项:
COMMANDUPDATE_COMMAND_UI
其中UPDATE_COMMAND_UI是更新命令用户接口消息,专门用于处理菜单项和工具条按钮的更新。框架向处理函数发送更新命令时,传递给处理函数一个指向CCmdUI对象的指针。利用指向CCmdUI对象的指针调用菜单或工具栏的命令接口函数来更新用户接口对象。CCmdUI对象菜单项工具按钮成员函数功能Enable()设置菜单项是否有效SetCheck()增加或清除“√”标记SetRadio()增加或清除圆点标记SetText()改变菜单显示文本【例4.3】为例4.2的程序MyDraw添加更新用户界面的消息处理函数,使程序启动时菜单项【椭圆】处于不可用状态,当用户单击【矩形】菜单项后,在菜单项前显示“√”标记,并使【椭圆】菜单项变为可用。设计思路:1、设置标记“椭圆”菜单是否有效m_enable“√”标记在“矩形”菜单中是否显示m_checkr“√”标记在“椭圆”菜单中是否显示m_checke2、“响应”的过程“矩形”菜单响应:“椭圆”菜单有效、“矩形”菜单加“√”标记,“椭圆”菜单不加“√”标记。“椭圆”菜单响应:“椭圆”菜单加“√”标记,矩形菜单不加“√”标记。3、“更新响应”的过程“矩形”菜单设置标记“椭圆”菜单设置标记,并且设置菜单有效性1、设置标记(bool)m_enablem_checkrm_checkeCTempView::CTempView(){
//TODO:addconstructioncodehere m_checke=false;m_checkr=false; m_enable=false;}2、“响应”的过程voidCLi4_1View::OnRectangle(){
//TODO:Addyourcommandhandlercodehere
m_enable=true; m_checkr=true; m_checke=false;
CClientDCdc(this); dc.Rectangle(10,10,200,100);}voidCLi4_1View::OnEllipse(){
//TODO:Addyourcommandhandlercodehere
m_checke=true; m_checkr=false;
CClientDCdc(this); dc.Ellipse(250,100,450,250);}3、“更新响应”的过程voidCLi4_1View::OnUpdateRectangle(CCmdUI*pCmdUI){//TODO:AddyourcommandupdateUIhandlercodehere
pCmdUI->SetCheck(m_checkr);
}voidCLi4_1View::OnUpdateEllipse(CCmdUI*pCmdUI){//TODO:AddyourcommandupdateUIhandlercodehere
pCmdUI->SetCheck(m_checke); pCmdUI->Enable(m_enable);
}4.1.5快捷菜单
为应用程序创建快捷菜单主要有以下两种方法。1.使用ComponentGallery创建快捷菜单
ComponentGallery(组件画廊)是一个组件库,它保存着可以共享或重用的代码。这些代码包括由VisualC++自带的组件和从用户工程中增加到Gallery中去的用户自定义组件。操作步骤:选择组件建立关联【例4.4】为例4.3中的应用程序MyDraw增加一个快捷菜单。程序运行后,用户在视图窗口中右击,弹出一个快捷菜单,显示主菜单“绘图”下的所有菜单项。快捷菜单2.使用TrackPopupMenu()函数创建快捷菜单
使用菜单资源编辑器和CMenu::TrackPopupMenu()函数来创建右键快捷菜单。CMenu::TrackPopupMenu函数的原型为:
BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);
屏幕位置标志矩形域菜单坐标弹出的窗口参数nflags的含义
【例4.5】使用TrackPopupMenu()函数创建例4.3中的快捷菜单。操作步骤:创建新菜单建立关联WM_CONTEXTMENU消息处理
加载菜单获取子菜单获取父窗口指针显示菜单
CMenu类的成员函数较多,但建立弹出式菜单只需用到其中几个成员函数。
1、LoadMenu函数BOOLLoadMenu(UINTnIDResource);其中nIDResource是菜单资源的ID号。2、GetSubMenu函数
CMenu*GetSubMenu(intnPos)const;用于得到子菜单的指针,nPos为层数,0为第一层子菜单……以此类推。voidCLi4_1View::OnContextMenu(CWnd*pWnd,CPointpoint){
//TODO:AddyourmessagehandlercodehereCMenumenu,*pPopup;
menu.LoadMenu(IDR_POP);//加载菜单pPopup=menu.GetSubMenu(0);//获取子菜单CWnd*pWndPopupOwner=this;pWndPopupOwner=pWndPopupOwner->GetParent();//返回父窗口
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,pWndPopupOwner);
}4.1.6创建动态菜单动态创建菜单分为以下3个步骤。CMenu::CreateMenu
//创建菜单CMenu::AppendMenu
//追加或插入菜单CMenu::InsertMenuCMenu::Detach
//创建菜单
intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){……
CMenumenu;
menu.CreateMenu();// GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"Test");
GetMenu()->InsertMenu(2,MF_POPUP|MF_BYPOSITION,(UINT)menu.m_hMenu,"Test");
menu.AppendMenu(MF_STRING,111,"where"); menu.AppendMenu(MF_STRING,112,"who"); menu.AppendMenu(MF_STRING,113,"whitch");menu.Detach();
return0;}【例4.6】为例4.4中的应用程序MyDraw创建一个【画笔】动态菜单。程序运行后,用户单击【绘图|矩形】菜单项,在主菜单中添加动态菜单【画笔】,并通过此菜单的子菜单项画一个红色矩形。voidCMenuView::OnRectangle(){
//TODO:Addyourcommandhandlercodehere CClientDCdc(this); dc.Rectangle(50,50,100,200); CMenumenu,*pmenu;
//创建新菜单
menu.CreateMenu();
//获取主窗口指针
CWnd*pMainFrame=AfxGetMainWnd();
//获取主菜单指针
pmenu=pMainFrame->GetMenu();
//主菜单中创建动态菜单
pmenu->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"画笔(&P)");
//动态菜单中创建菜单项
menu.AppendMenu(MF_STRING,WM_USER+1,"红色矩形"); menu.Detach();
//重新显示菜单
pMainFrame->SetMenu(pmenu);
}4.1.6创建动态菜单动态创建菜单分为以下3个步骤。(1)
利用CreateMenu()函数创建一个空的弹出式菜单,该函数的原型为:
HMENUCreateMenu()
该函数没有参数,它的返回值是一个菜单句柄。(2)调用AppendMenu()或InsertMenu()函数在菜单中加入菜单项。MF_POPUP:指定菜单打开一个下拉式菜单或子菜单。参数uIDNewltem下拉式菜单或子菜单的句柄。MF_STRING:指定菜单项是一个正文字符串;参数lpNewltem指向该字符串。
AppendMenu(HMENUhMenu,//将修改的菜单句柄UINTuFlags,//新菜单属性标志UINT_PTRuIDNewItem,//新菜单句柄LPCTSTRlpNewItem//新菜单的内容);(3)调用函数SetMenu()加载动态菜单。BOOLSetMenu(HWNDhwnd,//窗口句柄HMENUhmenu//菜单句柄);voidCLi4_1View::OnRectangle(){//TODO:Addyourcommandhandlercodehere …… CClientDCdc(this); dc.Rectangle(10,10,200,100);
HMENUhmenu,hPopmenu;//菜单句柄
CWnd*pMainFrame=AfxGetMainWnd();//获取窗口指针 CMenu*pTopMenu=pMainFrame->GetMenu();//获取主菜单指针 hmenu=pTopMenu->m_hMenu;//获取主菜单句柄
//创建菜单
hPopmenu=CreateMenu();
//主菜单下添加动态菜单,为弹出式菜单,名称为“画笔”
AppendMenu(hmenu,MF_POPUP,UINT(hPopmenu),"画笔(&P)");//“画笔”菜单下添加“红色矩形”菜单
AppendMenu(hPopmenu,MF_STRING,WM_USER+1,"红色矩形"); pMainFrame->SetMenu(pTopMenu);}动态菜单若要响应动态菜单的消息,需要重载OnCmdMsg消息。BOOLCLi4_1View::OnCmdMsg(UINTnID,intnCode,void*pExtra,AFX_CMDHANDLERINFO*pHandlerInfo){
//TODO:Addyourspecializedcodehereand/orcallthebaseclass
if(nID==(UINT)(WM_USER+1)) {
if(nCode==CN_COMMAND)
DoSelectMenu();
else
if(nCode==CN_UPDATE_COMMAND_UI)
DoUpdateSelectMenu((CCmdUI*)pExtra);
returntrue; }
returnCView::OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);}voidCLi4_1View::DoSelectMenu(){ CPenNewPen,*OldPen; CClientDCdc(this); NewPen.CreatePen(PS_SOLID,2,RGB(255,0,0)); OldPen=dc.SelectObject(&NewPen); dc.Rectangle(100,100,350,200); dc.SelectObject(OldPen);}voidCLi4_1View::DoUpdateSelectMenu(CCmdUI*pCmdUI){ pCmdUI->Enable(true);}4.1.7创建基于对话框的菜单
从第2章可知,利用MFCAppWizard[exe]向导工具可以生成基于对话框的应用程序。
基于对话框的应用程序在运行时并没有菜单栏。下面我们通过实例来讨论如何给它创建一个菜单。
【例4.7】编写一个基于对话框的应用程序Li4_7,为该应用程序添加一个菜单。菜单包括【文件】、【编辑】、【视图】和【帮助】4个主菜单项。操作步骤:创建新菜单建立关联工具栏工具栏:常用的菜单命令以按钮的形式,提供给用户使用。工具栏可以方便用户操作。4.2.1编辑工具栏
使用工具栏编辑器来编辑工具栏资源。双击ResourceView视图中的Toolbar工具栏资源,即可打开工具栏编辑器。1.添加按钮
双击工具条上的空白按钮或单击空白按钮后,选择【View|Properties】菜单项,弹出如图所示的ToolbarButtonProperties属性对话框,在此对话框中编辑按钮的标识符、宽度与高度值。2.删除按钮
将按钮拖出工具栏外,即可删除该按钮。3.编辑按钮位图设置按钮位图有以下两种方法。l
利用绘图工具与调色板直接进行绘制l
先利用专用绘图软件制作,然后粘贴到按钮上4.2.2建立消息映射
通常,只需让一个按钮的ID值与同样功能菜单项的ID值相同即可。
如果按钮没有对应菜单项,则必须利用ClassWizard类向导添加一个消息处理函数。【例4.8】编写一个单文档应用程序Li4_8。删除默认工具栏上的【打印设置】按钮,并在【帮助】按钮前添加【上一页】和【下一页】2个按钮,当用户单击这两个按钮后,视图中分别显示文本“这是《上一页》按钮!”和“这是《下一页》按钮!”。
工具类的继承关系
在MFC中,状态栏的功能由CToolBar类实现。4.2工具栏
在MFC中,工具栏的功能由类CToolBar实现。工具栏资源和工具栏类CToolBar是工具栏的两个要素。创建工具栏的基本步骤是:
创建工具栏资源;
构建一个CToolBar对象;
调用CToolBar::Create()或CreateEx()函数创建工具栏窗口;
调用CToolBar::LoadToolBar载入工具栏资源。工具栏停靠//工具栏对象可以停靠m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);//主框架窗口可以被停靠EnableDocking(CBRS_ALIGN_ANY);//停靠在主窗口框架DockControlBar(&m_wndToolBar);4.2.3自定义工具栏的操作
向导生成的标准工具栏的ID值为IDR_MAINFRAME。对一些功能复杂的应用程序,需要创建多个不同的工具栏。生成工具栏的基本步骤:
(1)添加工具栏资源;
(2)参照MFC应用程序框架添加工具栏的方法,构造一个CToolBar类的对象,调用CToolBar::Create()或CreateEx()函数创建工具栏窗口;
(3)调用CToolBar::LoadToolBar()函数载入工具栏资源。
除这些基本步骤之外,还可以调用其他相关函数从而进一步改善工具栏。1.创建工具栏窗口
调用CToolBar::Create()或CreateEx()函数创建并初始化工具栏窗口对象。若创建成功,函数返回TRUE,否则返回FALSE。2.装载工具栏资源
调用LoadToolBar()函数装载工具栏资源。用Create()或者CreateEx()函数创建工具栏,其实只是获得了一个窗口句柄,工具栏窗口中位图按钮的加载是靠LoadToolBar()函数来完成的。若加载成功,将返回TRUE,否则返回FALSE。3.设置工具栏风格
如果在调用初始化函数CToolBar::Create()或者CreateEx()时设置的工具栏风格不满足需要,可以再用SetBarStyle()函数重新进行设置。4.设置工具栏停靠特性
设置工具栏停靠特性,需要调用EnableDocking()函数。既要调用CControlBar::EnableDocking()函数设置工具栏的停靠特性,还要调用框架类的成员函数EnableDocking()函数来设置框架窗口以允许它的子窗口控制栏可以以何种方式停靠。不管一个框架窗口中有多少个子窗口控制栏,该函数只需调用一次。5.设置工具栏的初始停靠位置
通过调用CFrameWnd::DockControlBar()函数定位一个工具栏的初始停靠位置。6.移动工具栏
调用CFrameWnd::FloatControlBar()函数来移动、定位一个工具栏。7.工具栏隐显控制
通过对函数CWnd::SetStyle()的调用可以改变某些工具栏窗口的风格,但该函数不能改变WS_VISIBLE,只能通过父类CWnd的ShowWindow()成员函数来显示或隐藏工具栏。
【例4.9】编写一个单文档应用程序Li4_9。为该应用程序创建一个带有“线”、“圆”、“矩形”和“文本”4个按钮的工具栏,当用户单击工具栏上的按钮时,在窗口中显示相应的图形。工具栏的显示与隐藏方法一:父类CWnd的ShowWindow()成员函数来显示或隐藏工具栏。
“查看”中新建一个菜单及处理函数。IsWindowVisible()判断窗口是否可视。ShowWindow(SW_HIDE)ShowWindow(SW_SHOW)CFrameWnd的RecalcLayout()控制布局DockControlBar(&m_myToolBar)重新停靠工具栏的显示与隐藏方法二:父类CFrameWnd的ShowControlBar()成员函数来显示或隐藏工具栏。
“查看”中新建一个菜单及处理函数。ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),false);4.3状态栏
状态栏实际上是一个窗口,一般分为几个窗格,每个窗格显示不同的信息。使用AppWizard创建的单文档应用程序,接受默认选项时,生成的应用程序自动创建带有默认窗格的状态栏。
4.3.1状态栏类的继承关系
在MFC中,状态栏的功能由CStatusBar类实现。
4.3.2状态栏类的成员函数
4.3.3状态栏操作利用MFCAppWizard向导创建应用程序时,首先在C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钢结构施工协调会议方案
- 2026长春光机所春季招聘334人备考题库含答案详解(达标题)
- 2026年古镇游览合同导游服务协议
- 2026贵州峰鑫建设投资(集团)有限公司招聘演艺人员2人备考题库及完整答案详解一套
- 2026湖北宜昌市“招才兴业”教育系统事业单位校园专项招聘7人备考题库(三峡大学站)及完整答案详解【考点梳理】
- 工程项目人员管理信息化方案
- 2026福建漳州市龙文区教育局招聘43人备考题库【有一套】附答案详解
- 2026广东省清远市连南瑶族自治县带编赴高校及三甲医院专项招聘医疗卫生人才22人备考题库附答案详解【培优】
- 2026辽宁铁岭市昌图县14家单位补充招聘公益性岗位人员23人备考题库及参考答案详解【考试直接用】
- 2026江西省人力资源有限公司招聘生产服务一线人员16人备考题库学生专用附答案详解
- 劳资专员述职报告
- 手部伤害工厂安全培训课件
- 物流交付环节管理办法
- 2025年消防党组织谈心谈话记录范文
- 基于PLC的立体仓库堆垛机智能控制系统设计
- 五小活动成果汇报
- DB61∕T 1916-2024 土石山区土地整治技术规程
- 2025年【大型双选会】中国恩菲工程技术有限公司春季校园招聘30人笔试历年参考题库附带答案详解
- 《互联网营销师(直播销售员)五级(初级)理论知识考核要素细目表》
- 内衣店新员工入职培训
- 电网检修培训课件下载
评论
0/150
提交评论