《第6章 菜单工具栏和状态栏PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第6章 菜单工具栏和状态栏PPT讲稿.ppt(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第6章章 菜单工具栏和状态栏菜单工具栏和状态栏1第1页,共33页,编辑于2022年,星期一第第6章菜单、工具栏和状态栏章菜单、工具栏和状态栏 6.1 菜单菜单 6.2 工具栏工具栏 6.3 状态栏状态栏 2第2页,共33页,编辑于2022年,星期一6.1菜单菜单(1 of 11)对于菜单的显示都遵循下列一些规则:对于菜单的显示都遵循下列一些规则:u若某菜单项标题后有若某菜单项标题后有“”,那么在,那么在点击某菜单项会弹出一对话框。点击某菜单项会弹出一对话框。u若某项菜单有子菜单,那么在该菜单若某项菜单有子菜单,那么在该菜单项文本后有项文本后有“”。u菜单项需要助记符,用括号将带下划菜单项需要
2、助记符,用括号将带下划线的字母括起来。助记符与线的字母括起来。助记符与Alt构成构成一个组合键,当按住一个组合键,当按住“Alt”键不放,键不放,再敲击该字母时,对应的菜单项就会再敲击该字母时,对应的菜单项就会被选中。被选中。u若某项菜单需要快捷键的支持,则一若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。任般将其列在相应菜单项文本之后。任何时候按下快捷键,相应的菜单命令何时候按下快捷键,相应的菜单命令都会被执行。都会被执行。图图6.1 File菜单菜单3第3页,共33页,编辑于2022年,星期一6.1菜单菜单(2 of 11)6.1.1 用用编辑编辑器器设计设计菜菜单单 编辑菜
3、单编辑菜单 在菜单的空位置上双击鼠标左键,则出现它的属性对话框,如图。在菜单的空位置上双击鼠标左键,则出现它的属性对话框,如图。图图6.2 菜单编辑器菜单编辑器菜单的空位置图图6.3 菜单属性对话框菜单属性对话框4第4页,共33页,编辑于2022年,星期一6.1菜单菜单(3 of 11)5第5页,共33页,编辑于2022年,星期一6.1菜单菜单(4 of 11)需要注意的是:需要注意的是:u当菜单项的属性中选中了当菜单项的属性中选中了Pop_up(该菜单包含子菜单该菜单包含子菜单)时,对话框时,对话框中中ID、Separator和和Prompt项无效。项无效。u增加新的菜单项后,用户可以用鼠标
4、将菜单项拖到其他位置,而当增加新的菜单项后,用户可以用鼠标将菜单项拖到其他位置,而当菜单项位置改变时,其属性并不改变。菜单项位置改变时,其属性并不改变。菜单项被拖动的位置图图6.4 拖动菜单项拖动菜单项图图6.5 添加的菜单项添加的菜单项6第6页,共33页,编辑于2022年,星期一6.1菜单菜单(5 of 11)菜单命令的消息映射菜单命令的消息映射 例例Ex_Mmenu“成绩输入成绩输入”菜单项的映射。菜单项的映射。(1)进入进入MFC ClassWizard对话框,切换到对话框,切换到Message Maps页面。页面。(2)从从“Class name”列表中选择列表中选择CMainFram
5、e,在,在IDs列表中选择列表中选择ID_SCORE_IN,然后在,然后在Messages框中选择框中选择COMMAND消息,如图。消息,如图。图图6.6 消息的选择消息的选择7第7页,共33页,编辑于2022年,星期一6.1菜单菜单(6 of 11)(3)单击单击Add Function按钮或双击按钮或双击COMMAND消息,输入成员函数的名消息,输入成员函数的名称。如图称。如图6.7所示。所示。(4)单击单击OK。选择新增加的成员函数,单击。选择新增加的成员函数,单击Edit Code按钮按钮(或直接在或直接在函数名双击鼠标左键函数名双击鼠标左键),就可以在此成员函数中添加一些代码。例如:
6、,就可以在此成员函数中添加一些代码。例如:void CMainFrame:OnScoreIn()/TODO:Add your command handler code hereAfxMessageBox(现在就输入成绩吗?现在就输入成绩吗?);(5)编译并运行。在应用程序的顶层菜单上,单击编译并运行。在应用程序的顶层菜单上,单击“成绩输入成绩输入”菜单项或菜单项或按按Alt+S组合键,如图组合键,如图6.8所示。所示。图图6.7 添加成员函数对话框添加成员函数对话框图图6.8 菜单命令执行的结果菜单命令执行的结果8第8页,共33页,编辑于2022年,星期一6.1菜单菜单(7 of 11)6.1
7、.2 使用键盘快捷键使用键盘快捷键(1)先打开上例的项目工作区窗口中先打开上例的项目工作区窗口中Accelerator的资源项,双击的资源项,双击IDR_MAINFRAME,如图。,如图。图图6.9 示例示例Ex_Sdi的加速键资源的加速键资源最下端的空行9第9页,共33页,编辑于2022年,星期一6.1菜单菜单(8 of 11)(2)要建立一新的加速键,双击加速键列表的最下端的空行,如图要建立一新的加速键,双击加速键列表的最下端的空行,如图6.10,其中可设置的属性如表,其中可设置的属性如表6.2。(3)在上述对话框中,选择在上述对话框中,选择ID_SCORE_IN作为要设定快捷键的作为要设
8、定快捷键的ID号,号,单击单击Next Key Typed,按下,按下Ctrl+1作为此加速键的键值。作为此加速键的键值。图图6.10 “Accel Properities”对话框对话框10第10页,共33页,编辑于2022年,星期一6.1菜单菜单(9 of 11)6.1.3 使用快捷菜单使用快捷菜单右键菜单右键菜单用资源编辑器和用资源编辑器和MFC库的库的CMenu:TrackPopupMenu函数可以创建函数可以创建快捷菜单。快捷菜单。CMenu:TrackPopupMenu函数原型如下:函数原型如下:BOOL TrackPopupMenu(UINT nFlags,int x,int y,
9、CWnd*pWnd,LPCRECT lpRect=NULL);其中:其中:x和y表示菜单顶端(一般为左上角)的水平坐标和垂直坐标。pWnd表示弹出菜单的窗口。lpRect是一个RECT结构或CRect对象指针,表示一个矩形区域,不在该区域单击鼠标时,则弹出菜单消失;当lpRect为NULL时,若击在菜单外面,菜单立刻消失。11第11页,共33页,编辑于2022年,星期一6.1菜单菜单(10 of 11)例例Ex_Menu创建弹出菜单。创建弹出菜单。(1)选择选择“Insert”菜单菜单“Resource”命令,为应用程序添加一个新的菜单命令,为应用程序添加一个新的菜单资源。资源。(2)用菜单编
10、辑器,为该菜单资源中的顶层菜单的第一项加一任意标题用菜单编辑器,为该菜单资源中的顶层菜单的第一项加一任意标题(实实际上该标题无任何作用际上该标题无任何作用),在此菜单项下依次添加如下表所示的菜单项。,在此菜单项下依次添加如下表所示的菜单项。(3)将此菜单资源将此菜单资源ID号改为号改为IDR_MYFLOATMENU(默认的默认的ID号为号为 IDR_MENU1)。(4)按按Ctrl+W快捷键打开快捷键打开ClassWizard,将出现一对话框,询问是,将出现一对话框,询问是“选择一选择一个已存在的类个已存在的类”,还是,还是“创建一个新类创建一个新类”。选择。选择“选择一个已存在的类选择一个已
11、存在的类”项并选定项并选定CMainFrame类类。12第12页,共33页,编辑于2022年,星期一6.1菜单菜单(11 of 11)(5)在在CMainFrame类类中,选择上表中所列的菜单中,选择上表中所列的菜单ID,双击,双击COMMAND消息。这里仅为消息。这里仅为菜单菜单ID_MENU_SCOREIN映射映射COMMAND消息,添加代码:消息,添加代码:void CMainFrame:OnMenuScorein()AfxMessageBox(现在就输入成绩吗?现在就输入成绩吗?);(6)在在CMainFrame类类加入加入WM_CONTEXTMENU消息处理函数,代码如下:消息处理函
12、数,代码如下:void CMainFrame:OnContextMenu(CWnd*pWnd,CPoint point)CMenu menu;menu.LoadMenu(IDR_MYFLOATMENU);menu.GetSubMenu(0)-TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);(7)运行并测试。在应用程序的窗口客户区中单击鼠标右键,弹出如图菜单。运行并测试。在应用程序的窗口客户区中单击鼠标右键,弹出如图菜单。“成绩打印成绩打印”菜单菜单命令没有消息处理函数,因此它是灰显的,用户不能使用它们。若用户
13、选中命令没有消息处理函数,因此它是灰显的,用户不能使用它们。若用户选中“成绩输入成绩输入”菜单命菜单命令,则会执行相应的代码。令,则会执行相应的代码。图图6.13 快捷菜单快捷菜单13第13页,共33页,编辑于2022年,星期一第第6章菜单、工具栏和状态栏章菜单、工具栏和状态栏 6.1 菜单菜单 6.2 工具栏工具栏 6.3 状态栏状态栏 14第14页,共33页,编辑于2022年,星期一6.2工具栏工具栏(1 of 6)6.2.1 使用工具栏编辑器使用工具栏编辑器 例:例:选择选择“File”“Open Workspace”,创建单文档应用程序,创建单文档应用程序Ex_Sdi。在项目工作区窗口
14、中选择。在项目工作区窗口中选择ResourceView标签,双击标签,双击“Toolbar”项中的项中的IDR_MAINFRAME,则工具栏编辑器出现在主,则工具栏编辑器出现在主界面的右边,如图。界面的右边,如图。图图6.14 工具栏编辑器窗口工具栏编辑器窗口空按钮空按钮15第15页,共33页,编辑于2022年,星期一6.2工具栏工具栏(2 of 6)可以对工具栏进行的操作:可以对工具栏进行的操作:(1)创建一个新的工具栏按钮创建一个新的工具栏按钮在新建的工具栏中,最右端总有一个空按钮,双击该按钮弹出其属性在新建的工具栏中,最右端总有一个空按钮,双击该按钮弹出其属性对话框,在对话框,在ID框中
15、输入其标识符名称。单击该按钮,在编辑器的视窗框中输入其标识符名称。单击该按钮,在编辑器的视窗内进行编辑,这个编辑就是绘制一个按钮位图。内进行编辑,这个编辑就是绘制一个按钮位图。(2)移动一个按钮移动一个按钮在工具栏中移动一个按钮,用鼠标左键点中它并拖动至相应位置即可。在工具栏中移动一个按钮,用鼠标左键点中它并拖动至相应位置即可。若在移动一个按钮的同时,按下若在移动一个按钮的同时,按下Ctrl键,则在新位置复制一个按钮。键,则在新位置复制一个按钮。(3)删除一个按钮删除一个按钮如果用户拖动它离开工具栏位置,则此按钮从工具栏中消失如果用户拖动它离开工具栏位置,则此按钮从工具栏中消失(被删除被删除)
16、。但若选中按钮后,单击但若选中按钮后,单击Delete键并不能删除一个按钮,只是将按钮中的键并不能删除一个按钮,只是将按钮中的图形全部以背景色填充。图形全部以背景色填充。16第16页,共33页,编辑于2022年,星期一6.2工具栏工具栏(3 of 6)可以对工具栏进行的操作:可以对工具栏进行的操作:(4)在按钮之间插入在按钮之间插入/删除空格删除空格u如果按钮左侧没有空格,拖动该按钮向右移动并当覆盖相邻按钮的一半以上时,释放鼠标键,则此按钮左侧出现空格。u如果按钮左侧有空格而按钮右侧没有空格,拖动该按钮向左移动并当按钮的左边界接触到前面按钮时,释放鼠标键,则此按钮右侧将出现空格。u如果按钮左、
17、右两侧均有空格,拖动该按钮向右移动并当接触到相邻按钮时,则此按钮左侧的空格保留,按钮右侧的空格消失。相反,拖动该按钮向左移动并当接触到前一个相邻按钮时,则此按钮左侧的空格消失,右侧的空格保留。17第17页,共33页,编辑于2022年,星期一6.2工具栏工具栏(4 of 6)可以对工具栏进行的操作:可以对工具栏进行的操作:(5)设置工具栏按钮的属性设置工具栏按钮的属性双击某工具按钮,就会弹出其属性对话框,如下图所示。双击某工具按钮,就会弹出其属性对话框,如下图所示。图图6.15 工具栏按钮属性对话框工具栏按钮属性对话框18第18页,共33页,编辑于2022年,星期一6.2工具栏工具栏(5 of
18、6)6.2.2 工具栏和菜单相结合工具栏和菜单相结合 例例Ex_T&M 将菜单项将菜单项ID_SCORE_IN与工具按钮相结合。与工具按钮相结合。(1)在单文档应用程序在单文档应用程序Ex_Sid中,作如下操作;中,作如下操作;(2)利用工具栏编辑器设计一个工具按钮,如图;利用工具栏编辑器设计一个工具按钮,如图;(3)双击刚才设计的钮工具按钮图形,弹出该工具按钮的属性对话框;在双击刚才设计的钮工具按钮图形,弹出该工具按钮的属性对话框;在属性对话框中,将工具按钮的属性对话框中,将工具按钮的ID号设为号设为ID_SCORE_IN,在,在Prompt框内框内键入键入“向系统输入学生成绩向系统输入学生
19、成绩n成绩输入成绩输入”;图图6.16 工具栏按钮的设计工具栏按钮的设计19第19页,共33页,编辑于2022年,星期一6.2工具栏工具栏(6 of 6)6.2.2 工具栏和菜单相结合工具栏和菜单相结合 例例Ex_T&M 将菜单项将菜单项ID_SCORE_IN与工具按钮相结合。与工具按钮相结合。(4)编译并运行程序。在应用程序的工具栏上,将鼠标指针移至刚才设编译并运行程序。在应用程序的工具栏上,将鼠标指针移至刚才设计的工具按钮处,这时在状态栏上显示出计的工具按钮处,这时在状态栏上显示出“向系统输入学生成绩向系统输入学生成绩”信息,信息,若稍等片刻后,还会弹出提示小窗口,显示出若稍等片刻后,还会
20、弹出提示小窗口,显示出“成绩输入成绩输入”字样。字样。20第20页,共33页,编辑于2022年,星期一第第6章菜单、工具栏和状态栏章菜单、工具栏和状态栏 6.1 菜单菜单 6.2 工具栏工具栏 6.3 状态栏状态栏 21第21页,共33页,编辑于2022年,星期一6.3状态栏状态栏(1 of 9)6.3.1 状态栏的定义状态栏的定义 用用AppWizard创建的创建的SDI或或MDI应用程序框架中,有一个静态应用程序框架中,有一个静态的的indicators数组,这个数组中的元素通常都是一些数组,这个数组中的元素通常都是一些字符串资源字符串资源的的ID号号,它是在,它是在MainFrm.cpp
21、文件中被定义的,被文件中被定义的,被MFC用作用作状态栏的定义。状态栏的定义。默认的默认的indicators数组包含数组包含4个元素,如下图所示:个元素,如下图所示:Static UINT indicators=ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,图图6.17 indicators数组的定义数组的定义22第22页,共33页,编辑于2022年,星期一6.3状态栏状态栏(2 of 9)6.3.2 状态栏的常用操作状态栏的常用操作增加和减少窗格增加和减少窗格状态栏中的窗格可以分为状态栏中的窗格可以分为信
22、息行窗格信息行窗格和和指示器窗格指示器窗格两类。两类。l若在状态栏中增加一个信息行窗格,则在indicators数组中的适当位置中增加一个ID_SEPARATOR标识即可;l若在状态栏中增加一个指示器窗格,则在indicators数组中的适当位置增加一个在字符串资源中定义过的资源ID号即可;l若在状态栏中减少一个信息行或者指示器窗格,其操作与增加类似,只需减少一个对应的数组元素即可。23第23页,共33页,编辑于2022年,星期一6.3状态栏状态栏(3 of 9)6.3.2 状态栏的常用操作状态栏的常用操作在状态栏上显示文本在状态栏上显示文本有三种办法可以在状态栏窗格显示文本信息:有三种办法可
23、以在状态栏窗格显示文本信息:n(1)调用CWnd:SetWindowText更新信息行窗格(或窗格0)中的文本。l若状态栏变量为m_wndStatusBar,则m_wndStatusBar.SetWindowText(“消息”)语句将在第一个信息行窗格内显示“消息”字样。24第24页,共33页,编辑于2022年,星期一6.3状态栏状态栏(3 of 9)6.3.2 状态栏的常用操作状态栏的常用操作在状态栏上显示文本在状态栏上显示文本有三种办法可以在状态栏窗格显示文本信息:有三种办法可以在状态栏窗格显示文本信息:n(2)手动处理状态栏的ON_UPDATE_COMMAND_UI更新消息,并在处理函数
24、中调用CCmdUI:SetText函数。25第25页,共33页,编辑于2022年,星期一6.3状态栏状态栏(3 of 9)6.3.2 状态栏的常用操作状态栏的常用操作在状态栏上显示文本在状态栏上显示文本有三种办法可以在状态栏窗格显示文本信息:有三种办法可以在状态栏窗格显示文本信息:n(3)调用CStatusBar:SetPaneText函数更新任何窗格(包括信息行窗格)中的文本。此函数原型描述如下:BOOL SetPaneText(int nIndex,LPCTSTR lpszNewText,BOOL bUpdate=TRUE);其中:nIndex表示设置的窗格的索引(第一个窗格的索引为0);
25、lpszNewText表示要显示的字符串;bUpdate为TRUE表示系统自动更新显示的结果。26第26页,共33页,编辑于2022年,星期一6.3状态栏状态栏(4 of 9)例例Ex_Status 在状态栏的最右边两个窗格中显示出当前鼠标在在状态栏的最右边两个窗格中显示出当前鼠标在窗口客户区的位置。窗口客户区的位置。(1)将前面的单文档应用程序将前面的单文档应用程序Ex_Sdi打开或者新建一个单文档应用程打开或者新建一个单文档应用程序;序;(2)将项目工作区窗口切换到将项目工作区窗口切换到ResourceView页面,双击页面,双击“String Table”项的项的“String Tabl
26、e”图标。在字符串列表的最后一行空项上图标。在字符串列表的最后一行空项上双击鼠标左键,如图双击鼠标左键,如图6.17所示。所示。(3)该对话框中,可以指定相应的该对话框中,可以指定相应的ID和字符串值,这里加入两个字符串和字符串值,这里加入两个字符串资源资源ID_LEFT和和ID_RIGHT,其字符个数的多少决定窗格的大小。,其字符个数的多少决定窗格的大小。如图如图6.18。图图6.17 字符串属性对话框字符串属性对话框添加的字添加的字符串符串图图6.18 添加的字符串资源添加的字符串资源27第27页,共33页,编辑于2022年,星期一6.3状态栏状态栏(5 of 9)(4)打开打开MainF
27、rm.cpp文件,将原先的文件,将原先的indicators数组数组修改修改如下:如下:static UINT indicators=ID_SEPARATOR,/第一个信息行窗格第一个信息行窗格ID_SEPARATOR,/第二个信息行窗格第二个信息行窗格ID_LEFT,/第三个窗格第三个窗格ID_RIGHT,/第四个窗格第四个窗格;(5)必须必须手动手动添加消息处理函数原型添加消息处理函数原型。打开。打开Ex_SdiView.h文件,在文件,在AFX_MSG内增加消息处理语句,内增加消息处理语句,ClassWizard以后允许访问和编辑以后允许访问和编辑该代码。该代码。protected:/A
28、FX_MSG(CEx_SdiView)afx_msg void OnUpdateXY(CCmdUI*pCmdUI);/AFX_MSGDECLARE_MESSAGE_MAP()28第28页,共33页,编辑于2022年,星期一6.3状态栏状态栏(6 of 9)(6)打开打开Ex_SdiView.cpp文件,在其消息入口处文件,在其消息入口处手动手动添加消息映射添加消息映射函数函数:BEGIN_MESSAGE_MAP(CEx_SdiView,CView)/AFX_MSG_MAP(CEx_SdiView)ON_UPDATE_COMMAND_UI(ID_LEFT,OnUpdateXY)ON_UPDATE
29、_COMMAND_UI(ID_RIGHT,OnUpdateXY)/AFX_MSG_MAP29第29页,共33页,编辑于2022年,星期一6.3状态栏状态栏(7 of 9)(7)增加修改状态栏指示器的增加修改状态栏指示器的消息映射函数代码消息映射函数代码,状态栏的窗格需,状态栏的窗格需要更新时,应用程序框架自动调用此函数。要更新时,应用程序框架自动调用此函数。void CEx_SdiView:OnUpdateXY(CCmdUI*pCmdUI)pCmdUI-Enable(TRUE);/使窗格文本能被更新使窗格文本能被更新 30第30页,共33页,编辑于2022年,星期一6.3状态栏状态栏(8 of
30、 9)(8)用用ClassWizard在在CEx_SdiView类中加入类中加入WM_MOUSEMOVE(鼠标移动鼠标移动)消息处理函数,并添加下列代码。该函数先获得状态栏对象的指针,然消息处理函数,并添加下列代码。该函数先获得状态栏对象的指针,然后后调用调用SetPaneText函数更新第三和第四窗格中的文本函数更新第三和第四窗格中的文本。void CEx_SdiView:OnMouseMove(UINT nFlags,CPoint point)CString str;CMainFrame*pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;CStatusB
31、ar*pStatus=&pFrame-m_wndStatusBar;if(pStatus)str.Format(X=%d,point.x);/格式化文本格式化文本pStatus-SetPaneText(2,str);str.Format(Y=%d,point.y);pStatus-SetPaneText(3,str);CView:OnMouseMove(nFlags,point);31第31页,共33页,编辑于2022年,星期一6.3状态栏状态栏(9 of 9)(9)将将MainFrm.h文件中的受保护变量文件中的受保护变量m_wndStatusBar变成变成公有变量。公有变量。(10)在在Ex_SdiView.cpp文件的开始处增加下列语句:文件的开始处增加下列语句:#include“MainFrm.h”(11)编译并运行,如图。编译并运行,如图。图图6.19 鼠标的位置显示在状态栏上鼠标的位置显示在状态栏上32第32页,共33页,编辑于2022年,星期一第第6章菜单、工具栏和状态栏章菜单、工具栏和状态栏 6.1 菜单菜单 6.2 工具栏工具栏 6.3 状态栏状态栏 33第33页,共33页,编辑于2022年,星期一