window第4章菜单、工具栏和状态栏.ppt_第1页
window第4章菜单、工具栏和状态栏.ppt_第2页
window第4章菜单、工具栏和状态栏.ppt_第3页
window第4章菜单、工具栏和状态栏.ppt_第4页
window第4章菜单、工具栏和状态栏.ppt_第5页
免费预览已结束,剩余45页可下载查看

下载本文档

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

文档简介

1、第四章 菜单、工具栏和状态栏,4.1菜单,4.2工具栏,4.3状态栏,4.4交互对象的动态更新,4.5综合应用,view-doc-mainframe-app,4.1菜单,菜单是一系列命令的列表,通过选中其中的菜单项(命令)来执行相应任务。 菜单系统的设计规则: 菜单项文本后有“”, 将弹出一个对话框。 若某项菜单有子菜单,那么在该菜单项文本后有“”。 助记符,则用括号将带下划线的字母括起来。助记符与Alt构成一个组合键。 若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。所谓“快捷键”是一个组合键,如Ctrl+N。 顶层菜单,每一个顶层菜单项可以是一个简单的菜单命令,也可以是下拉(

2、Popup)菜单。,4.1菜单,表4.1 菜单General属性对话框的各项含义,4.1.2 使用键盘快捷键(Accelerator) 加速键也往往被称为键盘快捷键,一个加速键就是一个按键或几个按键的组合,它用于激活特定的命令。加速键也是一种资源,它的显示、编辑过程和菜单相似。,4.1菜单,void CMainFrame:OnTestReturn() m_NewMenu.Detach();/ 使菜单对象和菜单句柄分离 m_NewMenu.LoadMenu( IDR_MAINFRAME ); SetMenu(NULL); / 清除应用程序菜单 SetMenu( / 设置应用程序菜单 LoadMe

3、nu和Detach都是CMenu类成员函数. 在调用LoadMenu后,菜单对象m_NewMenu就拥有一个菜单句柄,当再次调用LoadMenu时,由于菜单对象的句柄已经创建,因而会发生运行时错误,但当菜单对象与菜单句柄分离后,就可以再次创建菜单了。 SetMenu是CWnd类的一个成员函数,用来设置应用程序的菜单。,4.1菜单,4.1.4 菜单的编程控制 1. 创建菜单 CMenu类的CreateMenu和CreatePopupMenu分别用来创建一个菜单或子菜单框架,它们的原型如下: BOOL CreateMenu( ); / 产生一个空菜单 BOOL CreatePopupMenu( )

4、;/ 产生一个空的弹出式子菜单 2. 装入菜单 将菜单从资源装入应用程序中,需调用CMenu成员函数LoadMenu,或者用SetMenu对应用程序菜单进行重新设置。 BOOL LoadMenu( LPCTSTR lpszResourceName ); BOOL LoadMenu( UINT nIDResource ); lpszResourceName为菜单资源名称 nIDResource为菜单资源ID标识符。,3. 添加菜单项 AppendMenu或InsertMenu函数来添加一些菜单项。 AppendMenu是将菜单项添加在菜单的末尾处,而InsertMenu在菜单的指定位置处插入菜单

5、项,并将后面的菜单项依次下移。 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

6、 nFlags, UINT nIDNewItem, const CBitmap* pBmp ); 其中,nIDNewItem表示新菜单项的资源ID标识符,lpszNewItem表示新菜单项的内容,pBmp用于菜单项的位图指针,nPosition表示新菜单项要插入的菜单项位置。nFlags表示要增加的新菜单项的状态信息,它的值影响其他参数的含义,如表4.3所示。,表4.3 nFlags的值及其对其他参数的影响,4.1菜单,需要注意的是: 当nFlags为MF_BYPOSITION时,nPosition表示新菜单项要插入的具体位置,为0时表示第一个菜单项,为 -1时,将菜单项添加菜单的末尾处。 n

7、Flags的标志中,可以用“|”(按位或)来组合,例如MF_CHECKED|MF_STRING等。但有些组合是不允许的。 当菜单项增加、改变或删除后,不管菜单依附的窗口是否改变,都应调用CWnd:DrawMenuBar来更新菜单。 4. 删除菜单项 BOOL DeleteMenu( UINT nPosition, UINT nFlags ); 其中,参数nPosition表示要删除的菜单项位置,它由nFlags进行说明。nFlags为MF_BYCOMMAND或者 MF_BYPOSITION。 另外一个函数:RemoveMenu();,4.1菜单,5. 获取菜单项 CMenu成员函数分别获得菜单

8、的项数、菜单项的ID标识符以及弹出式子菜单的句柄。 UINT GetMenuItemCount( ) const; 该函数用来获得菜单的菜单项数,调用失败后返回-1。 UINT GetMenuItemID( int nPos ) const; 该函数用来获得由nPos指定菜单项位置(以0为基数)的菜单项的标识号,若nPos是SEPARATOR(分隔符),则返回-1。 CMenu* GetSubMenu( int nPos ) const; 该函数用来获得指定菜单的弹出式菜单的菜单句柄。该弹出式菜单位置由参数nPos指定,开始的位置为0。若菜单不存在,则创建一个临时的菜单指针。,4.1菜单,(2

9、)选择“查看”“资源符号”(Resource Symbols)命令,弹出“资源符号”对话框,它能对应用程序中的资源标识符进行管理。,4.1菜单,(3)“新建符号”(New Symbol)对话框。 在“名称”(Name)框中输入一个新的标识符ID_NEW_MENUITEM。在“值”(Value)框中,输入该ID的值,系统要求用户定义的ID值应大于15(0X000F)而小于61440(0XF000)。,4.1菜单,(4)在CMainFrame:OnCreate函数中添加下列代码,该函数在框架窗口创建时自动调用。 int CMainFrame:OnCreate(LPCREATESTRUCT lpCr

10、eateStruct) . CMenu* pSysMenu = GetMenu();/ 获得程序菜单指针 CMenu* pSubMenu = pSysMenu-GetSubMenu(1);/ 获得第二个子菜单的指针 CString strMenuItem(新的菜单项); pSubMenu-AppendMenu(MF_SEPARATOR);/ 增加一水平分隔线 pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM, strMenuItem); / 在子菜单中增加一菜单项 m_bAutoMenuEnable = FALSE; / 关闭自动更新菜单状态,这样避免

11、添加的菜单项是禁用的 pSysMenu- EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED); / 激活菜单项 DrawMenuBar();/ 更新菜单 return 0; ,4.1菜单,(5)此时编译运行后,结果如图4.15所示。但此时选择“新的菜单项”命令不会有反应。,图4.15 程序添加的菜单项,(6)用MFC ClassWizard在CMainFrame添加OnCommand消息函数的重载,并添加下列代码: BOOL CMainFrame:OnCommand(WPARAM wParam, LPARAM lParam) / wP

12、aram的低字节表示菜单、控件、加速键的命令ID if (LOWORD(wParam) = ID_NEW_MENUITEM) MessageBox(你选中了新的菜单项); return CFrameWnd:OnCommand(wParam, lParam); ,4.1菜单,4.1.5 使用快捷菜单 快捷菜单是一种浮动的弹出式菜单。 CMenu:TrackPopupMenu函数原型如下: BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL ); 该函数用来显示一个浮动的弹出式菜单,其位

13、置由各参数决定。其中,nFlags表示菜单在屏幕显示的位置以及鼠标按钮标志。 x和y表示菜单的水平坐标和菜单的顶端的垂直坐标。 pWnd表示弹出菜单的窗口,此窗口将收到菜单全部的 WM_COMMAND消息。 lpRect是一个RECT结构或CRect类指针,它表示一个矩形区域, 用户单击这个区域时,弹出菜单不消失。而当lpRect为NULL时,若用户击在菜单外面, 菜单立刻消失。 右击鼠标时会向系统发送WM_CONTEXTMENU通知消息,客户区坐标和屏幕坐标,BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT

14、 lpRect = NULL ); 其中x,y为屏幕坐标 鼠标单击点处的坐标是客户区坐标,即以程序窗口中客户区左上角为坐标原点。 客户区坐标转化为屏幕坐标,函数原型: void ClientToScreen( LPPOINT lpPoint ) const; void ClientToScreen( LPRECT lpRect ) const; 举例 : void CExView:OnLButtonDown(UINT nFlags, CPoint point) ClientToScreen(/自己定义的工具条,4.2.3 加入用户自定义的工具条,(1)调用工具条类的Create()或Creat

15、eEx()成员函数创建该工具条 (2)调用LoadToolBar()成员函数将工具条对象和前面创建的工具条资源连接在一起。 if(!m_wndToolBar.Create(this,WS_VISIBLE|CBRS_TOP) |!m_wndToolBar.LoadToolBar(IDR_TESTBAR) /引入资源IDR_TESTBAR TRACE0(Failed to create toolbarn); return -1; / fail to create ,3 对工具条进行操作 创建完成工具条后,可调用工具条类中的成员函数对工具条进行操作,例如设定工具条风格,在窗口中移动工具条,控制工具条

16、的显隐等。 m_wndTestBar.SetBarStyle(CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 可在程序中设置允许用户在程序运行中在框架窗口内移动工具条。通过调用CToolBar:EnableDocking和CFrame:EnableDocking来实现的。二函数原型均如下: void EnableDocking( DWORD dwStyle ),4 控制工具条的显示 CFrameWnd:ShowControlBar函数就是起到这样的作用,有3个参数,第1个参数用来指定要操作的工具栏或状态栏指针,第2个参数是一个布尔型,当为TRU

17、E时表示显示,否则表示隐藏,第3个参数用来表示是否延迟显示或隐藏,当为FALSE时表示立即显示或隐藏。 void CMainFrame:OnViewNewbar() int bShow = m_wndTestBar.IsWindowVisible(); ShowControlBar( ,4.2工具栏,4.2.3 多个工具栏的使用 在用MFC AppWizard创建的文档应用程序中往往只有一个工具栏,但在实际应用中,常常需要多个工具栏。这里以一个实例的形式来讨论多个工具栏的创建、显示和隐藏等操作。 例Ex_MultiBar 多个工具栏的使用 (1)创建一个默认的单文档应用程序Ex_MultiBa

18、r。 (2)将项目工作区切换到ResourceView页面,展开“Toolbar”(工具栏)资源,用鼠标单击IDR_MAINFRAME不松开,然后按下Ctrl键,移动鼠标将IDR_MAINFRAME拖到 Toolbar资源名称上,这样就复制了工具栏默认资源IDR_MAINFRAME,复制后的资源 标识系统自动设为IDR_MAINFRAME1。 (3)右击工具栏资源IDR_MAINFRAME1,从弹出的快捷菜单中选择Properties命令,如图4.20所示,将ID设为IDR_TOOLBAR1。,图4.20 工具栏属性对话框,4.2工具栏,(4)双击IDR_TOOLBAR1,打开工具栏资源,删除

19、几个“编辑”相关的工具按钮(目的是让IDR_TOOLBAR1工具栏与IDR_MAINFRAME有明显区别)。 (5)在CMainFrame类中添加一个成员变量m_wndTestBar,变量类型为CToolBar(CToolBar类封装了工具栏的操作)。 protected: / control bar embedded members CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; CToolBar m_wndTestBar; (6)在CMainFrame:OnCreate函数中添加下面的工具栏创建代码: 分析和说明: 代码中,CreateE

20、x是CToolBar类的成员函数,用来创建一个工具栏对象。该函数的第1个参数是用来指定工具栏所在的父窗口指针,this表示当前的CMainFrame类窗口指针。第2个参数用来指针工具按钮的风格,当为TBSTYLE_FLAT时表示工具按钮是“平面”的。第3个参数用来指针工具栏的风格。由于这里的工具栏是CMainFrame的子窗口,因此需要指定WS_CHILD | WS_VISIBLE。CBRS_TOP表示工具栏放置在父窗口的顶部,CBRS_GRIPPER表示工具栏前面有一个“把手”,CBRS_TOOLTIPS表示允许有工具提示,CBRS_FLYBY表示在状态栏显示工具提示文本,CBRS_SIZE

21、_DYNAMIC表示工具栏在浮动时,其大小是可以动态改变的。第4个参数是用来指定工具栏四周的边框大小,一般都为0。最后一个参数是用来指定工具栏这个子窗口的标识ID(与工具栏资源标识不同)。,4.2工具栏, if语句中的LoadToolBar函数是用来装载工具栏资源。若CreateEx或LoadToolBar的返回值为0,即调用不成功,则显示诊断信息“Failed to create toolbar”。TRACE0是一个用于程序调试的跟踪宏。OnCreate函数返回-1时,主框架窗口被清除。 应用程序中的工具栏一般具有停靠或浮动特性,m_wndTestBar.EnableDocking使得m_w

22、ndTestBar对象可以停靠,CBRS_ALIGN_ANY表示可以停靠在窗口的任一边。EnableDocking(CBRS_ALIGN_ANY)是调用的是CFrameWnd类的成员函数,用来让工具栏或其他控制条在主框架窗口可以进行停靠操作。DockControlBar也是CFrameWnd类的成员函数,用来将指定的工具栏或其他控制条进行停靠。 AFX_IDW_TOOLBAR是系统内部的工具栏子窗口标识,并将AFX_IDW_TOOLBAR + 1的值表示默认的状态栏子窗口标识。如果在创建新的工具栏时没有指定相应的子窗口标识,则会使用默认的AFX_IDW_TOOLBAR。这样,当打开“查看”菜单

23、时,单击“工具栏”菜单时,显示或隐藏的工具栏不是原来的工具栏而是新添加的工具栏。因此,需要重新指定工具栏子窗口的标识,并使其值等于AFX_IDW_TOOLBAR + 10。,4.2工具栏,(7)编译运行,结果如图4.21所示。,图4.21 多个工具栏第一次运行的结果,(8)事实上多个工具栏的程序重点不是在于工具栏的显示,而是如何控制其显示。CFrameWnd:ShowControlBar函数就是起到这样的作用,有3个参数,第1个参数用来指定要操作的工具栏或状态栏指针,第2个参数是一个布尔型,当为TRUE时表示显示,否则表示隐藏,第3个参数用来表示是否延迟显示或隐藏,当为FALSE时表示立即显示

24、或隐藏。,4.2工具栏,(9)打开菜单资源IDR_MAINFRAME,在“查看”菜单下添加一个“新的工具栏( ,4.3状态栏,4.3.1 状态栏的定义 用MFC AppWizard(.exe)创建的SDI或MDI应用程序框架中,有一个静态的indicator数组,它是在MainFrm.cpp文件中指定的,被MFC用作状态栏的定义。,4.3状态栏,4.3.2 状态栏的常用操作: CStatusBar类 1. 增加和减少窗格 窗格分为信息行窗格和指示器窗格两类。 增加一个信息行窗格,则只需在indicators数组中的适当位置中增加一个ID_SEPARATOR标识即可; 增加一个用户指示器窗格,则

25、在indicators数组中的适当位置增加一个在字符串表中定义过的资源ID,其字符串的长度表示用户指示器窗格的大小。 减少一个窗格,只需减少indicators数组元素。 2. 在状态栏上显示文本 BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE ); 若bUpdate为TRUE,则系统自动更新显示的结果。,4.3状态栏,4.3.3 改变状态栏的风格 void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth ); void SetP

26、aneStyle( int nIndex, UINT nStyle ); 参数nIndex表示要设置的状态栏窗格的索引,nID用来为状态栏窗格指定新的ID,cxWidth表示窗格的像素宽度,nStyle表示窗格的风格类型,用来指定窗格的外观。,4.3状态栏,例Ex_SDIMouse 在状态栏上显示鼠标位置 (1)创建一个默认的单文档应用程序Ex_SDIMouse。 (2)将项目工作区切换到ClassView页面,展开CMainFrame所有项,双击构造函数CMainFrame,在文档窗口中出现该函数的定义,在它的前面就是状态栏数组的定义。 (3)将状态栏indicators数组的定义改为下列代

27、码: static UINT indicators = ID_SEPARATOR, ID_SEPARATOR, ; (4)由于鼠标移动消息WM_MOUSEMOVE在CMainFrame类映射后不起作用,因此只能映射到CEx_SDIMouseView类中。但是,这样一来,就需要更多的代码,因为状态栏对象m_wndStatusBar是在CMainFrame类定义的成员变量,因而需要在CEx_SDIMouseView类中添加访问CMainFrame类的代码。CEx_SDIMouseView:OnMouseMove函数代码如下:,4.3状态栏,void CEx_SDIMouseView:OnMouse

28、Move(UINT nFlags, CPoint point) CString str; CMainFrame* pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd; / 获得主窗口指针 CStatusBar* pStatus= ,4.3状态栏,代码中,AfxGetApp是CWinApp类的一个成员函数,该函数可在应用程序项目中的任何类中使用,用来获取应用程序中的CWinApp类对象指针。 (5)将MainFrm.h文件中的受保护变量m_wndStatusBar变成公共变量。 (6)在Ex_SDIMouseView.cpp文件的开始处增加下列语句: #incl

29、ude Ex_SDIMouseView.h #include MainFrm.h (7)编译并运行,结果如图4.23所示。,图4.23 鼠标的位置显示在状态栏上,4.3状态栏,例如,在前面的示例中,将OnMouseMove函数修改为下列代码,则结果如图4.24所示。 void CEx_SDIMouseView:OnMouseMove(UINT nFlags, CPoint point) CString str; CMainFrame* pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd; / 获得主窗口指针 CStatusBar* pStatus= / 获得主

30、窗口中的状态栏指针if (pStatus) ,pStatus-SetPaneStyle(1, SBPS_POPOUT); str.Format(X=%d, Y=%d,point.x, point.y); / 格式化文本 pStatus-SetPaneText(1,str); / 更新第二个窗格的文本 CView:OnMouseMove(nFlags, point); ,图4.24 设置状态栏的风格,4.4交互对象的动态更新,自动将用户交互对象的ID标识符与ON_UPDATE_COMMAND_UI宏相连接并产生处理更新消息的相应函数。 void CMainFrame:OnUpdateTestTo

31、olbar(CCmdUI* pCmdUI) int bShow = m_wndTestBar.IsWindowVisible(); pCmdUI -SetCheck( bShow ); 该函数参数是指向CCmdUI对象的指针。 CCmdUI 类仅用于ON_UPDATE_COMMAND_UI消息映射函数,它的成员函数将对菜单项、工具按钮等用户交互对象起作用。,命令更新,菜单项状态的维护是依赖于CN_UPDATE_COMMAND_UI消息,谁捕获CN_UPDATE_COMMAND_UI消息,MFC就在其中创建一个CCmdUI对象。我们可以通过手工或利用ClassWizard在消息映射中添加ON_U

32、PDATE_COMMAND_UI宏来捕获CN_UPDATE_COMMAND_UI消息。 后台所做的工作是:操作系统发出WM_INITMENUPOPUP消息,然后由MFC的基类如CFrameWnd接管。它创建一个CCmdUI对象,并与第一个菜单项相关联,调用对象的一个成员函数DoUpdate()。这个函数发出CN_UPDATE_COMMAND_UI消息,这条消息带有指向CCmdUI对象的指针。同一个CCmdUI对象就设置为与第二个菜单项相关联,这样顺序进行,直到完成所有菜单项。 更新命令UI处理程序仅应用于弹出式菜单项上的项目,不能应用于永久显示的顶级菜单项目。,重点: 菜单的静态和动态控制 理

33、解交互对象的动态更新机制,4.5综合应用,例Ex_A4,其中弹出对话框即图4-26改为使用图3-57(b).,4.5综合应用,为了能对学生成绩记录进行管理,常见的操作包括:添加、删除和查找等。 这些操作在在文档应用程序中实现时可以有多种界面方法,具体如下: (1)构造单独的“操作”工具栏,包含上述操作的工具按钮。 (2)在文档应用程序的主菜单中的“查看”菜单下添加一个“操作工具栏( ShowControlBar( ,4.5综合应用,(5)修改CMainFrame:OnCreate中的后面代码: int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) m_wndOpBar.SetWindowTex

温馨提示

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

最新文档

评论

0/150

提交评论