郑阿奇 第5章 菜单、工具栏和状态栏

上传人:ji****72 文档编号:48616648 上传时间:2018-07-18 格式:PPT 页数:51 大小:862.50KB
返回 下载 相关 举报
郑阿奇 第5章  菜单、工具栏和状态栏_第1页
第1页 / 共51页
郑阿奇 第5章  菜单、工具栏和状态栏_第2页
第2页 / 共51页
郑阿奇 第5章  菜单、工具栏和状态栏_第3页
第3页 / 共51页
郑阿奇 第5章  菜单、工具栏和状态栏_第4页
第4页 / 共51页
郑阿奇 第5章  菜单、工具栏和状态栏_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《郑阿奇 第5章 菜单、工具栏和状态栏》由会员分享,可在线阅读,更多相关《郑阿奇 第5章 菜单、工具栏和状态栏(51页珍藏版)》请在金锄头文库上搜索。

1、第5章 菜单、工具栏和状态栏文档应用程序的框架窗口常常包含菜单、工具栏、状态栏、图标和光标等内容, 它们是Windows应用程序中不可缺少的界面元素,其风格和外观有时直接影 响着用户对软件的评价。许多优秀的软件(如Microsoft Office )为增加对用户 的吸引力,不惜资源将它们做得多姿多彩,甚至达到真三维的效果。本章将 从它们最简单的用法开始入手,逐步深入直到对其进行编程控制。5.1 菜单为了使Windows程序更容易操作,菜单的显示都遵循下列一些规则: 若单击某菜单项后,将弹出一个对话框,那么在该菜单项文本后有“”。 若某项菜单有子菜单,那么在该菜单项文本后有“”。 若菜单项需要助

2、记符,则用括号将带下划线的字母括起来。助记符与Alt构成一 个组合键,当按住“Alt”键不放,再敲击该字母时,对应的菜单项就会被选中。 若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。所谓 “快捷键”是一个组合键,如Ctrl+N,使用时是先按下“Ctrl”健不放,然后再按“N” 键。任何时候按下快捷键,相应的菜单命令都会被执行。5.1 菜单图5.1是一个菜单样例,注意它们的规则含义。需要说明的是,在常见的菜单系 统中,最上面的一层水平排列的菜单称为“顶层菜单”,每一个顶层菜单项可以是 一个简单的菜单命令,也可以是下拉(Popup)菜单,在下拉菜单中的每一个菜单 项也可是菜单命令或

3、下拉菜单,这样一级一级下去可以构造出复杂的菜单系统。顶层菜单弹出菜单图5.1 菜单样例5.1.1 用编辑器设计菜单1. 编辑菜单 在顶层菜单的最后一项,Visual C+为用户留出了一个空位置,用来输入新的顶层菜单 项。在菜单的空位置上双击鼠标左键,出现菜单项的属性对话框,在标题框中输入“测试 ( 图5.6 添加映射函数2. 菜单命令的消息映射(4) 编译并运行。在应用程序的顶层菜单上,单击“测试”菜单项,然后将鼠标移动 到弹出的子菜单项“切换菜单”上,则结果如图5.7所示,此时状态栏上显示该菜单 项的提示信息,该信息就是在前图5.3的菜单项属性对话框“提示”框中设置的内 容。单击“切换菜单”

4、,则弹出一个消息对话框,显示内容“现在就切换吗?”。图5.7 Ex_SDI运行后的菜单5.1.2 使用键盘快捷键(1) 展开项目工作区窗口中Accelerator的资源项,双击IDR_MAINFRAME,出现 如图5.8的加速键资源列表。图5.8 Ex_SDI的加速键资源下端的空行5.1.2 使用键盘快捷键(2) 建立一个新的加速键时,只要双击加速键列表的最下端的空行,弹出如图5.9 所示的“Accel Properties”(加速键属性)对话框,其中可设置的属性如表5.2所示图5.9 加速键属性对话框 表5.2 加速键General属性对话框的各项含义5.1.2 使用键盘快捷键(3) 在加速

5、键属性对话框中,先选择在Ex_SDI应用程序菜单资源添加的“切换菜 单”菜单项ID_TEST_CHANGE作为要联用的加速键的ID标识符,然后单击下一 键按钮,并按下Ctrl+1作为此加速键的键值。需要说明的是,为了使其他用户能 查看并使用该加速键,还需在相应的菜单项文本后面添加加速键内容。例如,可 将ID_TEST_CHANGE菜单项的标题改成“切换菜单(/ 产生一个空菜单 BOOL CreatePopupMenu( );/ 产生一个空的弹出式子菜单 2. 装入菜单 将菜单从资源装入应用程序中,需调用CMenu成员函数LoadMenu,或者用 SetMenu对应用程序菜单进行重新设置。 BO

6、OL LoadMenu( LPCTSTR lpszResourceName ); BOOL LoadMenu( UINT nIDResource ); 其中,lpszResourceName为菜单资源名称,nIDResource为菜单资源ID标识 符。5.1.3 菜单的编程控制3. 添加菜单项 当菜单创建后,用户可以调用AppendMenu或InsertMenu函数来添加一些菜单项。但每次添加 时,AppendMenu是将菜单项添加在菜单的末尾处,而 InsertMenu在菜单的指定位置处插入菜单项,并将后面的菜单项依次下移。 BOOL AppendMenu( UINT nFlags, UIN

7、T 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 );

8、其中,nIDNewItem表示新菜单项的资源ID标识符,lpszNewItem表示新菜单项的内容,pBmp用 于菜单项的位图指针,nPosition表示新菜单项要插入的菜单项位置。nFlags表示要增加的新菜单 项的状态信息,它的值影响其他参数的含义,如表5.3所示。表5.3 nFlags的值及其对其他参数的影响5.1.3 菜单的编程控制4. 删除菜单项 调用DeleteMenu函数可将指定的菜单项删除,函数DeleteMenu的原型如下:BOOL DeleteMenu( UINT nPosition, UINT nFlags ); 其中,参数nPosition表示要删除的菜单项位置,它由nF

9、lags进行说明。若当 nFlags为MF_BYCOMMAND时,nPosition表示菜单项的ID标识符,而当nFlags 为MF_BYPOSITION时,nPosition表示菜单项的位置(第一个菜单项位置为0)。 5. 获取菜单项 下面的3个CMenu成员函数分别获得菜单的项数、菜单项的ID标识符以及弹出式 子菜单的句柄。UINT GetMenuItemCount( ) const; 该函数用来获得菜单的菜单项数,调用失败后返回-1。UINT GetMenuItemID( int nPos ) const; 该函数用来获得由nPos指定菜单项位置(以0为基数)的菜单项的标识号,若nPos

10、 是SEPARATOR(分隔符),则返回-1。CMenu* GetSubMenu( int nPos ) const; 该函数用来获得指定菜单的弹出式菜单的菜单句柄。该弹出式菜单位置由参数 nPos指定,开始的位置为0。若菜单不存在,则创建一个临时的菜单指针。5.1.3 菜单的编程控制例Ex_Menu 用程序添加并处理一个菜单项 创建一个默认的单文档应用程序Ex_Menu。 (2) 选择“查看”菜单“Resource Symbols”命令,弹出如图5.10所示的“资源符 号”对话框,它能对应用程序中的资源标识符进行管理。由于程序中要添加的菜 单项需要一个标识值,最好用一个标识符来代替这个值,这

11、是一个好的习惯。因 此这里通过“资源符号”对话框来创建一个新的标识符。图5.10 “资源符号”对话框例Ex_Menu (3) 单击新建按钮,弹出如图5.11所示的“New Symbol”(新标识符)对话框。在名 字(Name)框中输入一个新的标识符ID_NEW_MENUITEM。在值(Value)框中, 输入该ID的值,系统要求用户定义的ID值应大于15(0X000F)而小于 61440(0XF000)。保留默认的ID值101,单击确定按钮。图5.11 新标识符对话框例Ex_Menu(4) 关闭“资源符号”对话框,在CMainFrame:OnCreate函数中添加下列代码,该函数在框 架窗口创

12、建时自动调用。 int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) . CMenu* pSysMenu = GetMenu();/ 获得程序菜单指针 CMenu* pSubMenu = pSysMenu-GetSubMenu(1);/ 获得第二个子菜单的指针 CString StrMenuItem(“新的菜单项“); pSubMenu-AppendMenu(MF_SEPARATOR);/ 增加一水平分隔线 pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem); / 在子菜单

13、中增加一菜单项 m_bAutoMenuEnable = FALSE; / 关闭系统自动更新菜单状态 pSysMenu- EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED); / 激活菜单项 DrawMenuBar();/ 更新菜单 return 0; 例Ex_Menu(5) 此时编译运行后,结果如图5.12所示。但此时选择“新的菜单项”命令不会有反 应。图5.12 程序添加的菜单项例Ex_Menu(6) 用MFC ClassWizard在CMainFrame添加OnCommand消息函数的重载,并 添加下列代码: BOOL CMain

14、Frame:OnCommand(WPARAM wParam, LPARAM lParam) / wParam的低字节表示菜单、控件、加速键的命令IDif (LOWORD(wParam) = ID_NEW_MENUITEM) MessageBox(“你选中了新的菜单项“);return CFrameWnd:OnCommand(wParam, lParam); (7) 编译运行并测试。这时当选择菜单“编辑”“新的菜单项”命令后,就会弹一个 对话框,显示“你选中了新的菜单项”消息。5.1.4 使用快捷菜单快捷菜单是一种浮动的弹出式菜单,它是一种新的用户界面设计风格。当用户按 下鼠标右键时,就会相应地

15、弹出一个浮动菜单,其中提供了几个与当前选择内容 相关的选项。 用资源编辑器和MFC库的CMenu:TrackPopupMenu函数可以很容易地创建这样 的菜单,CMenu:TrackPopupMenu函数原型如下: BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL ); 该函数用来显示一个浮动的弹出式菜单,其位置由各参数决定。其中,nFlags表示 菜单在屏幕显示的位置以及鼠标按钮标志,如表5.4所示。 表5.4 nFlags的值及其对其他参数的影响5.1.4 使用快捷菜单例Ex_

16、ContextMenu 使用快捷菜单 (1) 创建一个默认的单文档应用程序Ex_ContextMenu。 用MFC ClassWizard在CEx_ContextMenuView类添加WM_CONTEXTMENU消息映射,并在映 射函数中添加下列代码: void CEx_ContextMenuView:OnContextMenu(CWnd* pWnd, CPoint point) CMainFrame* pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;/ 获得主窗口指针 CMenu* pSysMenu = pFrame-GetMenu();/ 获得程序窗口菜单指针 int nCount = pSysMenu-GetMenuItemCount();/ 获得顶层菜单个数 int nSubMenuPos = -1; for (int i=0; iGetMenuString(i, str, MF

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号