工具栏和状态栏.ppt
《工具栏和状态栏.ppt》由会员分享,可在线阅读,更多相关《工具栏和状态栏.ppt(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、工具栏和状态栏 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望4.1菜单菜单 菜单是一系列命令的列表,通过选中其中的菜单项(命令)来执行相应任务。除一些简单的基于对话框的应用程序外,所有的Windows应用程序都提供了各自的菜单。为了使应用程序更容易操作,对于菜单系统的设计还遵循下列一些规则:若单击某菜单项后,将弹出一个对话框,那么在该菜单项文本后有“”。若某项菜单有子菜单,那么在该菜单项文本后有“”。若菜单项需要助记符,则用括号将带下划线的字母括起来。助记符与A
2、lt构成一个组合键,当按住“Alt”键不放,再敲击该字母时,对应的菜单项就会被选中。若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。所谓“快捷键”是一个组合键,如Ctrl+N,使用时是先按下“Ctrl”健不放,然后再按“N”键。任何时候按下快捷键,相应的菜单命令都会被执行。图4.1是一个菜单样例,注意它们的规则含义。需要说明的是,在常见的菜单系统中,最上面的一层水平排列的菜单称为顶层菜单顶层菜单,每一个顶层菜单项可以是一个简单的菜单命令,也可以是下拉下拉(Popup)菜单,在下拉菜单中的每一个菜单项也可是菜单命令或下拉菜单,这样一级一级下去可以构造出复杂的菜单系统。4.1菜单菜单
3、顶层菜单顶层菜单下拉菜单下拉菜单图图4.1 菜单样例菜单样例4.1菜单菜单 4.1.1 用编辑器设计菜单 1.编辑菜单编辑菜单 (1)在顶层菜单的最后一项,Visual C+自动留出了一个空位置,用来输入新的顶层菜单项。在菜单的空位置上双击鼠标左键,出现菜单项的属性对话框,在标题框中输入“测试(&T)”,结果如图4.2所示,其中符号&用来将其后面的字符作为该菜单项的助记符,这样当按住“Alt”键不放,再敲击该助记符键时,对应的菜单项就会被选中,或在菜单打开时,直接按相应的助记符键,对应的菜单项也会被选中。子菜单的空位置子菜单的空位置顶层菜单的空位顶层菜单的空位置置图图4.2 Ex_SDI菜单资
4、源菜单资源4.1菜单菜单 需要说明的是,Visual C+将顶层菜单项的默认属性定义为“弹出”(下拉)菜单,即该菜单项有下拉式子菜单。一个含有下拉子菜单的菜单项是不需要相应的ID标识符。同时,“弹出”菜单项的属性对话框中,ID、分隔符(Separator)和提示(Prompt)项无效。表4.1列出菜单属性对话框“常规”(General)的各项含义。表表4.1 菜单菜单General属性对话框的各项含义属性对话框的各项含义项项 目目含含 义义ID菜单的资源ID标识符标题(Caption)用来标识菜单项显示文本。助记符字母的前面须有一个&符号,这个字母与Alt构成组合键。分隔符(Separator
5、)选中时,菜单项是一个分隔符或是一条水平线已复选(Checked)选中时,菜单项文本前显示一个选中标记弹出(Pop_up)选中时,菜单项含有一个弹出式子菜单已变灰(Grayed)选中时,菜单项显示是灰色的,用户不能选用非活动(Inactive)选中时,菜单项没有被激活,用户不能选用帮助(Help)选中时,菜单项在程序运行时被放在顶层菜单的最右端中断(Break,分块)当为“列”(Column)时,对于顶层菜单上的菜单项来说,被放置在另外一行上,而对于弹出式子菜单的菜单项来说,则被放置在另外一列上;当为“条”(Bar)时,与Column相同,只不过对于弹出式子菜单来说,它还在新列与原来的列之间增
6、加一条竖直线;注意这些效果只能在程序运行后才能看到。提示(Prompt)用来指明光标移至该菜单项时在状态栏上显示的提示信息4.1菜单菜单 (2)单击“测试”菜单项下方的空位置,在菜单项属性对话框中,输入标题“切换菜单(&D)”,在ID框输入该菜单项的资源标识符:ID_TEST_CHANGE,结果如图4.3所示。图图4.3 修改菜单项属性修改菜单项属性 (3)关闭菜单项属性对话框,单击“测试”菜单项并按住鼠标左键不放,移动鼠标,将“测试”菜单项移到“查看”和“帮助”菜单项之间,然后释放鼠标。结果如图4.4所示。这样,就将新添加的“测试”菜单项拖放到“查看”和“帮助”菜单项之间了。需要说明的是,菜
7、单项位置改变后,其属性并没改变。图图4.4 菜单项菜单项“测试测试”拖放后的位置拖放后的位置4.1菜单菜单2.菜单命令的消息映射菜单命令的消息映射 菜单项、工具栏的按钮以及快捷键等用户交互对象都能产生WM_COMMAND命令消息。命令消息能够被文档类、应用类、窗口类以及视图类等多种对象接收、处理,且用户可以用ClassWizard对命令消息进行映射。例如,上述的“切换菜单”菜单项的命令映射过程如下:(1)选择“查看”“建立类向导”菜单命令或按Ctrl+W快捷键,则出现MFC ClassWizard对话框,并自动切换到Message Maps页面。(2)从“Class name”列表中选择CMa
8、inFrame,在IDs列表中选择ID_TEST_CHANGE,然后在Messages框中选择COMMAND消息。单击Add Function按钮或双击COMMAND消息,出现“Add Member Function”对话框以输入成员函数的名称。系统默认的函数名为OnTestChange,如图4.5所示。该函数是对菜单项ID_TEST_CHANGE的映射,也就是说,当应用程序运行后,用户选择“测试”“切换菜单”菜单时,该函数OnTestChange被调用,执行函数中的代码。4.1菜单菜单图图4.5 菜单命令消息的映射菜单命令消息的映射4.1菜单菜单 (3)单击OK按钮,在ClassWizard
9、的“Member functions”列表中将列出新增加的成员函数。选择此函数,单击Edit Code按钮(或直接在函数名双击鼠标),在此成员函数中添加下列代码:void CMainFrame:OnTestChange()MessageBox(现在就切换吗?);(4)编译运行并测试。在应用程序的顶层菜单上,单击“测试”菜单项,然后将鼠标移动到弹出的子菜单项“切换菜单”上,则结果如图4.6所示,此时状态栏上显示该菜单项的提示信息,该信息就是在前图4.3的菜单项属性对话框“提示”框中设置的内容。单击“切换菜单”,则弹出一个消息对话框,显示内容“现在就切换吗?”。图图4.6 Ex_SDI运行后的菜单
10、运行后的菜单4.1菜单菜单 4.1.2 使用键盘快捷键通过菜单系统,可以选择几乎所有可用的命令和选项,它保证了菜单命令系统的完整性,但菜单系统也有某些美中不足之处,如操作效率不高等。尤其对于那些反复使用的命令,很有必要进一步提高效率,于是加速键应运而生。加速键加速键也往往被称为键盘快捷键键盘快捷键,一个加速键就是一个按键或几个按键的组合,它用于激活特定的命令。加速键也是一种资源,它的显示、编辑过程和菜单相似。例如下面的过程是为前面菜单项ID_TEST_CHANGE定义一个键盘快捷键:(1)在项目工作区窗口的ResourceView(资源视图)页面中,展开中Accelerator(加速键)的资源
11、项,双击IDR_MAINFRAME,在右侧窗口中出现如图4.7的加速键资源列表。下端的空行下端的空行图图4.7 Ex_SDI的加速键资源的加速键资源4.1菜单菜单 (2)建立一个新的加速键时,只要双击加速键列表的最下端的空行,弹出如图4.8所示的“Accel 属性”(Accel Properties)对话框,其中可设置的属性如表4.2所示图图4.8 加速键属性对话框加速键属性对话框表表4.2 加速键常规(加速键常规(General)属性的各项含义)属性的各项含义项项 目目含含 义义ID指定资源ID号的列表项,为了能和菜单联用,通常选择某菜单项的ID号辅助键(Modifiers)用来确定Ctrl
12、、Alt、Shift是否是构成加速键的组成部分类型(Type)用来确定该加速键的值是虚拟键(VirKey)还是ASCII字符键键(Key)是指启动加速键的键盘按键下一键(Next Key Typed)单击此按钮后,用户操作的任何按键将成为此加速键的键值4.1菜单菜单 需要说明的是,为了使其他用户能查看并使用该加速键,还需在相应的菜单项文本后面添加加速键内容。例如,可将ID_TEST_CHANGE菜单项的标题改成“切换菜单(&C)tCtrl+1”,其中“t”是将后面的“Ctrl+1”定位到下一个水平制表位。(4)编译运行并测试。当程序运行后,按Ctrl+1键将执行相应的菜单命令。4.1.3 更改
13、应用程序菜单 下面就上节的单文档应用程序Ex_SDI的基础上,为其添加菜单资源并实现应用程序的菜单更改。如下面的过程:(1)按快捷键Ctrl+R,弹出“插入资源”对话框,在资源类型中选定“Menu”,如图4.9。图图4.9 “插入资源插入资源”对话框对话框 (3)在加速键属性对话框中,先选择在Ex_SDI应用程序菜单资源添加的“切换菜单”菜单项ID_TEST_CHANGE作为要联用的加速键的ID标识符,然后单击下一键按钮,并按下Ctrl+1作为此加速键的键值。4.1菜单菜单 (2)单击新建按钮,系统就会为应用程序添加一个新的菜单资源,并自动赋给它一个默认的标识符名称(第一次为IDR_MENU1
14、,以后依次为IDR_MENU2、IDR_MENU3、.),同时自动打开这个新的菜单资源及相应的菜单编辑器,如图4.10所示。(3)在Menu资源的ID_MENU1上右击鼠标,从弹出的快捷菜单中选择“属性”(Properties)命令,出现如图4.11所示的菜单属性对话框,在这里可以重新指定菜单资源ID,设置菜单资源的语言和条件,这个条件用来决定菜单资源包含到哪个环境中,例如当指定条件为_DEBUG,则菜单资源只存在于Debug编译环境中。菜单空位置菜单空位置 菜单默认菜单默认ID图图4.10 添加菜单资源后的开发环境添加菜单资源后的开发环境图图4.11 菜单属性对话框菜单属性对话框4.1菜单菜
15、单 (4)在菜单的空位置上双击鼠标左键,则出现它的属性对话框。通过其属性对话框为菜单ID_MENU1添加一个顶层弹出菜单项“测试(&T)”,并在该菜单下添加一个子菜单项“返回(&R)”,ID设为ID_TEST_RETURN,如图4.12所示。需要再次强调的是,符号&用来指定后面的字符是一个助记符。图图4.12 设计新的菜单资源设计新的菜单资源 (5)为CMainFrame类添加一个CMenu类型的成员变量m_NewMenu,CMenu类是用来处理菜单的一个MFC类。4.1菜单菜单 (6)按快捷键Ctrl+W打开MFC ClassWizard对话框,切换到Message Maps页面,从“Cla
16、ss name”列表中选择CMainFrame,为菜单项ID_TEST_RETURN添加COMMAND消息映射,使用默认的消息映射函数名,并添中下列代码:void CMainFrame:OnTestReturn()m_NewMenu.Detach();/使菜单对象和菜单句柄分离 m_NewMenu.LoadMenu(IDR_MAINFRAME);SetMenu(NULL);/清除应用程序菜单 SetMenu(&m_NewMenu);/设置应用程序菜单 代码中,LoadMenu和Detach都是CMenu类成员函数,LoadMenu用来装载菜单资源,而Detach是使菜单对象与菜单句柄分离。在调
17、用LoadMenu后,菜单对象m_NewMenu就拥有一个菜单句柄,当再次调用LoadMenu时,由于菜单对象的句柄已经创建,因而会发生运行时错误,但当菜单对象与菜单句柄分离后,就可以再次创建菜单了。SetMenu是CWnd类的一个成员函数,用来设置应用程序的菜单。4.1菜单菜单 (7)修改CMainFrame:OnTestChange中的代码:void CMainFrame:OnTestChange()/MessageBox(现在就切换吗?);m_NewMenu.Detach();m_NewMenu.LoadMenu(IDR_MENU1);SetMenu(NULL);SetMenu(&m_N
18、ewMenu);(8)编译运行后,选择Ex_SDI应用程序的“测试”“切换菜单”菜单命令,菜单栏变成了新添加的IDR_MENU1,在新的菜单中选择“测试”“返回”菜单命令,程序又变回到了原来的主菜单了。4.1菜单菜单 4.1.4 菜单的编程控制 1.创建菜单创建菜单 CMenu类的CreateMenu和CreatePopupMenu分别用来创建一个菜单或子菜单框架,它们的原型如下:BOOL CreateMenu();/产生一个空菜单 BOOL CreatePopupMenu();/产生一个空的弹出式子菜单 2.装入菜单装入菜单 将菜单从资源装入应用程序中,需调用CMenu成员函数LoadMen
19、u,或者用SetMenu对应用程序菜单进行重新设置。BOOL LoadMenu(LPCTSTR lpszResourceName);BOOL LoadMenu(UINT nIDResource);其中,lpszResourceName为菜单资源名称,nIDResource为菜单资源ID标识符。3.添加菜单项添加菜单项 当菜单创建后,用户可以调用AppendMenu或InsertMenu函数来添加一些菜单项。但每次添加时,AppendMenu是将菜单项添加在菜单的末尾处,而InsertMenu在菜单的指定位置处插入菜单项,并将后面的菜单项依次下移。4.1菜单菜单 BOOL AppendMenu(
20、UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL);BOOL AppendMenu(UINT nFlags,UINT nIDNewItem,const CBitmap*pBmp);BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL);BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem,const CBitmap*pBmp);其中,nIDNewItem表
21、示新菜单项的资源ID标识符,lpszNewItem表示新菜单项的内容,pBmp用于菜单项的位图指针,nPosition表示新菜单项要插入的菜单项位置。nFlags表示要增加的新菜单项的状态信息,它的值影响其他参数的含义,如表4.3所示。4.1菜单菜单表表4.3 nFlags的值及其对其他参数的影响的值及其对其他参数的影响nFlags值值含含 义义nPosition值值nIDNewItem值值lpszNewItem值值MF_BYCOMMAND菜单项以ID标识符来标识菜单项资源IDMF_BYPOSITION菜单项以位置来标识菜单项的位置MF_POPUP菜单项有弹出式子菜单弹出式菜单句柄MF_SEP
22、ARATOR分隔线忽略忽略MF_OWNERDRAW自画菜单项自画所需的数据MF_STRING字符串标志字符串指针MF_CHECKED设置菜单项的选中标记MF_UNCHECKED取消菜单项的选中标记MF_DISABLED禁用菜单项MF_ENABLED允许使用菜单项MF_GRAYED菜单项灰显4.1菜单菜单 需要注意的是:当nFlags为MF_BYPOSITION时,nPosition表示新菜单项要插入的具体位置,为0时表示第一个菜单项,为-1时,将菜单项添加菜单的末尾处。nFlags的标志中,可以用“|”(按位或)来组合,例如MF_CHECKED|MF_STRING等。但有些组合是不允许的,例如
23、MF_DISABLED、MF_ENABLED和MF_GRAYED,MF_STRING、MF_OWNERDRAW、MF_SEPARATOR和位图,MF_CHECKED和MF_UNCHECKED 都不能组合在一起。当菜单项增加、改变或删除后,不管菜单依附的窗口是否改变,都应调用CWnd:DrawMenuBar来更新菜单。4.删除菜单项删除菜单项 调用DeleteMenu函数可将指定的菜单项删除,函数DeleteMenu的原型如下:BOOL DeleteMenu(UINT nPosition,UINT nFlags);其中,参数nPosition表示要删除的菜单项位置,它由nFlags进行说明。若当
24、nFlags为MF_BYCOMMAND时,nPosition表示菜单项的ID标识符,而当nFlags为MF_BYPOSITION时,nPosition表示菜单项的位置(第一个菜单项位置为0)。4.1菜单菜单5.获取菜单项获取菜单项 下面的3个CMenu成员函数分别获得菜单的项数、菜单项的ID标识符以及弹出式子菜单的句柄。UINT GetMenuItemCount()const;该函数用来获得菜单的菜单项数,调用失败后返回-1。UINT GetMenuItemID(int nPos)const;该函数用来获得由nPos指定菜单项位置(以0为基数)的菜单项的标识号,若nPos是SEPARATOR(
25、分隔符),则返回-1。CMenu*GetSubMenu(int nPos)const;该函数用来获得指定菜单的弹出式菜单的菜单句柄。该弹出式菜单位置由参数nPos指定,开始的位置为0。若菜单不存在,则创建一个临时的菜单指针。例例Ex_Menu 用程序添加并处理一个菜单项用程序添加并处理一个菜单项 下面的示例过程是利用CMenu成员函数向应用程序菜单中添加并处理一个菜单项:(1)创建一个默认的单文档应用程序Ex_Menu。(2)选择“查看”“资源符号”(Resource Symbols)命令,弹出如图4.13所示的“资源符号”对话框,它能对应用程序中的资源标识符进行管理。4.1菜单菜单图图4.1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工具栏 状态栏
限制150内