第6章菜单、工具栏和状态栏 61菜单 62工具栏 63状态栏 64交互对象的动态更新 作业
第6章菜单、工具栏和状态栏 6.1 菜单 6.2 工具栏 6.3 状态栏 6.4 交互对象的动态更新 作业
61菜单 对于菜单的显示都遵循下列一些规则 □互ew Ctrl+N 若点击某菜单项会弹出一对话框,那 Ope Ctrl+0 么在该菜单项文本后有 Close 若某项菜单有子菜单,那么在该菜单 Save Workspace 项文本后有“p”。 C1。 se Workspace 菜单项需要助记符,用括号将带下划 Seve Ctrl+S 线的字母括起来。助记符与At构成 个组合键,当按住“At键不放 F SaveAll 再敲击该字母时,对应的菜单项就会 Page Setup 被选中 Print Ctrl+P 若某项菜单需要快捷键的支持,则一 R 般将其列在相应菜单项文本之后。任 Recent Workspaces 何时候按下快捷键,相应的菜单命令 卫1t 都会被执行。 图611File菜单
6.1菜单 对于菜单的显示都遵循下列一些规则: ◆ 若点击某菜单项会弹出一对话框,那 么在该菜单项文本后有“…”。 ◆ 若某项菜单有子菜单,那么在该菜单 项文本后有“”。 ◆ 菜单项需要助记符,用括号将带下划 线的字母括起来。助记符与Alt构成 一个组合键,当按住“Alt”键不放, 再敲击该字母时,对应的菜单项就会 被选中。 ◆ 若某项菜单需要快捷键的支持,则一 般将其列在相应菜单项文本之后。任 何时候按下快捷键,相应的菜单命令 都会被执行。 图6.1 File菜单
61菜单 61.1用编辑器设计菜单 编辑菜单 在菜单的空位置上双击鼠标左键,则出现它的属性对话框,如图 气xSi- iereteft visual c=[ExS4,re“D重LQes)】 e ule Bit Ye Insert project Fail! Ioels tinder Belp →日a 吧国曾%mme |实件查春0帮助0 a Ex Sdi resources 菜单的空位置 eDDR MAINFRAME e白 String Table "CLass Reso.J0 Filev. FDNBulld Debug X Find in Files I find in Files 2AR 41l 图6.2菜单编辑器
6.1菜单 6.1.1用编辑器设计菜单 ➢ 编辑菜单 在菜单的空位置上双击鼠标左键,则出现它的属性对话框,如图。 图6.2 菜单编辑器 菜单的空位置
61菜单 D SCORE IN Caption:绩输入s 图6.3菜单属性对话框 表61菜单 General民性对话框的各项含文 项目含义 菜单的资源ID号 用来标识菜单项显示文本。助记符字母的前面须有一个&符号,这个字母与 t构成组合键 选中时,菜单项是一个分隔符或是一条水平线 Checked选中时,菜单项文本前显示一个选中标记 Pop_up选中时,菜单项含有一个弹出式子菜单 Grayed选中时,菜单项显示是灰色的,用户不能选用 active选中时,菜单项没有被激活,用户不能选用 选中时,菜单项在程序运行时被放在顶层菜单的最右端 当为 colurmn时,对于顶层菜单上的菜单项来说,被放置在另外一行上,而 对于弹出式子菜单的菜单项来说,则被放置在另外一列上;当为Bar时,与 Column相同,只不过对于弹出式子菜单来说,它还在新列与原来的列之间 增加一条竖直线注意这些效果只能在程序运行后才能看到 Prompt用来指明光标移至该菜单项时在状态栏上显示的提示信息
6.1菜单 图6.3 菜单属性对话框
61菜单 需要注意的是 当菜单项的属性中选中了Pop_Up时,对话框中ID、 Separator和 Prompt项无 效 增加新的菜单项后,用户可以用鼠标将菜单项拖到其他位置,而当菜单项位 置改变时,其属性并没改变 文件¢)编辑c)查看Q)帮助⑩成绩输入() 菜单项被拖动的位置 图6.4拖动菜单项 文件()编辑)查看0成绩输入)帮助(0 图6.5添加的菜单项
6.1菜单 需要注意的是: ◆ 当菜单项的属性中选中了Pop_up时,对话框中ID、Separator和Prompt项无 效。 ◆ 增加新的菜单项后,用户可以用鼠标将菜单项拖到其他位置,而当菜单项位 置改变时,其属性并没改变。 菜单项被拖动的位置 图6.4 拖动菜单项 图6.5 添加的菜单项
61菜单 >菜单命令的消息映射 [例 EX Menu成绩输入”菜单项的映射。 (1)选择“Vew菜单→“ ClassWizard”命令项或按Ctr+w快捷键,则出现 MFC ClassWizard对话框,切换到 Message Maps页面 (2)从“ Class name”列表中选择 MAin Frame,在IDs列表中选择 ID_ SCORE IN,然后在 Messages框中选择 COMMAND消息,如图。 rcc靠iwd 区 Message Maps Member Variables I Automation ActiveX Events Class Info I Project Class name: Add class X Sd D -Ex SdiMain Frm h, D:-\Ex SdMMainFrm cpp Add Function. Object [Ds: ID FILE SAVE D FILE SAVE AS UPDATE COMMAND UI Edit Code EW STATUS BAR ID VIEW TOOLBAR Member functions ON WM CREATE v PeCreatewindew Description: Handle a command (from menu, accel, amd button Cancel 图6消息的选择
6.1菜单 ➢ 菜单命令的消息映射 [例Ex_Mmenu]“成绩输入”菜单项的映射。 (1)选择“View”菜单→“ClassWizard”命令项或按Ctrl+w快捷键,则出现 MFC ClassWizard对话框,切换到Message Maps页面。 (2)从“Class name”列表中选择CMainFrame,在IDs列表中选择 ID_SCORE_IN,然后在Messages框中选择COMMAND消息,如图。 图6.6 消息的选择
61菜单 (3)单击[ Add Function]按钮或双击 COMMAND消息,输入成员函数的名称 如图。 (4)单击[OK]。选择新增加的成员函数,单击[ Edit Code]按钮(或直接在函 数名双击鼠标左键),就可以在此成员函数中添加一些代码。例如: void CMainFrame:: OnScoreIno //TODO: Add your command handler code here Af× MessageBox("现在就输入成绩吗?"); 5)编译并运行。在应用程序的顶层菜单上,单击“成绩输入”菜单项或按 At+S组合键,如图 Add esber Funetion 区 Member function name OK oreIn A 现在就输入成绩吗? Cancel Message: COMMAND 确定 Object ID: ID SCORE IN 图68菜单命令执行的结果 图6.7添加成员函数对话框
6.1菜单 (3)单击[Add Function]按钮或双击COMMAND消息,输入成员函数的名称。 如图。 (4)单击[OK]。选择新增加的成员函数,单击[Edit Code]按钮(或直接在函 数名双击鼠标左键),就可以在此成员函数中添加一些代码。例如: void CMainFrame::OnScoreIn() { // TODO: Add your command handler code here AfxMessageBox("现在就输入成绩吗?"); } (5)编译并运行。在应用程序的顶层菜单上,单击“成绩输入”菜单项或按 Alt+S组合键,如图。 图6.7 添加成员函数对话框 图6.8 菜单命令执行的结果
61菜单 6.1.2使用键盘快捷键 (1)先打开上例的项目工作区窗口中 Accelerator的资源项,双击 IDR MAINFRAME,如图 -,L-sai-siereseft Visual c+- [Es_ sai, re- IDR BAINYEAlZ (celerator)l 网 的园日x自2,,吧园曾mRn CMainframe - All class members)-.0nScoreln ·画x!C E NEx Sdi EDIT COPY -i Accelerator IRIKEY 2 DIDR MAINFRAM ID FILE OPEN ID FILE SAVE IRIKEY ID EDIT PASTE Ctl V 白 String Table At· VK BACK NEXT PANE Shift+ VK DELETE RTKEY VK F6 VIRTKEY PREV PANE VK F6 trl. VK INSERI ID EDIT PASTE hift+ VK INSERT ID EDI CU ID EDIT UNDO Ctrl +2 最下端的空行 Clas. 9 Reso.I D FIeV x_sdi exe-a error(s), a warning(s) aoNBulld ( Debua X Find in Files IX Find in Files 2XR.ll Ready 图6.9示例ExSd的加速键资源
6.1菜单 6.1.2使用键盘快捷键 (1)先打开上例的项目工作区窗口中Accelerator的资源项,双击 IDR_MAINFRAME,如图。 图6.9 示例Ex_Sdi的加速键资源 最下端的空行
61菜单 (2)要建立一新的加速键,双击加速键列表的最下端的空行,如图,其中可 设置的属性如表 (3)在上述对话框中,选择在ESd示例中添加的“成绩输入”菜单项的ID 号ID_ SCORE IN作为要联用的加速键的ID号,单击[ Next Key Typed],按下 Ctr|+1作为此加速键的键值 3 General D:ID_ SCORE_IN: 32771 Modifiers sct厂 Alt r Shift K Type Next Key Typed CASCIl VirtKey 图610“ Accel Properities,对话框 表62菜单 General-性对话框的各项含义 「项目 含文 ID 指定资源ID号的列表项,为能和菜单联用,通常选择某菜单项的ID号 用来確定Ct、 Alt. shif是否是构成加速键的组成部分 Type 用来确定该加速键的值是虚拟键(e功还是 ASCII 是指启动加速键的键盘按键 Next Key typed单击此按钮后,用户操作的任何按键将成为此加束键的键值
6.1菜单 (2)要建立一新的加速键,双击加速键列表的最下端的空行,如图,其中可 设置的属性如表 (3)在上述对话框中,选择在Ex_Sdi示例中添加的“成绩输入”菜单项的ID 号ID_SCORE_IN作为要联用的加速键的ID号,单击[Next Key Typed],按下 Ctrl+1作为此加速键的键值。 图6.10 “Accel Properities”对话框
61菜单 6.1.3菜单的编程控制 菜单的基本操作 (1)创建菜单 CMenu类的 CreateMenu和 CreatePopupMenu用来创建一个菜单或子菜单框架,原型 如下 BOOL CreateMenu(: ∥/产生一个空菜单 BOOL CreatePopup(: ∥/产生一个空的弹出式子菜单 (2)装入菜单 将菜单从资源装入应用程序中,需调用 CMenu成员函数 Loadmenu,或者用 SetMenu 对应用程序菜单进行重新设置。 BOOL LoadMenu( LPCTSTR lpszResourceName BOOL Load Menu( UINT nlDResource ) (3)添加菜单项 菜单创建后,可调用 AppendMenu或 iInsertMenu函数添加一些菜单项。 AppendMenu 是将菜单项添加在菜单的末尾处, Insert Menu在菜单的指定位置处插入菜单项,并 将后面的菜单项依次下移。 BOOL AppendMenu( UINT nFlags, UINT IDNewitem =0, LPCTSTR /psz/ewitem NULL: BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp ) BOOL InsertMenu( UINT pOsition, UINT nFlags, UINT nIDNewltem =0 LPCTSTR lpsZ/ewitem NULL BOOL InsertMenu( UINT pOsition, UINT nFlags, UINT nIDNewltem, const CBitmap*pOmp);
6.1菜单 6.1.3菜单的编程控制 ➢ 菜单的基本操作 (1)创建菜单 CMenu类的CreateMenu和CreatePopupMenu用来创建一个菜单或子菜单框架,原型 如下: BOOL CreateMenu( ); // 产生一个空菜单 BOOL CreatePopupMenu( ); // 产生一个空的弹出式子菜单 (2)装入菜单 将菜单从资源装入应用程序中,需调用CMenu成员函数LoadMenu,或者用SetMenu 对应用程序菜单进行重新设置。 BOOL LoadMenu( LPCTSTR lpszResourceName ); BOOL LoadMenu( UINT nIDResource ); (3)添加菜单项 菜单创建后,可调用AppendMenu或InsertMenu函数添加一些菜单项。AppendMenu 是将菜单项添加在菜单的末尾处,InsertMenu在菜单的指定位置处插入菜单项,并 将后面的菜单项依次下移。 BOOL AppendMenu( 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 );