收藏 分销(赏)

vc学习教程-界面设计.ppt

上传人:xrp****65 文档编号:12554596 上传时间:2025-10-29 格式:PPT 页数:58 大小:807KB 下载积分:10 金币
下载 相关 举报
vc学习教程-界面设计.ppt_第1页
第1页 / 共58页
vc学习教程-界面设计.ppt_第2页
第2页 / 共58页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二,第6章框架窗口界面设计,6.1框架窗口,6.2菜单,6.3工具栏,6.4状态栏,6.5交互对象的动态更新,6.6图标和光标,6.1框架窗口,6.1.1单文档和多文档程序框架窗口,文档应用程序的,MFC,类结构,如图是单文档应用程序,Ex_SDI,和多文档应用程序,Ex_MDI,的,MFC,类结构。,CAboutDlg,是每一个应用程序框架都有的,用来显示本程序的有关信息。,CEx_SDIApp,和,CEx_MDIApp,是应用程序类,是从,CWinApp,类派生而来,负责应用程序创建、运行和终止,每一个应用程序都需要这样的类。,CEx_SDIDoc,和,CEx_MDIDoc,是文档类,它们是从,CDocument,类派生而来,负责应用程序文档数据管理。,CEx_SDIView和CEx_MDIView是视图类,它们既可以从基类CView派生,也可以从CView派生类派生,负责数据的显示、绘制和其他用户交互。,CMainFrame类是用来负责主框架窗口的显示和管理,包括工具栏和状态栏等界面元素的初始化。对于单文档应用程序来说,主框架窗口类是从CFrameWnd派生而来的,而对于多文档应用程序程序,主框架窗口是从CMDIFrameWnd派生的。,6.1框架窗口,CChildFrame,类是从,CMDIChildWnd,派生而来,专门用来管理多文档应用程序中的文档窗口。无论是,CMDIChildWnd,还是,CMDIFrameWnd,类,它们都是从,CFrameWnd,派生而来的。,对于基于对话框的应用程序,一般有,CAboutDlg,类、应用程序类和对话框类。,上述,MFC,类之间的继承和派生关系如图,6.2,所示。,图6.2 MFC类的基本层次结构,CCmdTarget,CWnd,CDocument,CFrameWnd,CObject,CWinTread,CWinApp,CView,CDialog及控件,CMDIChildWnd,CMDIFrameWnd,CMiniFrameWnd,6.1框架窗口,项目的文件组织,项目中源文件都是采用文件夹的方式进行管理的,将项目名作为文件夹名,此文件夹下包含源程序代码文件、项目文件以及项目工作区文件等。每一个类的源代码均保存同名的,h,和,cpp,文件。其他一些文件类型的含义:,.opt,关于开发环境的参数文件,如工具条位置等信息,.aps(AppStudio File),资源辅助文件,二进制格式,.clw ClassWizard,信息文件,.dsp(DeveloperStudio Project),项目文件,.plg,编译信息文件,.mdp(Microsoft DevStudio Project),旧版本的项目文件,.bsc,用于浏览项目信息,.map,执行文件的映像信息纪录文件,.pch(Pre-Compiled File),预编译文件,可以加快编译速度,但是文件非常大,.pdb(Program Database),记录程序有关的一些数据和调试信息,.ncb,无编译浏览文件,(no compile browser),还有相应的,Debug(,调试,),、,Res(,资源,),等子文件夹。用应用程序向导创建项目时,系统自动为项目创建,Win32 Debug,版本的运行程序,并使用相应的默认配置。程序编连后,用于该项目的可执行文件以及其他调试的信息文件都安放在,Debug,文件夹中。,程序项目有一个,Win32 Release,版本,与,Release,的区别在于:,Debug,版本的运行程序有相应的调试信息码,,Release,版本的运行程序没有,但,Release,版本的运行程序经过代码的优化,其程序的运行效率被最大提升。,选择“编译”,“配置”菜单命令,在“配置”对话框将项目设置成,Win32 Release,版本。,6.1框架窗口,主框架窗口和文档窗口,主框架窗口是直接放置在桌面,(DeskTop),上的那个窗口,每个应用程序只能有一个主框架窗口。主框架窗口负责管理各个用户交互对象并根据用户操作相应地创建或更新文档窗口及其视图。,文档窗口对,SDI,程序来说,和主框架窗口是一致的,主框架窗口就是文档窗口;对于,MDI,程序,文档窗口是主框架窗口的子窗口,如图。,文档窗口一般都有相应的可见边框,它的客户区,(,除了窗口标题栏、边框外的区域,),是由相应的视图来构成的,因此可以说视图是文档窗口内的子窗口。文档窗口时刻跟踪当前处于活动状态的视图的变化,并将用户或系统产生的消息传递给当前活动视图。,6.1框架窗口,6.1.2窗口状态的改变,MFC AppWizard,为每个窗口设置了相应的大小和位置。,运行程序时,会自动调用框架内部的,WinMain,函数,并自动查找该应用程序类的全局变量,theApp,,然后自动调用用户应用程序类的虚函数,InitInstance,,该函数会进一步调用相应的函数来完成主窗口的构造和显示工作,代码:,BOOL CEx_SDIApp:InitInstance(),m_pMainWnd-ShowWindow(SW_SHOW);/,显示窗口,m_pMainWnd-UpdateWindow();/,更新窗口,return TRUE;,m_pMainWnd,是主框架窗口指针变量,,ShowWindow,是,CWnd,类的成员函数,用来按指定的参数显示窗口。,6.1框架窗口,通过指定,ShowWindow,函数的参数值可以改变改变窗口显示状态。例如下面的代码是将窗口的初始状态设置为“最小化”:,BOOL CEx_SDIApp:InitInstance(),.,m_pMainWnd-ShowWindow(,SW_SHOWMINIMIZED,);,m_pMainWnd-UpdateWindow();,return TRUE;,6.1框架窗口,6.1.3窗口风格的设置,窗口风格,通常有一般和扩展两种形式。可在函数,CWnd:Create,或,CWnd:CreateEx,参数中指定,,CreateEx,函数可同时支持以上两种风格,,CWnd:Create,只能指定窗口的一般风格。控件和对话框的窗口风格可直接通过其属性对话框来设置。,除了上述风格外,框架窗口还有以下三个自己的风格。它们都可以在,PreCreateWindow,重载函数的,CREATESTRUCT,结构中指定。,FWS_ADDTOTITLE,该风格指定相关的信息如文档名添加到框架窗口标题的后面。,FWS_PREFIXTITLE,该风格使得框架窗口标题中的文档名显示在应用程序名之前。,FWS_SNAPTOBARS,该风格用来调整窗口的大小,使它刚好包含了框架窗口中的控制栏。,6.1框架窗口,在,MFC AppWizard,中进行修改,例,Ex_SDI,在向导中修改窗口风格。,(1),选择“文件”,“新建”,选择“工程”,选择,MFC AppWizard(exe),的项目类型,指定项目工作文件夹位置,输入项目名,Ex_SDI,,单击,确定,按钮。,(2),在向导的第一步中,将应用程序类型选为“单个文档”,(SDI),。,(3),单击,下一个,,如图,可以选择程序中是否加入数据库的支持。,(4),单击下一个,出现向导的第三步对话框,如图,允许在程序中加入复合文档、自动化、ActiveX控件的支持。,6.1框架窗口,(5),单击,下一个,,如图,对话框的前几项依次确定对浮动工具条、打印与预览以及通信网络等特性的支持。对话框的最后两项是最近文件列表数目的设置,(,默认时为,4),和一个,高级,按钮,。,6.1框架窗口,(6),在第四步对话框中,单击,高级,,如图,分别用于文档模板字串资源内容和窗口风格的修改。,6.1框架窗口,(7),单击,关闭,,单击,下一个,,如图。可选择:应用程序的主窗口是,MFC,标准风格还是窗口左边有切分窗口的浏览器风格,在源文件中是否加入注释用来引导用户编写程序代码,是使用动态链接库,(DLL),还是静态链接库。,(8),单击下一个按钮,出现如图6.9所示的对话框。在这里,用户可以对MFC AppWizard提供的默认类名、基类名、各个源文件名进行修改。,6.1框架窗口,(9),单击,完成,,单击,确定,,回到主界面。,在向导中作出的选择,有部分内容反映在,CEx_SDIApp:InitInstance,函数中,代码:,BOOL CEx_SDIApp:InitInstance(),/,若用户在,MFC AppWizard,的第三步中,选中了,“ActiveX Controls”,,,/,则表示所创建的应用程序支持,ActiveX,控件,AfxEnableControlContainer();,/,若用户在,MFC AppWizard,的第四步中,选中了,“3D controls”,/,则表示所创建的应用程序支持,3D,控件风格,#ifdef _AFXDLL,Enable3dControls();/,使用,MFC,动态链接库的,3D,控件,#else,Enable3dControlsStatic();/,使用,MFC,静态链接库的,3D,控件,#endif,/,在,Windows,系统注册表中登记应用程序的主键值,以便将一些与应用程序,/,相关的参数存放在该主键值下,SetRegistryKey(_T(Local MFC AppWizard-Generated Applications);,/,从注册表中调入应用程序的一些标准参数值,其中包括最近文件列表的文件名,LoadStdProfileSettings();,return TRUE;,6.1框架窗口,修改,CREATESTRUCT,结构,窗口创建前,自动调用,PreCreateWindow,虚函数。用,MFC AppWizard,创建文档应用程序结构时,,MFC,已为主窗口或文档窗口类自动重载了该虚函数。可以在此函数中通过修改,CREATESTRUCT,结构来设置窗口的绝大多数风格。,对于多文档应用程序,文档窗口的风格可用下列的代码更改:,BOOL CChildFrame:PreCreateWindow(CREATESTRUCT&cs),/,创建不含有,最大化,按钮的子窗口,cs.style,/,调用基类的,PreCreateWindow,函数,return CMDIChildWnd:PreCreateWindow(cs);,6.1框架窗口,使用,ModifyStyle,和,ModifyStyleEx,ModifyStyleEx,可更改窗口的扩展风格。两个函数具有相同的参数,含义。,BOOL ModifyXXXX(DWORD,dwRemove,DWORD,dwAdd,UINT,nFlags,=0);,参数,dwRemove,指定需要删除的风格,,dwAdd,指定需要增加的风格,,nFlags,表示,SetWindowPos,的标志。,框架窗口设定扩展风格只能通过调用,ModifyStyle,函数来进行。例如用,MFC,ClassWizard,为一个多文档应用程序,Ex_MDI,的子文档窗口类,CChildFrame,添加,OnCreateClient,消息处理,并增加下列代码:,BOOL,CChildFrame:OnCreateClient(LPCREATESTRUCT,lpcs,CCreateContext,*,pContext,),ModifyStyle(0,WS_VSCROLL,0);,return,CMDIChildWnd:OnCreateClient(lpcs,pContext,);,6.1框架窗口,6.1.4改变窗口的大小和位置,CWnd,类的成员函数,SetWindowPos,或,MoveWindow,可以改变窗口的大小和位置。,SetWindowPos,可以改变窗口的大小、位置,还可以改变所有窗口在堆栈排列的次序,(Z,次序,),,这个次序是根据它们在屏幕出现的先后来确定的。,BOOL SetWindowPos,(,const CWnd*,pWndInsertAfter,int,x,int,y,int,cx,int,cy,UINT,nFlags,);,参数,pWndInsertAfter,表示窗口对象指针,下列预定义窗口对象的地址:,wndBottom,将窗口放置在,Z,次序中的底层,wndTop,将窗口放置在,Z,次序中的顶层,wndTopMost,设置最顶窗口,wndNoTopMost,将窗口放置在所有最顶层的后面,若此窗口不是最顶窗口,则此标志无效。,x,和,y,表示窗口新的左上角坐标,,cx,和,cy,分别表示表示窗口新的宽度和高度,,nFlags,表示窗口新的大小和位置方式。,6.1框架窗口,函数,CWnd:MoveWindow,也可用来改变窗口的大小和位置,必须在,MoveWindow,函数中指定窗口的大小。,void MoveWindow,(,int,x,int,y,int,nWidth,int,nHeight,BOOL,bRepaint,=TRUE,);,void MoveWindow,(,LPCRECT,lpRect,BOOL,bRepaint,=TRUE,);,参数,x,和,y,表示,窗口新的左上角坐标,,nWidth,和,nHeight,表示窗口新的宽度和高度,,bRepaint,用于指定窗口是否重绘,,lpRect,表示窗口新的大小和位置。,例如,在,CEx_SDIApp:InitInstance,中,return TRUE,语句之前添加下列代码,可以使主框架窗口移动到屏幕的,(100,,,100),处:,/,若使用,SetWindowPos,函数,则可以有,m_pMainWnd-SetWindowPos(NULL,100,100,0,0,SWP_NOSIZE|SWP_NOZORDER);,/,或使用,MoveWindow,函数,则有,CRect rcWindow;,m_pMainWnd-GetWindowRect(rcWindow);,m_pMainWnd-MoveWindow(100,100,rcWindow.Width(),rcWindow.Height(),TRUE);,CRect,是一个矩形类,,GetWindowRect,是一个,CWnd,类的成员函数,用来获取窗口在屏幕的位置和大小。,6.2菜单,许多程序员对于菜单的设计都遵循下列一些规则:,l,若选择某菜单项会弹出一对话框,那么在该菜单项文本后有“,”。,l,若某项菜单有子菜单,那么在该菜单项文本后有“,”。,l,若菜单项需要助记符,用括号将带下划线的字母括起来。助记符与,Alt,构成一个组合键,当按住“,Alt,”键不放,敲击该字母时,对应的菜单项就会被选中。,l,若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。所谓“快捷键”是一个组合键,如,Ctrl+N,,使用时是先按下“,Ctrl,”健不放,然后再按“,N,”键。任何时候按下快捷键,相应的菜单命令都会被执行。,图6.11 菜单样例子,6.2菜单,6.2.1更改应用程序菜单,菜单“文件”,“打开工作区”。在工作区中选择,ResourceView,页面,双击资源“,Menu,”中的,IDR_MAINFRAME,,通过菜单编辑器修改菜单资源,IDR_MAINFRAME,,可以为程序重新指定一个菜单,下面的示例过程:,(1),打开前面的单文档应用程序,Ex_SDI,。,(2),按快捷键,Ctrl+R,,在资源类型中选定“,Menu,”,如图。,(3),单击,新建,,如图。,6.2菜单,(4),在,Menu,的,ID_MENU1,上右击鼠标,选择“,Properties,”命令,如图,可以重新指定菜单资源,ID,,设置菜单资源的语言和条件,这个条件用来决定菜单资源包含到哪个环境中,例如当指定条件为,_DEBUG,,则菜单资源只存在于,Debug,编译环境中。,(5),菜单,ID_MENU1,添加一个顶层弹出菜单项“测试,(&T),”,并在该菜单下添加一个子菜单项“返回,(&R),”,,ID,设为,ID_TEST_RETURN,,如图。,(6),打开,Ex_SDI,程序菜单资源,IDR_MAINFRAME,,在“查看”菜单的最后添加一个子菜单项“显示测试菜单,(&M),”,,ID,设为,ID_VIEW_TEST,。,(7),为,CMainFrame,类添加一个,CMenu,类型的成员变量,m_NewMenu,,,CMenu,类是用来处理菜单的一个,MFC,类。,6.2菜单,(8),按快捷键,Ctrl+W,,切换到,Message Maps,页面,从“,Class name,”列表中选择,CMainFrame,,分别为菜单项,ID_VIEW_TEST,和,ID_TEST_RETURN,添加,COMMAND,消息映射,使用默认的消息映射函数名,并添中下列代码:,void CMainFrame:OnViewTest(),m_NewMenu.Detach();/,使菜单对象和菜单句柄分离,m_NewMenu.LoadMenu(IDR_MENU1);,SetMenu(NULL);/,清除应用程序菜单,SetMenu(/,设置应用程序菜单,void CMainFrame:OnTestReturn(),m_NewMenu.Detach();,m_NewMenu.LoadMenu(IDR_MAINFRAME);,SetMenu(NULL);,SetMenu(,LoadMenu,装载菜单资源,,Detach,使菜单对象与菜单句柄分离。调用,LoadMenu,后,菜单对象,m_NewMenu,就拥有一个菜单句柄,再次调用,LoadMenu,时,发生运行时错误,当菜单对象与菜单句柄分离后,就可以再创建菜单。,SetMenu,是,CWnd,类的一个成员函数,用来设置应用程序的菜单。,(9),编译运行并测试。,6.2菜单,6.2.2使用键盘快捷键,通过上述的菜单系统,可以选择几乎所有可用的命令和选项,保证了菜单命令系统的完整性,菜单系统操作效率不高。对于那些反复使用的命令,有必要进一步提高效率,于是加速键应运而生。,一个加速键就是一个按键或几个按键的组合,用于激活特定的命令。加速键也是一种资源。,例如:为前面两个菜单,ID_VIEW_TEST,和,ID_TEST_RETURN,定义键盘快捷键:,(1),打开上例的工作区窗口中,Accelerator,的资源项,双击,IDR_MAINFRAME,,如图。,6.2菜单,(2),建立一新的加速键,双击加速键列表的最下端的空行,弹出如图的“,Accel Properities,”,(,加速键属性,),对话框,可设置的属性如表。,6.2菜单,(3),选择,Ex_SDI,添加的“显示测试菜单”菜单项,ID_VIEW_TEST,作为要联用的加速键的,ID,号,然后单击,下一键,按钮,并按下,Ctrl+1,作为此加速键的键值。,(4),按同样的方法,为菜单项,ID_TEST_RETURN,添加加速键,Ctrl+2,。需要说明的是,为了使其他用户能查看并使用该加速键,还需在相应的菜单项文本后面添加加速键内容。例如,可将,ID_VIEW_TEST,菜单项的标题改成“显示测试菜单,(&M)tCtrl+1,”,其中“,t,”是将后面的“,Ctrl+1,”定位到一个水平制表位。,(5),编译运行并测试。当程序运行后,按“,Ctrl+1,”和“,Ctrl+2,”将执行相应的菜单命令。,6.2菜单,6.2.3菜单的编程控制,创建菜单,CreateMenu,和,CreatePopupMenu,用来创建一个菜单或子菜单框架,原型:,BOOL CreateMenu();,/,产生一个空菜单,BOOL CreatePopupMenu();,/,产生一个空的弹出式子菜单,装入菜单资源,需调用,CMenu,成员函数,LoadMenu,,再用,SetMenu,对应用程序菜单进行重新设置。,BOOL LoadMenu(LPCTSTR lpszResourceName);,BOOL LoadMenu(UINT,nIDResource,);,lpszResourceName,为菜单资源名称,,nIDResource,为菜单资源,ID,号。,添加菜单项,可以调用,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,表示要增加的新菜单项的状态信息。,6.2菜单,注意:,l,当,nFlags,为,MF_BYPOSITION,时,,nPosition,表示新菜单项要插入的具体位置,为,0,时表示第一个菜单项,为,-1,时,将菜单项添加菜单的末尾处。,l,nFlags,的标志中,可以用“,|,”,(,按位或,),来组合。有些组合是不允许的,例如,MF_DISABLED,、,MF_ENABLED,和,MF_GRAYED,,,MF_STRING,、,MF_OWNERDRAW,、,MF_SEPARATOR,和位图,,MF_CHECKED,和,MF_UNCHECKED,都不能组合在一起。,l,当菜单项增加后,不管菜单依附的窗口是否改变,都应调用,CWnd:DrawMenuBar,来更新菜单。,6.2菜单,删除菜单项,DeleteMenu,函数可将菜单项删除,,注意:,调用该函数后,不管菜单依附的窗口是否改变,都应调用,CWnd:DrawMenuBar,使菜单更新。函数原型:,BOOL DeleteMenu(UINT,nPosition,UINT,nFlags,);,nPosition,表示要删除菜单项位置,由,nFlags,进行说明。,nFlags,为,MF_BYCOMMAND,时,,nPosition,表示菜单项,ID,号,,nFlags,为,MF_BYPOSITION,时,,nPosition,表示菜单项的位置。,获取菜单项,下面四个,CMenu,成员函数分别获得菜单的项数、菜单项的,ID,号、菜单项的文本内容以及弹出式子菜单的句柄。,UINT GetMenuItemCount()const;/,用来获得菜单的菜单项数。,UINT GetMenuItemID(int,nPos,)const;/,用来获得由,nPos,指定菜单项位置的菜单项的标识号。,int GetMenuString(UINT,nIDItem,CString&,rString,UINT,nFlags,)const;/,获得由,nIDItem,指定菜单项位置的菜单项的文本内容,由,rString,参数返回,,nFlags,为,MF_BYPOSITION,时,,nPosition,表示菜单项的位置。,CMenu*GetSubMenu(int,nPos,)const;/,用来获得指定菜单的弹出式菜单的菜单句柄。,6.2菜单,示例,示例过程利用,CMenu,成员函数向应用程序菜单中添加并处理一个菜单项:,(1),打开前面的单文档应用程序,Ex_SDI,或重新创建。,(2),“查看”菜单,“,Resource Symbols,”,如图。,(3),单击,新建,,如图。在名字框中输入标识符,ID_NEW_MENUITEM,。在值框中输入,ID,的值,单击,确定,。,6.2菜单,(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);/,在子菜单中增加一菜单项,/,允许使用,ON_UPDATE_COMMAND_UI,或,ON_COMMAND,的菜单项,m_bAutoMenuEnable=FALSE;/,关闭系统自动更新菜单状态,pSysMenu-EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);,/,激活菜单项,DrawMenuBar();/,更新菜单,return 0;,6.2菜单,(5),用,MFC ClassWizard,处理,OnCommand,消息并检测用户菜单的,nID,参数。,BOOL CMainFrame:OnCommand(WPARAM wParam,LPARAM lParam),/wParam,的低字节表示菜单、控件、加速键的命令,ID,if(LOWORD(wParam)=ID_NEW_MENUITEM),MessageBox(,你选中了新的菜单项,);,return CFrameWnd:OnCommand(wParam,lParam);,(6),编译运行并测试。这样当选择菜单“编辑”,“新的菜单项”命令后,就会弹一个对话框,显示“你选中了新的菜单项”消息。,6.2菜单,6.2.4使用快捷菜单,快捷菜单实现函数,用资源编辑器和,MFC,库的,CMenu:TrackPopupMenu,函数可以创建这样的菜单,,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,时,在菜单外面单击鼠标,菜单立刻消失。,6.2菜单,示例,显示主菜单,IDR_MAINFRAME,时,右击鼠标弹出“查看”菜单的子菜单,显示菜单,IDR_MENU1,时,右击鼠标弹出“测试”菜单的子菜单。具体步骤:,(1),打开前面的单文档应用程序,Ex_SDI,。,(2),在,CMainFrame,类添加,WM_CONTEXTMENU,消息映射,函数代码。,void CMainFrame:OnContextMenu(CWnd*pWnd,CPoint point),CMenu*pSysMenu=GetMenu();/,获得程序菜单指针,int nCount=pSysMenu-GetMenuItemCount();/,获得顶层菜单个数,int nSubMenuPos=-1;,for(int i=0;iGetMenuString(i,str,MF_BYPOSITION);,if(str.Left(4)=“,查看,”)|(str.Left(4)=“,测试,”)nSubMenuPos=i;,break;,if(nSubMenuPosGetSubMenu(nSubMenuPos),-TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);,(3),编译运行并测试。,6.3工具栏,6.3.1使用工具栏编辑器,创建一个新的工具栏按钮,双击新建的工具栏中最右端的空按钮弹出属性框,在,ID,框中输入名称,右端出现一个空按钮。单击该按钮,在资源编辑器的工具按钮设计窗口内进行编辑,这个编辑就是绘制一个工具按钮的位图。,移动一个按钮,鼠标左键点中它并拖动至相应位置。如果用户拖动它离开工具栏位置,则此按钮从工具栏中消失。若在移动一个按钮的同时,按下,Ctrl,键,则在新位置复制一个按钮,新位置可以是同一个工具栏中的其他位置,也可以在不同的工具栏中。,删除一个按钮,将选取中的按钮拖离工具栏就消失了。若选中按钮,,Delete,键不能删除,将按钮中的图形全部以背景色填充。,在工具栏中插入空格,如果按扭前没有任何空格,拖动该按钮向右移动并当覆盖相邻按钮的一半以上时,释放鼠标键,则此按钮前出现空格。,如果按钮前有空格而按钮后没有空格,拖动该按钮向左移动并当按钮的左边界接触到前面按钮时,释放鼠标键,则此按钮后将出现空格。,如果按钮前后均有空格,拖动该按钮向右移动并当接触到相邻按钮时,则此按钮前的空格保留,按钮后的空格消失。相反,拖动该按钮向左移动并当接触到前一个相邻按钮时,则此按钮前面的空格消失,后面的空格保留。,6.3工具栏,工具栏按钮属性的设置,6.3工具栏,6.3.2工具按钮和菜单项相结合,指选择工具按钮或菜单命令时,操作结果是一样的。使它们结合的具体方法是在工具按钮的属性对话框中将按钮的,ID,号设置为相关联的菜单项,ID,。,例如:,示例是在前面,Ex_SDI,上进行的,通过两个工具按钮分别显示主菜单,IDR_MAINFRAME,和菜单,IDR_MENU1,。具体步骤:,(1),打开前面的单文档应用程序,Ex_SDI,。,(2),利用工具栏编辑器设计两个工具按钮,如图。,6.3工具栏,(3),双击设计的第一个工具按钮,将工具按钮的,ID,号设为,ID_TEST_RETURN,,在提示框内键入“返回应用程序主菜单,n,返回主菜单”。,(4),双击设计的第二个工具按钮,将工具按钮的,ID,号设为,ID_VEW_TEST,,在提示框内键入“显示测试菜单,n,显示测试菜单”。,(5),编译运行并测试。将鼠标移至设计的第一个工具按钮处,这时在状态栏上显示出“返回应用程序主菜单”信息,若稍等片刻后,还会弹出提示小窗口,显示出“返回主菜单”字样,如图。单击新添加的这两个按钮,会执行相应的菜单命令。,6.3工具栏,6.3.3多个工具栏的使用,操作步骤如下:,(1),打开前面的单文档应用程序,Ex_SDI,。,(2),将工作区切换到,ResourceView,,展开,Toolbar(,工具栏,),资源,用鼠标单击,IDR_MAINFRAME,不松开,按,Ctrl,,将,IDR_MAINFRAME,拖到,Toolbar,资源名称上。,(3),右击工具栏资源,IDR_MAINFRAME1,,选择,Properties,命令,如图。,(4),双击IDR_TOOLBAR1,按图删除不要的工具按钮。,(5),在CMainFrame类中添加一个成员变量m_wndTestBar,变量类型为CToolBar。CToolBar类封装了工具栏的操作。,6.3工具栏,(6),在,CMainFrame:OnCreate,函数中添加下面的工具栏创建代码:,int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct),if(CFrameWnd:OnCreate(lpCreateStruct)=-1)return-1;,int nRes=m_wndTestBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|,CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC,CRect(0,0,0,0),AFX_IDW_TOOLBAR+10);,if(!nRes|!m_wndTestBar.LoadToolBar(IDR_TOOLBAR1),TRACE0(Failed to create toolbarn);,return-1;/fail to create,m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);,m_wndTestBar.EnableDocking(CBRS_ALIGN_ANY);,EnableDocking(CBRS_ALIGN_ANY);,DockControlBar(,DockControlBar(,return 0;,6.3工具栏,(7),编译运行,如图。,(8),需要调用,CFrameWnd,类的成员函数,ShowControlBar,来使程序一开始运行时隐藏工具栏,IDR_TOOLBAR1,。在,CMainFrame:OnCreate,中添加代码:,int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct),ShowControlBar(/,关闭测试工具栏,return 0;,6.3工具栏,(9),在,CMainFrame:OnViewTest,和,CMainFrame:OnTestReturn,中添加代码:,void CMainFrame:OnViewTest(),ShowControlBar(/,显示测试工具栏,ShowControlBar(/,关闭主工具栏,void CMainFrame:OnTestReturn(),ShowControlBar(/,关闭测试工具栏,ShowControlBar(/,显示主工具栏,(10),编译运行并测试,如图,左边开始运行的结果,右边是单击按钮运行的结果。,6.4状态栏,6.4.1状态栏的定义,AppWizard,创建的,SDI,或,MDI,应用程序框架中,有一个静态的,indicator,数组,是在,MainFrm.cpp,文件中定义的,被,MFC,用作状态栏的定义。,数组中的元素是一些标识常量或是字串资源的,ID,号。图列出了,indicators,数组元素与标准状态栏窗格的关系。,Static UINT indicators=,ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,图6.28 indicators数组的定义,6.4状态栏,6.4.2,状态栏的常用操作,增加和减少窗格,在状态栏中增加信息行窗格,在,indicators,数组中增加一个,ID_SEPARATOR,标识;在状态栏中增加指示器窗格,在,indicators,数组中增加一个在字符串表中定义过的资源,ID,。状态栏减少一个窗格,只需减少,indicators,数组元素。,在状态栏上显示文本,调用,CStatusBar:SetPaneText,函数更新任何窗格中的文本。函数原型:,BOOL SetPaneText(int,nIndex,LPCTSTR,lpszNewText,BOOL,bUpdate=,TRUE);,示例,(1),创建一个默认的单文档应用程序,Ex_SDIMouse,。,(2),将工作区切换到,ClassView,页面,展开,CMainFrame
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服