第06章 菜单、工具栏和状态栏.ppt_第1页
第06章 菜单、工具栏和状态栏.ppt_第2页
第06章 菜单、工具栏和状态栏.ppt_第3页
第06章 菜单、工具栏和状态栏.ppt_第4页
第06章 菜单、工具栏和状态栏.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章菜单、工具栏和状态栏,6.1 菜单 6.2 工具栏 6.3 状态栏 6.4 交互对象的动态更新 作业,6.1菜单,对于菜单的显示都遵循下列一些规则: 若点击某菜单项会弹出一对话框,那么在该菜单项文本后有“”。 若某项菜单有子菜单,那么在该菜单项文本后有“”。 菜单项需要助记符,用括号将带下划线的字母括起来。助记符与Alt构成一个组合键,当按住“Alt”键不放,再敲击该字母时,对应的菜单项就会被选中。 若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。任何时候按下快捷键,相应的菜单命令都会被执行。,图6.1 File菜单,6.1菜单,6.1.1用编辑器设计菜单 编辑菜单 在菜单

2、的空位置上双击鼠标左键,则出现它的属性对话框,如图。,6.1菜单,图6.3 菜单属性对话框,6.1菜单,需要注意的是: 当菜单项的属性中选中了Pop_up时,对话框中ID、Separator和Prompt项无效。 增加新的菜单项后,用户可以用鼠标将菜单项拖到其他位置,而当菜单项位置改变时,其属性并没改变。,图6.5 添加的菜单项,6.1菜单,菜单命令的消息映射 例Ex_Mmenu“成绩输入”菜单项的映射。 (1)选择“View”菜单“ClassWizard”命令项或按Ctrl+w快捷键,则出现MFC ClassWizard对话框,切换到Message Maps页面。 (2)从“Class na

3、me”列表中选择CMainFrame,在IDs列表中选择ID_SCORE_IN,然后在Messages框中选择COMMAND消息,如图。,图6.6 消息的选择,6.1菜单,(3)单击Add Function按钮或双击COMMAND消息,输入成员函数的名称。如图。 (4)单击OK。选择新增加的成员函数,单击Edit Code按钮(或直接在函数名双击鼠标左键),就可以在此成员函数中添加一些代码。例如: void CMainFrame:OnScoreIn() / TODO: Add your command handler code here AfxMessageBox(现在就输入成绩吗?); (5

4、)编译并运行。在应用程序的顶层菜单上,单击“成绩输入”菜单项或按Alt+S组合键,如图。,图6.7 添加成员函数对话框,图6.8 菜单命令执行的结果,6.1菜单,6.1.2使用键盘快捷键 (1)先打开上例的项目工作区窗口中Accelerator的资源项,双击IDR_MAINFRAME,如图。,6.1菜单,(2)要建立一新的加速键,双击加速键列表的最下端的空行,如图,其中可设置的属性如表 (3)在上述对话框中,选择在Ex_Sdi示例中添加的“成绩输入”菜单项的ID号ID_SCORE_IN作为要联用的加速键的ID号,单击Next Key Typed,按下Ctrl+1作为此加速键的键值。,图6.10

5、 “Accel Properities”对话框,6.1菜单,6.1.3菜单的编程控制 菜单的基本操作 (1)创建菜单 CMenu类的CreateMenu和CreatePopupMenu用来创建一个菜单或子菜单框架,原型如下: BOOL CreateMenu( );/ 产生一个空菜单 BOOL CreatePopupMenu( );/ 产生一个空的弹出式子菜单 (2)装入菜单 将菜单从资源装入应用程序中,需调用CMenu成员函数LoadMenu,或者用SetMenu对应用程序菜单进行重新设置。 BOOL LoadMenu( LPCTSTR lpszResourceName ); BOOL Loa

6、dMenu( 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 Inser

7、tMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL ); BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );,6.1菜单,需要注意的是: nFlags为MF_BYPOSITION时,nPosition表示新菜单项要插入的具体位置,为0时表示第一个菜单项,为 -1时,将菜单项添加菜单的末尾处。 nFlags的标志中,可以用“|”(按位或)来组合,例如MF_CHEC

8、KED|MF_STRING等。有些组合是不允许的,例如MF_DISABLED、MF_ENABLED和MF_GRAYED,MF_STRING、MF_OWNERDRAW、MF_SEPARATOR和位图,MF_CHECKED和MF_UNCHECKED 都不能组合在一起。 当菜单项增加后,不管菜单依附的窗口是否改变,都应调用CWnd:DrawMenuBar来更新菜单。,6.1菜单,(4)删除菜单项 调用DeleteMenu函数可将指定的菜单项删除,需要注意的是:调用该函数后,不管菜单依附的窗口是否改变,都应调用CWnd:DrawMenuBar使菜单更新。函数DeleteMenu的原型如下: BOOL

9、DeleteMenu( UINT nPosition, UINT nFlags ); nPosition表示要删除的菜单项位置,它由nFlags进行说明。若当nFlags为MF_BYCOMMAND时,nPosition表示菜单项的ID号,而当nFlags为MF_BYPOSITION时,nPosition表示菜单项的位置(第一个菜单项位置为0)。 (5)获取菜单项 下面的三个CMenu成员函数分别获得菜单的项数、菜单项的ID号以及弹出式子菜单的句柄。 UINT GetMenuItemCount( ) const; 该函数用来获得菜单的菜单项数,调用失败后返回-1。 UINT GetMenuIte

10、mID( int nPos ) const; 该函数用来获得由nPos指定菜单项位置(以0为基数)的菜单项的标识号,若nPos是SEPARATOR,则返回-1。 CMenu* GetSubMenu( int nPos ) const; 该函数获得指定菜单的弹出式菜单的菜单句柄。该弹出式菜单位置由参数nPos指定,开始的位置为0。若菜单不存在,则创建一个临时的菜单指针。,6.1菜单,给系统菜单添加一个菜单项 例Ex_SysMenu 向应用系统菜单中添加一个菜单项。 (1)打开一个单文档应用程序项目,若没有可按前面提及的方法进行创建。 (2)选择“View”菜单“Resource Symbols”

11、命令,如图。 (3)单击New,如图。在Name框中,可以指定一个用于菜单项的ID号。在Value框中,可以定义该ID的值,系统要求定义的ID值应大于15(0X000F)而小于61440(0XF000)。选择默认的ID值101,单击OK按钮。,图6.11 “Resource Symbols”对话框,图6.12 “New Symbol”对话框,6.1菜单,(4)在CMainFrame:OnCreate函数体(或自定义的函数)中加入代码: int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) . CMenu* pSysMenu = GetMe

12、nu();/ 获得主菜单句柄 CMenu* pSubMenu = pSysMenu-GetSubMenu(1);/ 获得第二个子菜单的句柄 CString StrMenuItem(新的菜单项); pSubMenu-AppendMenu(MF_SEPARATOR);/ 增加一水平分隔线 pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem); / 允许使用ON_UPDATE_COMMAND_UI或ON_COMMAND的菜单项 m_bAutoMenuEnable = FALSE; / 使添加的菜单处于允许状态,默认为灰显 pSysMen

13、u-EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED); DrawMenuBar();/ 更新菜单 return 0; (5)使用ClassWizard处理OnCommand消息并检测用户菜单的nID参数。 BOOL CMainFrame:OnCommand(WPARAM wParam, LPARAM lParam) / wParam的低字节表示菜单、控件、加速键的命令ID if (LOWORD(wParam) = ID_NEW_MENUITEM) MessageBox(你选中了新的菜单项); return CFrameWnd:OnC

14、ommand(wParam, lParam); (6)编译运行并测试。,6.1菜单,6.1.4使用快捷菜单 用资源编辑器和MFC库的CMenu:TrackPopupMenu函数创建这样的菜单,CMenu:TrackPopupMenu函数原型如下: BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL ); x和y表示菜单的水平坐标和菜单的顶端的垂直坐标。pWnd表示弹出菜单的窗口。lpRect是一个RECT结构或CRect对象指针,表示一个矩形区域,单击这个区域时,弹出菜单不消失。当l

15、pRect为NULL时,若击在菜单外面,菜单立刻消失。,6.1菜单,例Ex_Menu创建弹出菜单。 (1)选择“Insert”菜单“Resource”命令或按Ctrl+R快捷键,向应用程序项目添加一个新的菜单资源(默认的ID号为 IDR_MENU1)。 (2)用菜单编辑器,为该菜单资源中的顶层菜单的第一项加一任意标题(实际上该标题无用),在此菜单项下依次添加如下表所示的菜单项。 (3)将此菜单资源ID号改为IDR_MYFLOATMENU。 (4)按Ctrl+W快捷键打开ClassWizard,将出现一对话框,询问是“选择一个已存在的类”,还是“创建一个新类”。选择“选择一个已存在的类”项并选定

16、CMainFrame类。,6.1菜单,(5)在CMainFrame类中,选择上表中所列的菜单ID,双击COMMAND消息。这是仅为菜单ID_MENU_SCOREIN映射COMMAND消息,添加代码: void CMainFrame:OnMenuScorein() AfxMessageBox(现在就输入成绩吗?); (6)在CMainFrame类加入WM_CONTEXTMENU消息处理函数,代码。 void CMainFrame:OnContextMenu(CWnd* pWnd, CPoint point) CMenu menu; menu.LoadMenu(IDR_MYFLOATMENU);

17、menu.GetSubMenu(0)-TrackPopupMenu (TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); (7)运行并测试。在应用程序的窗口客户区中单击鼠标右键,弹出如图菜单。 “成绩打印”菜单命令没有消息处理函数,因此它是灰显的,用户不能使用它们。若用户选中“成绩输入”菜单命令,则会执行相应的代码。,图6.13 快捷菜单,6.2工具栏,6.2.1使用工具栏编辑器 选择“File”“Open Workspace”,将单文档应用程序Ex_Sdi调入或重新创建。在项目工作区窗口中选择ResourceView标签,双击“To

18、olbar”项中的IDR_MAINFRAME,则工具栏编辑器出现在主界面的右边,如图。,6.2工具栏,(1)创建一个新的工具栏按钮 在新建的工具栏中,最右端总有一个空按钮,双击该按钮弹出其属性对话框,在ID框中输入其标识符名称,则在其右端又出现一个新的空按钮。单击该按钮,在编辑器的视窗内进行编辑,这个编辑就是绘制一个按钮位图。 (2)移动一个按钮 在工具栏中移动一个按钮,用鼠标左键点中它并拖动至相应位置即可。如果用户拖动它离开工具栏位置,则此按钮从工具栏中消失。若在移动一个按钮的同时,按下Ctrl键,则在新位置复制一个按钮,新位置可以是同一个工具栏中的其他位置,也可以在不同的工具栏中。 (3)

19、删除一个按钮 前面已提到过,将选取中的按钮拖离工具栏,则该按钮就消失了。但若选中按钮后,单击Delete键并不能删除一个按钮,只是将按钮中的图形全部以背景色填充。 (4)在工具栏中插入空格 如果按钮前没有任何空格,拖动该按钮向右移动并当覆盖相邻按钮的一半以上时,释放鼠标键,则此按钮前出现空格。 如果按钮前有空格而按钮后没有空格,拖动该按钮向左移动并当按钮的左边界接触到前面按钮时,释放鼠标键,则此按钮后将出现空格。 如果按钮前后均有空格,拖动该按钮向右移动并当接触到相邻按钮时,则此按钮前的空格保留,按钮后的空格消失。相反,拖动该按钮向左移动并当接触到前一个相邻按钮时,则此按钮前面的空格消失,后面

20、的空格保留。,6.2工具栏,(5)工具栏按钮属性的设置 双击某按钮弹出其属性对话框,如图。,图6.15 工具栏按钮属性对话框,6.2工具栏,6.2.2工具栏和菜单相结合 例Ex_T,6.3状态栏,例Ex_Status 在状态栏的最右边两个窗格中显示出当前鼠标在窗口客户区的位置。 (1)将前面的单文档应用程序Ex_Sdi打开或重新创建; (2)将项目工作区窗口切换到ResourceView页面,双击“String Table”项的“String Table”图标。在字符串列表的最后一行空项上双击鼠标左键,如图: (3)该对话框中,可以指定相应的ID和字符串值,这里加入两个字符串资源ID_LEFT

21、和ID_RIGHT,其字符的多少决定窗格的大小。如图:,图6.17 字符串属性对话框,6.3状态栏,(4)打开MainFrm.cpp文件,将原先的indicators数组修改如下: static UINT indicators = ID_SEPARATOR, / 第一个信息行窗格 ID_SEPARATOR, / 第二个信息行窗格 ID_LEFT,/ 第三个窗格 ID_RIGHT,/ 第四个窗格 ; (5) 必须手工添加消息处理函数原型。打开Ex_SdiView.h文件,在AFX_MSG内增加消息处理语句,ClassWizard以后允许访问和编辑该代码。 protected: /AFX_MSG(

22、CEx_SdiView) afx_msg void OnUpdateXY(CCmdUI* pCmdUI); /AFX_MSG DECLARE_MESSAGE_MAP() (6)打开Ex_SdiView.cpp文件,在其消息入口处添加消息映射函数: BEGIN_MESSAGE_MAP(CEx_SdiView, CView) /AFX_MSG_MAP(CEx_SdiView) ON_UPDATE_COMMAND_UI(ID_LEFT, OnUpdateXY) ON_UPDATE_COMMAND_UI(ID_RIGHT, OnUpdateXY) /AFX_MSG_MAP,6.3状态栏,(7)增加修改

23、状态栏指示器的消息映射函数代码,状态栏的窗格需要更新时,应用程序框架自动调用此函数。 void CEx_SdiView:OnUpdateXY(CCmdUI* pCmdUI) pCmdUI-Enable(TRUE);/ 使窗格文本能被更新 (8)用ClassWizard在CEx_SdiView类中加入WM_MOUSEMOVE(鼠标移动)消息处理函数,并添加下列代码。该函数先获得状态栏对象的指针,然后调用SetPaneText函数更新第三和第四窗格中的文本。 void CEx_SdiView:OnMouseMove(UINT nFlags, CPoint point) CString str; C

24、MainFrame* pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;CStatusBar* pStatus= ,6.3状态栏,(9)将MainFrm.h文件中的受保护变量m_wndStatusBar变成公共变量。 (10)在Ex_SdiView.cpp文件的开始处增加下列语句: #include “MainFrm.h” (11)编译并运行,如图。,6.3状态栏,改变状态栏的风格 在MFC的CStatusBar类中,有两个成员函数可以改变状态栏风格,它们是: void SetPaneInfo( int nIndex, UINT nID, UINT nSty

25、le, int cxWidth ); void SetPaneStyle( int nIndex, UINT nStyle ); 参数nIndex表示要设置的状态栏窗格的索引,nID用来为状态栏窗格指定新的ID,cxWidth表示窗格的像素宽度,nStyle表示窗格的风格类型,用来指定窗格的外观,例如SBPS_POPOUT表示窗格是凸起来的,见表。,6.4交互对象的动态更新,为能使交互对象动态更新,MFC通过ClassWizard直接映射交互对象的更新命令消息来实现。自动将用户交互对象的ID号与ON_UPDATE_COMMAND_UI宏相连接并产生处理更新消息的相应函数。例如代码: void CEx_SdiView:OnUpdateXY(CCmdUI* pCmdUI) pCmdUI-Enable(TRUE);/ 使窗格文本能被更新 OnUpdateXY就是映射更新命令消息的消息函数。此消息处理函数只有一个参数,它是指向CCmdUI对象的指针。CCmdUI 类仅用于ON_UPDATE_COMMAND_UI处理函数,它的成员函数将对菜单项、工具按钮等用户交互对象起作用,如表。,6.4交互对象的动态更新,例Ex_T if (!m_wndToolBa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论