MFC框架窗口界面设计.pptx
《MFC框架窗口界面设计.pptx》由会员分享,可在线阅读,更多相关《MFC框架窗口界面设计.pptx(58页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、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派生类派生,
2、负责数据的显示、绘制和其他用户交互。CMainFrame类是用来负责主框架窗口的显示和管理,包括工具栏和状态栏等界面元素的初始化。对于单文档应用程序来说,主框架窗口类是从CFrameWnd派生而来的,而对于多文档应用程序程序,主框架窗口是从CMDIFrameWnd派生的。第1页/共58页1 1框架窗口CChildFrame类是从CMDIChildWnd派生而来,专门用来管理多文档应用程序中的文档窗口。无论是CMDIChildWnd还是CMDIFrameWnd类,它们都是从CFrameWnd派生而来的。对于基于对话框的应用程序,一般有CAboutDlg类、应用程序类和对话框类。上述MFC类之间的
3、继承和派生关系如图2所示。图2 MFC类的基本层次结构CCmdTargetCWndCDocumentCFrameWndCObjectCWinTreadCWinAppCViewCDialog及控件CMDIChildWndCMDIFrameWndCMiniFrameWnd第2页/共58页1 1框架窗口项目的文件组织 项目中源文件都是采用文件夹的方式进行管理的,将项目名作为文件夹名,此文件夹下包含源程序代码文件、项目文件以及项目工作区文件等。每一个类的源代码均保存同名的h和cpp文件。其他一些文件类型的含义:.opt 关于开发环境的参数文件,如工具条位置等信息.aps(AppStudio File)
4、资源辅助文件,二进制格式.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(资源)等子文件夹。用应用程序向导创建
5、项目时,系统自动为项目创建Win32 Debug版本的运行程序,并使用相应的默认配置。程序编连后,用于该项目的可执行文件以及其他调试的信息文件都安放在Debug文件夹中。程序项目有一个Win32 Release版本,与Release的区别在于:Debug版本的运行程序有相应的调试信息码,Release版本的运行程序没有,但Release版本的运行程序经过代码的优化,其程序的运行效率被最大提升。选择“编译”“配置”菜单命令,在“配置”对话框将项目设置成Win32 Release版本。第3页/共58页1 1框架窗口主框架窗口和文档窗口 主框架窗口是直接放置在桌面(DeskTop)上的那个窗口,每个
6、应用程序只能有一个主框架窗口。主框架窗口负责管理各个用户交互对象并根据用户操作相应地创建或更新文档窗口及其视图。文档窗口对SDI程序来说,和主框架窗口是一致的,主框架窗口就是文档窗口;对于MDI程序,文档窗口是主框架窗口的子窗口,如图。文档窗口一般都有相应的可见边框,它的客户区(除了窗口标题栏、边框外的区域)是由相应的视图来构成的,因此可以说视图是文档窗口内的子窗口。文档窗口时刻跟踪当前处于活动状态的视图的变化,并将用户或系统产生的消息传递给当前活动视图。第4页/共58页1 1框架窗口窗口状态的改变MFC AppWizard为每个窗口设置了相应的大小和位置。运行程序时,会自动调用框架内部的Wi
7、nMain函数,并自动查找该应用程序类的全局变量theApp,然后自动调用用户应用程序类的虚函数InitInstance,该函数会进一步调用相应的函数来完成主窗口的构造和显示工作,代码:BOOL CEx_SDIApp:InitInstance()m_pMainWnd-ShowWindow(SW_SHOW);/显示窗口m_pMainWnd-UpdateWindow();/更新窗口return TRUE;m_pMainWnd是主框架窗口指针变量,ShowWindow是CWnd类的成员函数,用来按指定的参数显示窗口。第5页/共58页1 1框架窗口通过指定ShowWindow函数的参数值可以改变改变窗
8、口显示状态。例如下面的代码是将窗口的初始状态设置为“最小化”:BOOL CEx_SDIApp:InitInstance().m_pMainWnd-ShowWindow(SW_SHOWMINIMIZED);m_pMainWnd-UpdateWindow();return TRUE;第6页/共58页1 1框架窗口窗口风格的设置 窗口风格 通常有一般和扩展两种形式。可在函数CWnd:Create或CWnd:CreateEx参数中指定,CreateEx函数可同时支持以上两种风格,CWnd:Create只能指定窗口的一般风格。控件和对话框的窗口风格可直接通过其属性对话框来设置。除了上述风格外,框架窗口还
9、有以下三个自己的风格。它们都可以在PreCreateWindow重载函数的CREATESTRUCT结构中指定。FWS_ADDTOTITLE该风格指定相关的信息如文档名添加到框架窗口标题的后面。FWS_PREFIXTITLE 该风格使得框架窗口标题中的文档名显示在应用程序名之前。FWS_SNAPTOBARS 该风格用来调整窗口的大小,使它刚好包含了框架窗口中的控制栏。例cs.cx=300;cs.cy=200;cs.style=cs.style&FWS_ADDTOTITLE;/取反 cs.lpszName=大连理工大学;第7页/共58页1 1框架窗口在MFC AppWizard中进行修改 例Ex_
10、SDI 在向导中修改窗口风格。(1)选择“文件”“新建”,选择“工程”,选择MFC AppWizard(exe)的项目类型,指定项目工作文件夹位置,输入项目名Ex_SDI,单击确定按钮。(2)在向导的第一步中,将应用程序类型选为“单个文档”(SDI)。(3)单击下一个,如图,可以选择程序中是否加入数据库的支持。(4)单击下一个,出现向导的第三步对话框,如图,允许在程序中加入复合文档、自动化、ActiveX控件的支持。第8页/共58页1 1框架窗口(5)单击下一个,如图,对话框的前几项依次确定对浮动工具条、打印与预览以及通信网络等特性的支持。对话框的最后两项是最近文件列表数目的设置(默认时为4)
11、和一个高级按钮。第9页/共58页1 1框架窗口(6)在第四步对话框中,单击高级,如图,分别用于文档模板字串资源内容和窗口风格的修改。第10页/共58页1 1框架窗口(7)单击关闭,单击下一个,如图。可选择:应用程序的主窗口是MFC标准风格还是窗口左边有切分窗口的浏览器风格,在源文件中是否加入注释用来引导用户编写程序代码,是使用动态链接库(DLL)还是静态链接库。(8)单击下一个按钮,出现如图9所示的对话框。在这里,用户可以对MFC AppWizard提供的默认类名、基类名、各个源文件名进行修改。第11页/共58页1 1框架窗口(9)单击完成,单击确定,回到主界面。在向导中作出的选择,有部分内容
12、反映在CEx_SDIApp:InitInstance函数中,代码:BOOL CEx_SDIApp:InitInstance()/若用户在MFC AppWizard的第三步中,选中了“ActiveX Controls”,/则表示所创建的应用程序支持ActiveX控件AfxEnableControlContainer();/若用户在MFC AppWizard的第四步中,选中了“3D controls”/则表示所创建的应用程序支持3D控件风格#ifdef _AFXDLLEnable3dControls();/使用MFC动态链接库的3D控件#elseEnable3dControlsStatic();/
13、使用MFC静态链接库的3D控件#endif/在Windows系统注册表中登记应用程序的主键值,以便将一些与应用程序/相关的参数存放在该主键值下SetRegistryKey(_T(Local MFC AppWizard-Generated Applications);/从注册表中调入应用程序的一些标准参数值,其中包括最近文件列表的文件名LoadStdProfileSettings();return TRUE;第12页/共58页1 1框架窗口修改CREATESTRUCT结构 窗口创建前,自动调用PreCreateWindow虚函数。用MFC AppWizard创建文档应用程序结构时,MFC已为主窗
14、口或文档窗口类自动重载了该虚函数。可以在此函数中通过修改CREATESTRUCT结构来设置窗口的绝大多数风格。对于多文档应用程序,文档窗口的风格可用下列的代码更改:BOOL CMainFrame:PreCreateWindow(CREATESTRUCT&cs)/创建不含有最大化按钮的子窗口&=WS_MAXIMIZEBOX;/调用基类的PreCreateWindow函数return CFrameWnd:PreCreateWindow(cs);第13页/共58页1 1框架窗口使用ModifyStyle和ModifyStyleEx ModifyStyleEx可更改窗口的扩展风格。两个函数具有相同的参
15、数,含义。BOOL ModifyXXXX(DWORD dwRemove,DWORD dwAdd,UINT nFlags=0);参数dwRemove指定需要删除的风格,dwAdd指定需要增加的风格,nFlags表示SetWindowPos的标志。框架窗口设定扩展风格只能通过调用ModifyStyle函数来进行。例如用MFC ClassWizard为一个多文档应用程序Ex_MDI的子文档窗口类CChildFrame添加OnCreateClient消息处理,并增加下列代码:BOOL CMainFrame:OnCreateClient(LPCREATESTRUCT lpcs,CCreateContex
16、t*pContext)ModifyStyle(0,WS_VSCROLL,0);return CMDIChildWnd:OnCreateClient(lpcs,pContext);第14页/共58页1 1框架窗口改变窗口的大小和位置CWnd类的成员函数SetWindowPos或MoveWindow可以改变窗口的大小和位置。SetWindowPos可以改变窗口的大小、位置,还可以改变所有窗口在堆栈排列的次序(Z次序),这个次序是根据它们在屏幕出现的先后来确定的。BOOL SetWindowPos(const CWnd*pWndInsertAfter,int x,int y,int cx,int c
17、y,UINT nFlags);参数pWndInsertAfter表示窗口对象指针,下列预定义窗口对象的地址:wndBottom将窗口放置在Z次序中的底层wndTop 将窗口放置在Z次序中的顶层wndTopMost 设置最顶窗口wndNoTopMost 将窗口放置在所有最顶层的后面,若此窗口不是最顶窗口,则此标志无效。x和y表示窗口新的左上角坐标,cx和cy分别表示表示窗口新的宽度和高度,nFlags表示窗口新的大小和位置方式。第15页/共58页1 1框架窗口 函数CWnd:MoveWindow也可用来改变窗口的大小和位置,必须在MoveWindow函数中指定窗口的大小。void MoveWin
18、dow(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-
19、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类的成员函数,用来获取窗口在屏幕的位置和大小。第16页/共58页2菜单 许多程序员对于菜单的设计都遵循下列一些规则:l若选择某菜单项会弹出一对话框
20、,那么在该菜单项文本后有“”。l若某项菜单有子菜单,那么在该菜单项文本后有“”。l若菜单项需要助记符,用括号将带下划线的字母括起来。助记符与Alt构成一个组合键,当按住“Alt”键不放,敲击该字母时,对应的菜单项就会被选中。l 若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。所谓“快捷键”是一个组合键,如Ctrl+N,使用时是先按下“Ctrl”健不放,然后再按“N”键。任何时候按下快捷键,相应的菜单命令都会被执行。图11 菜单样例子第17页/共58页2菜单更改应用程序菜单 菜单“文件”“打开工作区”。在工作区中选择ResourceView页面,双击资源“Menu”中的IDR_MA
21、INFRAME,通过菜单编辑器修改菜单资源IDR_MAINFRAME,可以为程序重新指定一个菜单,下面的示例过程:(1)打开前面的单文档应用程序Ex_SDI。(2)按快捷键Ctrl+R,在资源类型中选定“Menu”,如图。(3)单击新建,如图。第18页/共58页2菜单(4)在Menu的ID_MENU1上右击鼠标,选择“Properties”命令,如图,可以重新指定菜单资源ID,设置菜单资源的语言和条件,这个条件用来决定菜单资源包含到哪个环境中,例如当指定条件为_DEBUG,则菜单资源只存在于Debug编译环境中。(5)菜单ID_MENU1添加一个顶层弹出菜单项“测试(&T)”,并在该菜单下添加
22、一个子菜单项“返回(&R)”,ID设为ID_TEST_RETURN,如图。(6)打开Ex_SDI程序菜单资源IDR_MAINFRAME,在“查看”菜单的最后添加一个子菜单项“显示测试菜单(&M)”,ID设为ID_VIEW_TEST。(7)为CMainFrame类添加一个CMenu类型的成员变量m_NewMenu,CMenu类是用来处理菜单的一个MFC类。第19页/共58页2菜单(8)按快捷键Ctrl+W,切换到Message Maps页面,从“Class name”列表中选择CMainFrame,分别为菜单项ID_VIEW_TEST和ID_TEST_RETURN添加COMMAND消息映射,使用
23、默认的消息映射函数名,并添中下列代码:void CMainFrame:OnViewTest()();/使菜单对象和菜单句柄分离(IDR_MENU1);SetMenu(NULL);/清除应用程序菜单SetMenu(&m_NewMenu);/设置应用程序菜单void CMainFrame:OnTestReturn()();(IDR_MAINFRAME);SetMenu(NULL);SetMenu(&m_NewMenu);LoadMenu装载菜单资源,Detach使菜单对象与菜单句柄分离。调用LoadMenu后,菜单对象m_NewMenu就拥有一个菜单句柄,再次调用LoadMenu时,发生运行时错误
24、,当菜单对象与菜单句柄分离后,就可以再创建菜单。SetMenu是CWnd类的一个成员函数,用来设置应用程序的菜单。(9)编译运行并测试。第20页/共58页2菜单使用键盘快捷键 通过上述的菜单系统,可以选择几乎所有可用的命令和选项,保证了菜单命令系统的完整性,菜单系统操作效率不高。对于那些反复使用的命令,有必要进一步提高效率,于是加速键应运而生。一个加速键就是一个按键或几个按键的组合,用于激活特定的命令。加速键也是一种资源。例如:为前面两个菜单ID_VIEW_TEST和ID_TEST_RETURN定义键盘快捷键:(1)打开上例的工作区窗口中Accelerator的资源项,双击IDR_MAINFR
25、AME,如图。第21页/共58页2菜单(2)建立一新的加速键,双击加速键列表的最下端的空行,弹出如图的“Accel Properities”(加速键属性)对话框,可设置的属性如表。第22页/共58页2菜单(3)选择Ex_SDI添加的“显示测试菜单”菜单项ID_VIEW_TEST作为要联用的加速键的ID号,然后单击下一键按钮,并按下Ctrl+1作为此加速键的键值。(4)按同样的方法,为菜单项ID_TEST_RETURN添加加速键Ctrl+2。需要说明的是,为了使其他用户 能 查 看 并 使 用 该 加 速 键,还 需 在 相 应 的 菜 单 项 文 本 后 面 添 加 加 速 键 内 容。例 如
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 框架 窗口 界面设计
限制150内