window第4章菜单工具栏和状态栏_第1页
window第4章菜单工具栏和状态栏_第2页
window第4章菜单工具栏和状态栏_第3页
window第4章菜单工具栏和状态栏_第4页
window第4章菜单工具栏和状态栏_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

第四章菜单、工具栏和状态栏4.1菜单4.2工具栏4.3状态栏4.4交互对象的动态更新4.5综合应用view-doc-mainframe-app1.

4.1菜单

菜单是一系列命令的列表,通过选中其中的菜单项〔命令〕来执行相应任务。菜单系统的设计规那么:●菜单项文本后有“…〞,将弹出一个对话框。●假设某项菜单有子菜单,那么在该菜单项文本后有“〞。●助记符,那么用括号将带下划线的字母括起来。助记符与Alt构成一个组合键。●假设某项菜单需要快捷键的支持,那么一般将其列在相应菜单项文本之后。所谓“快捷键〞是一个组合键,如Ctrl+N。顶层菜单,每一个顶层菜单项可以是一个简单的菜单命令,也可以是下拉〔Popup〕菜单。2.4.1菜单表4.1菜单General属性对话框的各项含义项目含义ID菜单的资源ID标识符标题(Caption)用来标识菜单项显示文本。助记符字母的前面须有一个&符号,这个字母与Alt构成组合键。分隔符(Separator)选中时,菜单项是一个分隔符或是一条水平线已复选(Checked)选中时,菜单项文本前显示一个选中标记弹出(Pop_up)选中时,菜单项含有一个弹出式子菜单已变灰(Grayed)选中时,菜单项显示是灰色的,用户不能选用非活动(Inactive)选中时,菜单项没有被激活,用户不能选用帮助(Help)选中时,菜单项在程序运行时被放在顶层菜单的最右端中断(Break,分块)当为“列”(Column)时,对于顶层菜单上的菜单项来说,被放置在另外一行上,而对于弹出式子菜单的菜单项来说,则被放置在另外一列上;当为“条”(Bar)时,与Column相同,只不过对于弹出式子菜单来说,它还在新列与原来的列之间增加一条竖直线;注意这些效果只能在程序运行后才能看到。提示(Prompt)用来指明光标移至该菜单项时在状态栏上显示的提示信息3.4.1.2使用键盘快捷键(Accelerator)加速键也往往被称为键盘快捷键,一个加速键就是一个按键或几个按键的组合,它用于激活特定的命令。加速键也是一种资源,它的显示、编辑过程和菜单相似。项目含义ID指定资源ID号的列表项,为了能和菜单联用,通常选择某菜单项的ID号辅助键(Modifiers)用来确定Ctrl、Alt、Shift是否是构成加速键的组成部分类型(Type)用来确定该加速键的值是虚拟键(VirKey)还是ASCII字符键键(Key)是指启动加速键的键盘按键下一键(NextKeyTyped)单击此按钮后,用户操作的任何按键将成为此加速键的键值4.4.1菜单voidCMainFrame::OnTestReturn(){m_NewMenu.Detach(); //使菜单对象和菜单句柄别离m_NewMenu.LoadMenu(IDR_MAINFRAME);SetMenu(NULL); //去除应用程序菜单SetMenu(&m_NewMenu);//设置应用程序菜单}LoadMenu和Detach都是CMenu类成员函数.在调用LoadMenu后,菜单对象m_NewMenu就拥有一个菜单句柄,当再次调用LoadMenu时,由于菜单对象的句柄已经创立,因而会发生运行时错误,但当菜单对象与菜单句柄别离后,就可以再次创立菜单了。SetMenu是CWnd类的一个成员函数,用来设置应用程序的菜单。5.4.1菜单4.1.4菜单的编程控制1.创立菜单CMenu类的CreateMenu和CreatePopupMenu分别用来创立一个菜单或子菜单框架,它们的原型如下:BOOLCreateMenu(); //产生一个空菜单BOOLCreatePopupMenu(); //产生一个空的弹出式子菜单2.装入菜单将菜单从资源装入应用程序中,需调用CMenu成员函数LoadMenu,或者用SetMenu对应用程序菜单进行重新设置。BOOLLoadMenu(LPCTSTRlpszResourceName);BOOLLoadMenu(UINTnIDResource);lpszResourceName为菜单资源名称nIDResource为菜单资源ID标识符。

6.

3.添加菜单项

AppendMenu或InsertMenu函数来添加一些菜单项。AppendMenu是将菜单项添加在菜单的末尾处,而InsertMenu在菜单的指定位置处插入菜单项,并将后面的菜单项依次下移。BOOLAppendMenu(UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);BOOLAppendMenu(UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem=0,LPCTSTRlpszNewItem=NULL);BOOLInsertMenu(UINTnPosition,UINTnFlags,UINTnIDNewItem,constCBitmap*pBmp);其中,nIDNewItem表示新菜单项的资源ID标识符,lpszNewItem表示新菜单项的内容,pBmp用于菜单项的位图指针,nPosition表示新菜单项要插入的菜单项位置。nFlags表示要增加的新菜单项的状态信息,它的值影响其他参数的含义,如表4.3所示。7.表4.3nFlags的值及其对其他参数的影响nFlags值含义nPosition值nIDNewItem值lpszNewItem值MF_BYCOMMAND菜单项以ID标识符来标识菜单项资源IDMF_BYPOSITION菜单项以位置来标识菜单项的位置MF_POPUP菜单项有弹出式子菜单弹出式菜单句柄MF_SEPARATOR分隔线忽略忽略MF_OWNERDRAW自画菜单项自画所需数据MF_STRING字符串标志字符串指针MF_CHECKED设置菜单项的选中标记MF_UNCHECKED取消选中标记MF_DISABLED禁用菜单项MF_ENABLED允许用菜单项MF_GRAYED菜单项灰显8.4.1菜单需要注意的是:●当nFlags为MF_BYPOSITION时,nPosition表示新菜单项要插入的具体位置,为0时表示第一个菜单项,为-1时,将菜单项添加菜单的末尾处。●nFlags的标志中,可以用“|〞(按位或)来组合,例如MF_CHECKED|MF_STRING等。但有些组合是不允许的。●当菜单项增加、改变或删除后,不管菜单依附的窗口是否改变,都应调用CWnd::DrawMenuBar来更新菜单。4.删除菜单项BOOLDeleteMenu(UINTnPosition,UINTnFlags);其中,参数nPosition表示要删除的菜单项位置,它由nFlags进行说明。nFlags为MF_BYCOMMAND或者MF_BYPOSITION。另外一个函数:RemoveMenu();9.4.1菜单5.获取菜单项CMenu成员函数分别获得菜单的项数、菜单项的ID标识符以及弹出式子菜单的句柄。UINTGetMenuItemCount()const;该函数用来获得菜单的菜单项数,调用失败后返回-1。UINTGetMenuItemID(intnPos)const;该函数用来获得由nPos指定菜单项位置(以0为基数)的菜单项的标识号,假设nPos是SEPARATOR(分隔符),那么返回-1。CMenu*GetSubMenu(intnPos)const;该函数用来获得指定菜单的弹出式菜单的菜单句柄。该弹出式菜单位置由参数nPos指定,开始的位置为0。假设菜单不存在,那么创立一个临时的菜单指针。

10.4.1菜单〔2〕选择“查看〞→“资源符号〞〔ResourceSymbols〕命令,弹出“资源符号〞对话框,它能对应用程序中的资源标识符进行管理。11.4.1菜单〔3〕“新建符号〞〔NewSymbol〕对话框。在“名称〞〔Name〕框中输入一个新的标识符ID_NEW_MENUITEM。在“值〞〔Value〕框中,输入该ID的值,系统要求用户定义的ID值应大于15(0X000F)而小于61440(0XF000)。12.4.1菜单〔4〕在CMainFrame::OnCreate函数中添加以下代码,该函数在框架窗口创立时自动调用。intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ ... CMenu*pSysMenu=GetMenu(); //获得程序菜单指针 CMenu*pSubMenu=pSysMenu->GetSubMenu(1); //获得第二个子菜单的指针 CStringstrMenuItem("新的菜单项"); 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(); //更新菜单 return0;}13.4.1菜单〔5〕此时编译运行后,结果如图4.15所示。但此时选择“新的菜单项〞命令不会有反响。图4.15程序添加的菜单项〔6〕用MFCClassWizard在CMainFrame添加OnCommand消息函数的重载,并添加以下代码:BOOLCMainFrame::OnCommand(WPARAMwParam,LPARAMlParam){//wParam的低字节表示菜单、控件、加速键的命令IDif(LOWORD(wParam)==ID_NEW_MENUITEM)MessageBox("你选中了新的菜单项"); returnCFrameWnd::OnCommand(wParam,lParam);}14.4.1菜单4.1.5使用快捷菜单快捷菜单是一种浮动的弹出式菜单。

CMenu::TrackPopupMenu函数原型如下:BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);该函数用来显示一个浮动的弹出式菜单,其位置由各参数决定。其中,nFlags表示菜单在屏幕显示的位置以及鼠标按钮标志。x和y表示菜单的水平坐标和菜单的顶端的垂直坐标。pWnd表示弹出菜单的窗口,此窗口将收到菜单全部的WM_COMMAND消息。lpRect是一个RECT结构或CRect类指针,它表示一个矩形区域,用户单击这个区域时,弹出菜单不消失。而当lpRect为NULL时,假设用户击在菜单外面,菜单立刻消失。右击鼠标时会向系统发送WM_CONTEXTMENU通知消息nFlags值含义TPM_CENTERALIGN屏幕位置标志,表示菜单的水平中心位置由x坐标确定TPM_LEFTALIGN屏幕位置标志,表示菜单的左边位置由x坐标确定TPM_RIGHTALIGN屏幕位置标志,表示菜单的右边位置由x坐标确定TPM_LEFTBUTTON鼠标按钮标志,表示当用户单击鼠标左键时弹出菜单TPM_RIGHTBUTTON鼠标按钮标志,表示用户单击鼠标右键时弹出菜单15.客户区坐标和屏幕坐标BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);其中x,y为屏幕坐标鼠标单击点处的坐标是客户区坐标,即以程序窗口中客户区左上角为坐标原点。客户区坐标转化为屏幕坐标,函数原型:voidClientToScreen(LPPOINTlpPoint)const;voidClientToScreen(LPRECTlpRect)const;举例:voidCExView::OnLButtonDown(UINTnFlags,CPointpoint){ClientToScreen〔&point〕;}16.4.2工具栏4.2.1使用工具栏编辑器在工程工作区窗口中选择ResourceView页面,双击“Toolbar〞项中的IDR_MAINFRAME,那么在主界面的右边出现工具栏编辑器。空按钮图形工具箱颜色工具箱17.1工具条类的层次位置及其常用方法

工具条由CWnd类派生的,它们都连接到一个Windows应用程序窗口。因此,CWnd的所有功能如创立、移动、显示和隐藏窗口等在用控制条工作时都是可用的。18.Create():创立一个工具条并把它附加到CToolBar对象上CreateEx():创立一个定义了边界的工具条并附加到CToolBar对象上SetSizes():设置按钮及位图大小SetHeight():设置工具条的高度LoadToolBar():装载工具条资源LoadBitmap():装载包含工具按钮图像的位图SetBitmap():设置位图图像SetButtons():设置按钮并使每个按钮与位图图像相关CToolBar的方法19.4.2工具栏创立一个新的工具栏按钮移动一个按钮删除一个按钮将选取中的按钮拖离工具栏,那么该按钮就消失。单击Delete键并不能删除一个按钮,只是将按钮中的图形全部以背景色填充。在工具栏中插入空格工具栏按钮属性的设置4.2.2工具按钮和菜单项相结合工具按钮和菜单项相结合就是指中选择工具按钮或菜单命令时,操作结果是一样的。实现的具体方法是在工具按钮的属性对话框中将按钮的ID号设置为相关联的菜单项ID。20.(1)增加工具条资源InsertResourceToolbarNew插入新的工具条资源。(2)将工具条添加到窗口中添加后,需把工具条的对象参加到应用程序框架窗口中(CMainFrame)。在应用程序的CMainFrame类中参加工具条对象m_wndTestBarprotected: CToolBarm_wndTestBar; //自己定义的工具条4.2.3参加用户自定义的工具条21.(1)调用工具条类的Create()或CreateEx()成员函数创立该工具条(2)调用LoadToolBar()成员函数将工具条对象和前面创立的工具条资源连接在一起。 if(!m_wndToolBar.Create(this,WS_VISIBLE|CBRS_TOP)||!m_wndToolBar.LoadToolBar(IDR_TESTBAR)) //引入资源IDR_TESTBAR { TRACE0("Failedtocreatetoolbar\n"); return-1;//failtocreate }22.3对工具条进行操作创立完成工具条后,可调用工具条类中的成员函数对工具条进行操作,例如设定工具条风格,在窗口中移开工具条,控制工具条的显隐等。 m_wndTestBar.SetBarStyle(CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);可在程序中设置允许用户在程序运行中在框架窗口内移开工具条。通过调用CToolBar::EnableDocking和CFrame::EnableDocking来实现的。二函数原型均如下:voidEnableDocking(DWORDdwStyle)23.4控制工具条的显示CFrameWnd::ShowControlBar函数就是起到这样的作用,有3个参数,第1个参数用来指定要操作的工具栏或状态栏指针,第2个参数是一个布尔型,当为TRUE时表示显示,否那么表示隐藏,第3个参数用来表示是否延迟显示或隐藏,当为FALSE时表示立即显示或隐藏。voidCMainFrame::OnViewNewbar(){ intbShow=m_wndTestBar.IsWindowVisible(); ShowControlBar(&m_wndTestBar,!bShow,FALSE); }

24.4.2工具栏4.2.3多个工具栏的使用在用MFCAppWizard创立的文档应用程序中往往只有一个工具栏,但在实际应用中,常常需要多个工具栏。这里以一个实例的形式来讨论多个工具栏的创立、显示和隐藏等操作。

[例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工具栏属性对话框25.4.2工具栏〔4〕双击IDR_TOOLBAR1,翻开工具栏资源,删除几个“编辑〞相关的工具按钮〔目的是让IDR_TOOLBAR1工具栏与IDR_MAINFRAME有明显区别〕。〔5〕在CMainFrame类中添加一个成员变量m_wndTestBar,变量类型为CToolBar〔CToolBar类封装了工具栏的操作〕。protected://controlbarembeddedmembers CStatusBarm_wndStatusBar; CToolBarm_wndToolBar; CToolBarm_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(与工具栏资源标识不同)。26.4.2工具栏●if语句中的LoadToolBar函数是用来装载工具栏资源。假设CreateEx或LoadToolBar的返回值为0,即调用不成功,那么显示诊断信息“Failedtocreatetoolbar〞。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。

27.4.2工具栏〔7〕编译运行,结果如图4.21所示。图4.21多个工具栏第一次运行的结果〔8〕事实上多个工具栏的程序重点不是在于工具栏的显示,而是如何控制其显示。CFrameWnd::ShowControlBar函数就是起到这样的作用,有3个参数,第1个参数用来指定要操作的工具栏或状态栏指针,第2个参数是一个布尔型,当为TRUE时表示显示,否那么表示隐藏,第3个参数用来表示是否延迟显示或隐藏,当为FALSE时表示立即显示或隐藏。28.4.2工具栏〔9〕翻开菜单资源IDR_MAINFRAME,在“查看〞菜单下添加一个“新的工具栏(&N)〞菜单命令〔ID_VIEW_NEWBAR〕。〔10〕用MFCClassWizard在CMainFrame添加ID_VIEW_NEWBAR的COMMAND消息映射,保存默认的消息处理函数名,添加以下代码:voidCMainFrame::OnViewNewbar(){ intbShow=m_wndTestBar.IsWindowVisible(); ShowControlBar(&m_wndTestBar,!bShow,FALSE); }

29.4.3状态栏4.3.1状态栏的定义用MFCAppWizard(.exe)创立的SDI或MDI应用程序框架中,有一个静态的indicator数组,它是在MainFrm.cpp文件中指定的,被MFC用作状态栏的定义。StaticUINTindicators[]={ ID_SEPARATOR, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,}图4.22indicators数组的定义30.4.3状态栏4.3.2状态栏的常用操作:CStatusBar类1.增加和减少窗格窗格分为信息行窗格和指示器窗格两类。增加一个信息行窗格,那么只需在indicators数组中的适当位置中增加一个ID_SEPARATOR标识即可;增加一个用户指示器窗格,那么在indicators数组中的适当位置增加一个在字符串表中定义过的资源ID,其字符串的长度表示用户指示器窗格的大小。减少一个窗格,只需减少indicators数组元素。2.在状态栏上显示文本BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);假设bUpdate为TRUE,那么系统自动更新显示的结果。

31.4.3状态栏4.3.3改变状态栏的风格voidSetPaneInfo(intnIndex,UINTnID,UINTnStyle,intcxWidth);voidSetPaneStyle(intnIndex,UINTnStyle);参数nIndex表示要设置的状态栏窗格的索引,nID用来为状态栏窗格指定新的ID,cxWidth表示窗格的像素宽度,nStyle表示窗格的风格类型,用来指定窗格的外观。风格类型含义SBPS_NOBORDERS窗格周围没有3D边框SBPS_POPOUT反显边界以使文字“凸出来”SBPS_DISABLED禁用窗格,不显示文本SBPS_STRETCH拉伸窗格,并填充窗格不用的空白空间。但状态栏只能有一个窗格具有这种风格SBPS_NORMAL普通风格,它没有“拉伸”,“3D边框”或“凸出来”等特性32.4.3状态栏[例Ex_SDIMouse]在状态栏上显示鼠标位置 〔1〕创立一个默认的单文档应用程序Ex_SDIMouse。〔2〕将工程工作区切换到ClassView页面,展开CMainFrame所有项,双击构造函数CMainFrame,在文档窗口中出现该函数的定义,在它的前面就是状态栏数组的定义。〔3〕将状态栏indicators数组的定义改为以下代码:staticUINTindicators[]={ ID_SEPARATOR, ID_SEPARATOR,};〔4〕由于鼠标移动消息WM_MOUSEMOVE在CMainFrame类映射后不起作用,因此只能映射到CEx_SDIMouseView类中。但是,这样一来,就需要更多的代码,因为状态栏对象m_wndStatusBar是在CMainFrame类定义的成员变量,因而需要在CEx_SDIMouseView类中添加访问CMainFrame类的代码。CEx_SDIMouseView::OnMouseMove函数代码如下:33.4.3状态栏voidCEx_SDIMouseView::OnMouseMove(UINTnFlags,CPointpoint){CStringstr;CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;//获得主窗口指针CStatusBar*pStatus=&pFrame->m_wndStatusBar;//获得主窗口中的状态栏指针if(pStatus){str.Format("X=%d,Y=%d",point.x,point.y);//格式化文本pStatus->SetPaneText(1,str); //更新第二个窗格的文本} CView::OnMouseMove(nFlags,point);}34.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鼠标的位置显示在状态栏上35.4.3状态栏例如,在前面的例如中,将OnMouseMove函数修改为以下代码,那么结果如图4.24所示。voidCEx_SDIMouseView::OnMouseMove(UINTnFlags,CPointpoint){ CStringstr; CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; //获得主窗口指针 CStatusBar*pStatus=&pFrame->m_wndStatusBar; //获得主窗口中的状态栏指针 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设置状态栏的风格36.4.4交互对象的动态更新自动将用户交互对象的ID标识符与ON_UPDATE_COMMAND_UI宏相连接并产生处理更新消息的相应函数。voidCMainFrame::OnUpdateTestToolbar(CCmdUI*pCmdUI){ intbShow=m_wndTestBar.IsWindowVisible(); pCmdUI->SetCheck(bShow);}该函数参数是指向CCmdUI对象的指针。CCmdUI类仅用于ON_UPDATE_COMMAND_UI消息映射函数,它的成员函数将对菜单项、工具按钮等用户交互对象起作用。用户交互对象EnableSetCheckSetRadioSetText菜单项允许或禁用选中或未选中选中用点(

)设置菜单文本工具栏按钮允许或禁用选定、未选定或不确定同SetCheck无效状态栏窗格(PANE)使文本可见或不可见边框外凸或正常同SetCheck设置窗格文本CDialogBar中的按钮允许或禁用选中或未选中同SetCheck设置按钮文本CDialogBar中的控件允许或禁用无效无效设置窗口文本37.命令更新菜单项状态的维护是依赖于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处理程序仅应用于弹出式菜单项上的工程,不能应用于永久显示的顶级菜单工程。38.重点:菜单的静态和动态控制理解交互对象的动态更新机制39.4.5综合应用例Ex_A4,其中弹出对话框即图4-26改为使用图3-57(b).40.4.5综合应用为了能对学生成绩记录进行管理,常见的操作包括:添加、删除和查找等。这些操作在在文档应用程序中实现时可以有多种界面方法,具体如下:〔1〕构造单独的“操作〞工具栏,包含上述操作的工具按钮。〔2〕在文档应用程序的主菜单中的“查看〞菜单下添加一个“操作工具栏(&O)〞菜单命令,用来控制“操作〞工具栏的显示。〔3〕当“操作〞工具栏显示时,“操作工具栏(&O)〞菜单命令前面有一个“〞,且在“帮助〞菜单项前面出现“操作(&O)〞菜单项,包含用于添加、删除和查找的各个子菜单项。〔4〕当“操作〞工具栏隐藏时,“操作(&O)〞菜单项消失,且“操作工具栏(&O)〞菜单命令前面没有任何标记。用快捷键Ctrl+1关联“操作工具栏(&O)〞菜单命令。〔5〕单击操作工具栏的“添加〞按钮或选择“操作〞菜单中的“添加〞命令,弹出“学生成绩〞对话框,单击[确定]按钮,学生成绩记录显示在状态栏上。结果如图4.25所示。41.4.5综合应用图4.25综合应用题图具体实现步骤如下〔分四步阐述:设计学生成绩对话框、设计“操作〞工具栏和菜单、添加联动代码、修改状态栏完善代码〕:[例Ex_A4]第四章综合应用1〕设计学生成绩对话框42.4.5综合应用〔1〕用MFCAppWizard(exe)创立一个默认的单文档应用程序Ex_A4。〔2〕添加一个新的对话框资源,通过其属性对话框,将ID标识符改为IDD_SCORE,标题为“学生成绩〞,将对话框字体改为“宋体,9号〞。〔3〕显示对话框网格,调整对话框的大小,向对话框添加如表3.7所示的控件,调整控件的位置,结果如图4.26所示。图4.26设计的学生成绩对话框表4.8学生成绩对话框添加的控件添加的控件ID标识符标题其他属性编辑框IDC_EDIT_NAME——默认编辑框IDC_EDIT_NO——默认编辑框IDC_EDIT_S1——默认编辑框IDC_EDIT_S2——默认编辑框IDC_EDIT_S3——默认43.4.5综合应用〔4〕双击对话框模板空白处,为该对话框模板创立一个对话框类CScoreDlg。〔5〕在MFCClassWizard的MemberVariables页面中,确定Classname中是否已选择了CScoreDlg,选中所需的控件ID标识符,双击鼠标或单击AddVariables按钮。依次为表4.9控件增加成员变量。表4.9控件变量控件ID标识符变量类别变量类型变量名范围和大小IDC_EDIT_NAMEValueCStringm_strName­20IDC_EDIT_NOValueCStringm_strNO20IDC_EDIT_S1Valuefloatm_fScore10.0~100.0IDC_EDIT_S2Valuefloatm_fScore20.0~100.0IDC_EDIT_S3Valuefloatm_fScore30.0~100.044.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工具栏设计45.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属性〞〔AccelProperties〕对话框中将ID号选为ID_VIEW_OP,然后单击[下一键]按钮,并按下Ctrl+1作为此加速键的键值。关闭“Accel属性〞对话框。46.4.5综合应用〔3〕为CMainFrame类添加一个CMenu类的成员变量m_popMenu,以及一个成员函数UpdateOpMenu,代码如下:〔4〕按Ctrl+W键翻开MFCClassWizard对话框,切换到MessageMaps页面,在CMainFrame类中添加ID_VIEW_OP命令的COMMAND和UPDATE_COMMAND_UI消息映射,保存默认的映射函数名,添加以下代码:voidCMainFrame::OnViewOp(){ intbShow=m_wndOpBar.IsWindowVisible(); ShowControlBar(&m_wndOpBar,!bShow

温馨提示

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

评论

0/150

提交评论