window第4章菜单、工具栏和状态栏课件

上传人:艳*** 文档编号:242964125 上传时间:2024-09-12 格式:PPT 页数:50 大小:323.50KB
返回 下载 相关 举报
window第4章菜单、工具栏和状态栏课件_第1页
第1页 / 共50页
window第4章菜单、工具栏和状态栏课件_第2页
第2页 / 共50页
window第4章菜单、工具栏和状态栏课件_第3页
第3页 / 共50页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第四章 菜单、工具栏和状态栏,4.1菜单,4.2工具栏,4.3状态栏,4.4交互对象的动态更新,4.5综合应用,view-doc-mainframe-app,4.1菜单,菜单是一系列命令的列表,通过选中其中的菜单项(命令)来执行相应任务。,菜单系统的设计规则:, 菜单项文本后有“”, 将弹出一个对话框。, 若某项菜单有子菜单,那么在该菜单项文本后有“,”。, 助记符,则用括号将带下划线的字母括起来。助记符与Alt构成一个组合键。, 若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。所谓“快捷键”是一个组合键,如Ctrl+N。,顶层菜单,,每一个顶层菜单项可以是一个简单的菜单命令,也可以是,下拉,(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( ,/ 设置应用程序菜单,LoadMenu和Detach都是,CMenu类,成员函数.,在调用LoadMenu后,菜单对象m_NewMenu就拥有一个菜单句柄,当再次调用LoadMenu时,由于菜单对象的句柄已经创建,因而会发生运行时错误,但当菜单对象与菜单句柄分离后,就可以再次创建菜单了。,SetMenu是,CWnd类,的一个成员函数,用来设置应用程序的菜单。,4.1菜单,4.1.4 菜单的编程控制,1. 创建菜单,CMenu类的CreateMenu和CreatePopupMenu分别用来创建一个菜单或子菜单框架,它们的原型如下:,BOOL CreateMenu( ); /,产生一个空菜单,BOOL CreatePopupMenu( );/,产生一个空的弹出式子菜单,2. 装入菜单,将菜单从资源装入应用程序中,需调用CMenu成员函数LoadMenu,或者用SetMenu对应用程序菜单进行重新设置。,BOOL LoadMenu( LPCTSTR,lpszResourceName,);,BOOL LoadMenu( UINT,nIDResource,);,lpszResourceName为菜单资源名称,nIDResource为菜单资源ID标识符。,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,);,其中,nIDNewItem表示新菜单项的资源ID标识符,lpszNewItem表示新菜单项的内容,pBmp用于菜单项的位图指针,nPosition表示新菜单项要插入的菜单项位置。nFlags表示要增加的新菜单项的状态信息,它的值影响其他参数的含义,如表4.3所示。,表4.3 nFlags的值及其对其他参数的影响,4.1菜单,需要注意的是:, 当nFlags为MF_BYPOSITION时,nPosition表示新菜单项要插入的具体位置,为0时表示第一个菜单项,为 -1时,将菜单项添加菜单的末尾处。, nFlags的标志中,可以用“|”(按位或)来组合,例如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成员函数,分别获得菜单的项数、菜单项的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)选择“查看”“资源符号”(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 lpCreateStruct),.,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; / 关闭自动更新菜单状态,这样避免添加的菜单项是禁用的,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),/ wParam的低字节表示菜单、控件、加速键的命令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 );,该函数用来显示一个浮动的弹出式菜单,其位置由各参数决定。其中,nFlags表示菜单在屏幕显示的位置以及鼠标按钮标志。,x和y表示菜单的水平坐标和菜单的顶端的垂直坐标。,pWnd表示弹出菜单的窗口,此窗口将收到菜单全部的 WM_COMMAND消息。,lpRect是一个RECT结构或CRect类指针,它表示一个矩形区域, 用户单击这个区域时,弹出菜单不消失。而当lpRect为NULL时,若用户击在菜单外面, 菜单立刻消失。,右击鼠标时会向系统发送WM_CONTEXTMENU通知消息,客户区坐标和屏幕坐标,BOOL TrackPopupMenu( UINT,nFlags,int,x, int,y,CWnd*,pWnd, LPCRECT,lpRect,= NULL );,其中x,y为,屏幕坐标,鼠标单击点处的坐标是,客户区坐标,,即以程序窗口中客户区左上角为坐标原点。,客户区坐标转化为屏幕坐标,函数原型:,void ClientToScreen( LPPOINT lpPoint ) const;,void ClientToScreen( LPRECT lpRect ) const;,举例 :,void CExView:OnLButtonDown(UINT nFlags, CPoint point), ClientToScreen(&point);,4.2工具栏,4.2.1 使用工具栏编辑器,在项目工作区窗口中选择ResourceView页面,双击“Toolbar”项中的IDR_MAINFRAME,则在主界面的右边出现工具栏编辑器。,空按钮,图形工具箱,颜色工具箱,1 工具条类的层次位置及其常用方法,工具条由CWnd类派生的,它们都连接到一个Windows应用程序窗口。因此,CWnd的所有功能如创建、移动、显示和隐藏窗口等在用控制条工作时都是可用的。,Create():创建一个工具条并把它附加到CToolBar对象上,CreateEx():创建一个定义了边界的工具条并附加到CToolBar对象上,SetSizes():设置按钮及位图大小,SetHeight():设置工具条的高度,LoadToolBar():装载工具条资源,LoadBitmap():装载包含工具按钮图像的位图,SetBitmap():设置位图图像,SetButtons():设置按钮并使每个按钮与位图图像相关,CToolBar的方法,4.2工具栏,创建一个新的工具栏按钮,移动一个按钮,删除一个按钮,将选取中的按钮拖离工具栏,则该按钮就消失。,单击Delete键并不能删除一个按钮,只是将按钮中的图形全部以背景色填充。,在工具栏中插入空格,工具栏按钮属性的设置,4.2.2 工具按钮和菜单项相结合,工具按钮和菜单项相结合,就是指当选择工具按钮或菜单命令时,操作结果是一样的。实现的具体方法是在工具按钮的属性对话框中将按钮的ID号设置为相关联的菜单项ID。,(1)增加工具条资源,Insert,Resource,Toolbar,New插入新的工具条资源。,(2)将工具条添加到窗口中,添加后,需把工具条的对象加入到应用程序框架窗口中(CMainFrame)。在应用程序的CMainFrame类中加入工具条对象m_wndT,est,Bar,protected:,CToolBar m_wndT,est,Bar;/自己定义的工具条,4.,2,.3,加入用户自定义的工具条,(1),调用工具条类的Create()或CreateEx()成员函数创建该工具条,(2),调用LoadToolBar()成员函数将工具条对象和前面创建的工具条资源连接在一起。,if(!m_wndToolBar.Create(this,WS_VISIBLE,|,CBRS_TOP),|,!m_wndToolBar.LoadToolBar(IDR_T,EST,BAR),/引入资源IDR_T,EST,BAR,TRACE0(Failed to create toolbarn);,return -1; / fail to create,3 对工具条进行操作,创建完成工具条后,可调用工具条类中的成员函数对工具条进行操作,例如设定工具条风格,在窗口中移动工具条,控制工具条的显隐等。,m_wndT,est,Bar.SetBarStyle(CBRS_TOOLTIPS,| CBRS_FLYBY | CBRS_SIZE_DYNAMIC);,可在程序中设置允许用户在程序运行中在框架窗口内移动工具条。通过调用CToolBar:EnableDocking和CFrame:EnableDocking来实现的。二函数原型均如下:,void EnableDocking( DWORD dwStyle ),4,控制工具条,的,显示,CFrameWnd:ShowControlBar函数就是起到这样的作用,有3个参数,第1个参数用来指定要操作的工具栏或状态栏指针,第2个参数是一个布尔型,当为TRUE时表示显示,否则表示隐藏,第3个参数用来表示是否延迟显示或隐藏,当为FALSE时表示立即显示或隐藏。,void CMainFrame:OnViewNewbar(),int bShow = m_wndTestBar.IsWindowVisible();,ShowControlBar( ,4.2工具栏,4.2.3 多个工具栏的使用,在用MFC AppWizard创建的文档应用程序中往往只有一个工具栏,但在实际应用中,常常需要多个工具栏。这里以一个实例的形式来讨论多个工具栏的创建、显示和隐藏等操作。,例Ex_MultiBar 多个工具栏的使用,(1)创建一个默认的单文档应用程序Ex_MultiBar。,(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,打开工具栏资源,删除几个“编辑”相关的工具按钮(目的是让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函数中添加下面的工具栏创建,代码,:,分析和说明:,代码中,CreateEx是CToolBar类的成员函数,用来创建一个工具栏对象。该函数的第1个参数是用来指定工具栏所在的父窗口指针,this表示当前的CMainFrame类窗口指针。第2个参数用来指针工具按钮的风格,当为TBSTYLE_FLAT时表示工具按钮是“平面”的。第3个参数用来指针工具栏的风格。由于这里的工具栏是CMainFrame的子窗口,因此需要指定WS_CHILD | WS_VISIBLE。CBRS_TOP表示工具栏放置在父窗口的顶部,CBRS_GRIPPER表示工具栏前面有一个“把手”,CBRS_TOOLTIPS表示允许有工具提示,CBRS_FLYBY表示在状态栏显示工具提示文本,CBRS_SIZE_DYNAMIC表示工具栏在浮动时,其大小是可以动态改变的。第4个参数是用来指定工具栏四周的边框大小,一般都为0。最后一个参数是用来指定工具栏这个子窗口的标识ID(与工具栏资源标识不同)。,4.2工具栏,if语句中的LoadToolBar函数是用来装载工具栏资源。若CreateEx或LoadToolBar的返回值为0,即调用不成功,则显示诊断信息“Failed to create toolbar”。TRACE0是一个用于程序调试的跟踪宏。OnCreate函数返回-1时,主框架窗口被清除。,应用程序中的工具栏一般具有停靠或浮动特性,m_wndTestBar.EnableDocking使得m_wndTestBar对象可以停靠,CBRS_ALIGN_ANY表示可以停靠在窗口的任一边。EnableDocking(CBRS_ALIGN_ANY)是调用的是CFrameWnd类的成员函数,用来让工具栏或其他控制条在主框架窗口可以进行停靠操作。DockControlBar也是CFrameWnd类的成员函数,用来将指定的工具栏或其他控制条进行停靠。,AFX_IDW_TOOLBAR是系统内部的,工具栏子窗口标识,,并将AFX_IDW_TOOLBAR + 1的值表示默认的,状态栏子窗口标识,。如果在创建新的工具栏时没有指定相应的子窗口标识,则会使用默认的AFX_IDW_TOOLBAR。这样,当打开“查看”菜单时,单击“工具栏”菜单时,显示或隐藏的工具栏不是原来的工具栏而是新添加的工具栏。因此,需要重新指定工具栏子窗口的标识,并使其值等于AFX_IDW_TOOLBAR + 10。,4.2工具栏,(7)编译运行,结果如图4.21所示。,图4.21 多个工具栏第一次运行的结果,(8)事实上多个工具栏的程序重点不是在于工具栏的显示,而是如何控制其显示。CFrameWnd:ShowControlBar函数就是起到这样的作用,有3个参数,第1个参数用来指定要操作的工具栏或状态栏指针,第2个参数是一个布尔型,当为TRUE时表示显示,否则表示隐藏,第3个参数用来表示是否延迟显示或隐藏,当为FALSE时表示立即显示或隐藏。,4.2工具栏,(9)打开菜单资源IDR_MAINFRAME,在“查看”菜单下添加一个“新的工具栏(&N)”菜单命令(ID_VIEW_NEWBAR)。,(10)用MFC ClassWizard在CMainFrame添加ID_VIEW_NEWBAR的COMMAND消息映射,保留默认的消息处理函数名,添加下列代码:,void CMainFrame:OnViewNewbar(),int bShow = m_wndTestBar.IsWindowVisible();,ShowControlBar( ,4.3状态栏,4.3.1 状态栏的定义,用MFC AppWizard(.exe)创建的SDI或MDI应用程序框架中,有一个静态的indicator数组,它是在,MainFrm.cpp文件中,指定的,,被MFC用作状态栏的定义。,Static UINT indicators=,ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,图4.22 indicators数组的定义,4.3状态栏,4.3.2 状态栏的常用操作,:,CStatusBar类,1. 增加和减少窗格,窗格分为,信息行窗格和指示器窗格,两类。,增加一个信息行窗格,则只需在indicators数组中的适当位置中增加一个ID_SEPARATOR标识即可;,增加一个用户指示器窗格,则在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 SetPaneStyle( int,nIndex, UINT,nStyle,);,参数nIndex表示要设置的状态栏窗格的索引,nID用来为状态栏窗格指定新的ID,cxWidth表示窗格的像素宽度,nStyle表示窗格的风格类型,用来指定窗格的外观。,4.3状态栏,例Ex_SDIMouse 在状态栏上显示鼠标位置,(1)创建一个默认的单文档应用程序Ex_SDIMouse。,(2)将项目工作区切换到ClassView页面,展开CMainFrame所有项,双击构造函数CMainFrame,在文档窗口中出现该函数的定义,在它的前面就是状态栏数组的定义。,(3)将状态栏indicators数组的定义改为下列代码:,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:OnMouseMove(UINT nFlags, CPoint point),CString str;,CMainFrame* pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;,/ 获得主窗口指针,CStatusBar* pStatus= / 获得主窗口中的状态栏指针,if (pStatus),str.Format(X=%d, Y=%d,point.x, point.y); / 格式化文本,pStatus-SetPaneText(1,str); / 更新第二个窗格的文本,CView:OnMouseMove(nFlags, point);,4.3状态栏,代码中,AfxGetApp是CWinApp类的一个成员函数,该函数可在应用程序项目中的任何类中使用,用来获取应用程序中的CWinApp类对象指针。,(5)将MainFrm.h文件中的受保护变量m_wndStatusBar变成公共变量。,(6)在Ex_SDIMouseView.cpp文件的开始处增加下列语句:,#include 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= / 获得主窗口中的状态栏指针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:OnUpdateTestToolbar(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_UPDATE_COMMAND_UI宏来捕获CN_UPDATE_COMMAND_UI消息。,后台所做的工作是:操作系统发出WM_INITMENUPOPUP消息,然后由MFC的基类如CFrameWnd接管。它创建一个CCmdUI对象,并与第一个菜单项相关联,调用对象的一个成员函数DoUpdate()。这个函数发出CN_UPDATE_COMMAND_UI消息,这条消息带有指向CCmdUI对象的指针。同一个CCmdUI对象就设置为与第二个菜单项相关联,这样顺序进行,直到完成所有菜单项。,更新命令UI处理程序仅应用于弹出式菜单项上的项目,不能应用于永久显示的顶级菜单项目。,重点:,菜单的,静态和动态,控制,理解交互对象的动态更新,机制,4.5综合应用,例Ex_A4,其中弹出对话框即图4-26改为使用图3-57(b).,4.5综合应用,为了能对学生成绩记录进行管理,常见的操作包括:添加、删除和查找等。 这些操作在在文档应用程序中实现时可以有多种界面方法,具体如下:,(1)构造单独的“操作”工具栏,包含上述操作的工具按钮。,(2)在文档应用程序的主菜单中的“查看”菜单下添加一个“操作工具栏(&O)”菜单命令,用来控制“操作”工具栏的显示。,(3)当“操作”工具栏显示时,“操作工具栏(&O)”菜单命令前面有一个“”,且在 “帮助”菜单项前面出现“操作(&O)”菜单项,包含用于添加、删除和查找的各个子菜单项。,(4)当“操作”工具栏隐藏时,“操作(&O)”菜单项消失,且“操作工具栏(&O)”菜单命令前面没有任何标记。用快捷键Ctrl+1关联“操作工具栏(&O)”菜单命令。,(5)单击操作工具栏的“添加”按钮或选择“操作”菜单中的“添加”命令,弹出“学生成绩”对话框,单击确定按钮,学生成绩记录显示在状态栏上。结果如图4.25所示。,4.5综合应用,图4.25 综合应用题图,具体实现步骤如下(分四步阐述:设计学生成绩对话框、设计“操作”工具栏和菜单、添加联动代码、修改状态栏完善代码):,例Ex_A4 第四章综合应用,1)设计学生成绩对话框,4.5综合应用,(1)用MFC AppWizard(exe)创建一个默认的单文档应用程序Ex_A4。,(2)添加一个新的对话框资源,通过其属性对话框,将ID标识符改为IDD_SCORE,标题为“学生成绩”,将对话框字体改为“宋体,9号”。,(3)显示对话框网格,调整对话框的大小,向对话框添加如表3.7所示的控件,调整控件的位置,结果如图4.26所示。,图4.26 设计的学生成绩对话框,表4.8 学生成绩对话框添加的控件,4.5综合应用,(4)双击对话框模板空白处,为该对话框模板创建一个对话框类CScoreDlg。,(5)在MFC ClassWizard的Member Variables页面中,确定Class name中是否已选择了CScoreDlg,选中所需的控件ID标识符,双击鼠标或单击Add Variables按钮。依次为表4.9控件增加成员变量。,表4.9 控件变量,4.5综合应用,2)设计“操作”工具栏和菜单,(1)按Ctrl+R快捷键,在“插入资源”对话框中,选中“Toolbar”类型,单击新建按钮,这样就会为应用程序添加一个工具栏资源,并自动打开相应的编辑器,且第一次添加的默认ID为IDR_TOOLBAR1。,(2)按图4.27所示,用工具栏资源编辑器为IDR_TOOLBAR1添加3个按钮,其ID号依次设为:ID_OP_ADD、ID_OP_DEL和ID_OP_SEEK。,图4.27 工具栏设计,4.5综合应用,(3)在CMainFrame类中添加一个成员变量m_wndOpBar,变量类型为CToolBar。,(4)在CMainFrame:OnCreate函数中添加下面的工具栏创建,代码,:,(5)按Ctrl+R快捷键,在“插入资源”对话框中,选中“Menu”类型,单击新建按钮,这样就会为应用程序添加一个菜单资源,并自动打开相应的编辑器,且第一次添加的默认ID为IDR_MENU1。,(6)添加“操作”顶层下拉菜单,其子菜单依次为“添加(&A)”(ID_OP_ADD)、“删除(&D)”(ID_OP_DEL)和“查找(&K)”(ID_OP_SEEK)。,(7)在ResourceView页面中,双击资源“Menu”中的IDR_MAINFRAME,在“查看”菜单的最后添加一个菜单命令项“操作工具栏(&O)tCtrl+1”(ID_VIEW_OP)。,3)添加联动代码,(1)在项目工作区窗口的ResourceView(资源视图)页面中,展开中Accelerator(加速键)的资源项,双击IDR_MAINFRAME。在右侧窗口中出现如图4.7的加速键资源列表。,(2)双击加速键列表的最下端的空行,在弹出的“Accel 属性”(Accel Properties)对话框 中 将ID号选为ID_VIEW_OP,然后单击下一键按钮,并按下Ctrl+1作为此加速键的键值。关闭“Accel 属性”对话框。,4.5综合应用,(3)为CMainFrame类添加一个CMenu类的成员变量m_popMenu,以及一个成员函数UpdateOpMenu,,代码如下,:,(4)按Ctrl+W键打开MFC ClassWizard对话框,切换到Message Maps页面,在CMainFrame类中添加ID_VIEW_OP命令的COMMAND和UPDATE_COMMAND_UI消息映射,保留默认的映射函数名,添加下列代码:,void CMainFrame:OnViewOp(),int bShow = m_wndOpBar.IsWindowVisible();,ShowControlBar( ,UpdateOpMenu( !bShow );,void CMainFrame:OnUpdateViewOp(CCmdUI* pCmdUI),int bShow = m_wndOpBar.IsWindowVisible();,pCmdUI -SetCheck( bShow );,4.5综合应用,(5)修改CMainFrame:OnCreate中的后面代码:,int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct),m_wndOpBar.SetWindowText(操作);,m_popMenu.LoadMenu( IDR_MENU1 );,UpdateOpMenu( TRUE );,return 0;,(6)编译运行并测试。此时会发现工具栏、菜单项和快捷键的联动功能已实现,但“操作”菜单项和工具按钮都是灰显的,这是因为还没有对这些命令进行映射。,4)修改状态栏,完善代码,(1)将项目工作区切换到ClassView页面,展开CMainFrame所有项,双击构造函数CMainFrame,在文档窗口中出现该函数的定义,在它的前面就是状态栏数组的定义。,(2)将状态栏indicators数组的定义改为下列代码:,static UINT indicators =,ID_SEPARATOR,ID_SEPARATOR,;,4.5综合应用,(3)按Ctrl+W键打开MFC ClassWizard对话框,切换到Message Maps页面,在CMainFrame类中分别添加ID_OP_ADD、ID_OP_DEL和ID_OP_SEEK 的COMMAND消息映射,保留默认的映射函数名。其中,仅对OnOpAdd添加下列代码(因为其他2个命令的映射仅使相应的菜单命令项和工具按钮有效):,void CMainFrame:OnOpAdd(),CScoreDlg dlg;,if (IDOK = dlg.DoModal() ),/ 当输入记录有效后,获取相关记录,然后在状态上显示出来,CString strRes;,strRes.Format( 姓名:%s, 学号:%s, 3门成绩: %.1f, %0.1f, %.1f,dlg.m_strName, dlg.m_strNO, dlg.m_fScore1, dlg.m_fScore2, dlg.m_fScore3 );,m_wndStatusBar.SetPaneText( 1, strRes );, else,m_wndStatusBar.SetPaneText( 1, 无有效的学生成绩记录! );,4.5综合应用,(4)在MainFrm.cpp文件的前面添加CScoreDlg类的头文件包含:,#include MainFrm.h,#include ScoreDlg.h,(5)编译运行并测试。,总之,菜单命令(包括快捷菜单)、工具栏上的按钮以及快捷键是构成文档应用程序框架的最基本命令系统,而提示文本、交互对象更新状态和状态栏等是构成文档应用程序框架的最基本信息系统,这些都是属于文档应用程序框架的界面问题。事实上,文档应用程序的界面设计中还有图标、光标以及框架窗口的样式设置等一系列问题,下一章就来讨论。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!