版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 MFC编程基础,第8章 MFC编程基础,8.1 MFC类库简介 8.2 使用AppWizard开发MFC应用程序 8.3 MFC应用程序框架与Win32程序的关联 8.4 MFC应用程序的消息映射,8.1 MFC类库简介,下面是MFC类库的类定义文件afxwin .h中的类说明部分源代码,从中可以了解MFC类库中的类以及它们的层次关系。代码如下:,class CSize; class CPoint; class CRect; /CObject /Cexception /CSimpleException class CResourceException;/ Win resource fa
2、ilure exception class CUserException; / Message Box alert and stop operation class CGdiObject; / CDC drawing tool class CPen; / a pen / HPEN wrapper class CBrush; / a brush / HBRUSH wrapper class CFont; / a font / HFONT wrapper,class CBitmap; / a bitmap / HBITMAP wrapper class CPalette; / a palette
3、/ HPALLETE wrapper class CRgn; / a region / HRGN wrapper class CDC; / a Display Context / HDC wrapper class CClientDC; / CDC for client of window class CWindowDC; / CDC for entire window class CPaintDC; / embeddable BeginPaint struct helper class CMenu; / a menu / HMENU wrapper class CCmdTarget; / a
4、 target for user commands class CWnd; / a window / HWND wrapper class CDialog; / a dialog / standard windows controls class CStatic; / Static control class CButton; / Button control class CListBox; / ListBox control class CCheckListBox; / special listbox with checks class CComboBox; / ComboBox contr
5、ol class CEdit; / Edit control class CScrollBar; / ScrollBar control,/ frame windows class CFrameWnd; / standard SDI frame class CMDIFrameWnd; / standard MDI frame class CMDIChildWnd; / standard MDI child class CMiniFrameWnd; / half-height caption frame wnd / views on a document class CView; / a vie
6、w on a document class CScrollView; / a scrolling view class CWinThread; / thread base class class CWinApp; / application base class class CDocTemplate; / template for document creation class CSingleDocTemplate; / SDI support class CMultiDocTemplate; / MDI support class CDocument; / main document abs
7、traction / Helper classes class CCmdUI; / Menu/button enabling class CDataExchange; / Data exchange and validation context class CCommandLineInfo; /CommandLine parsing helper class CDocManager; / CDocTemplate manager object,MFC类库简介,MFC类库简介,1根类CObject Microsoft基本类库中的大多数类都是由CObject类派生而来。CObject对所有由它派生
8、出的类提供了有用的基本服务。 2MFC应用结构类 MFC应用结构类用于构造一个应用的框架,对大多数应用提供了通用功能。可以在框架中填写对于应用特定的功能。 AppWizard可以产生几种类型的应用,所有这些都以不同的方式使用应用框架。 (1) 应用程序和线程支持类 (2) 命令例程类 (3) 文档类 (4) 文档模板类,MFC类库简介,3窗口、对话框和控件类 (1) CWnd类 (2) 框架窗口类 (3) 对话框类 (4) 视图类 (5) 控件类 (6) 控件条类 4菜单类 5绘图和打印类 6简单的数据类型类 7数组、列表和映射类 8文件和数据库类 (1) 文件I/O类 (2) DAO类 (3
9、) ODBC类 9Internet和网络类:Internet和网络类允许与其他使用ISAPI的计算机或一个Windows Socket交换信息。 10OLE类 11调试和异常类,8.2 使用AppWizard开发MFC应用程序,8.2.1 生成MFC应用程序框架,例8-1 使用MFC AppWizard生成一个简单的MFC应用程序。 建立MFC应用程序框架一般可以通过以下步骤来实现: (1) 启动MFC AppWizard:定义项目名称。 在File菜单下选择New,出现New对话框。,应用程序向导为程序员提供了一个基于MFC的应用程序框架,程序员可以在此基础上添加实现特定功能的代码即可,选择
10、MFC AppWizardexe,在Project name文本输入框中输入新建的项目名如Mymfc。,(2) MFC AppWizard-Step 1对话框:选择应用程序的类型和语言。,(3) MFC AppWizard-Step 2 of 6对话框:设置数据库选项。 在该对话框中可以设置应用程序所包含的如下特点: None:默认选项,不使用数据库特征; Header files only:标题文件; Database view without file support:数据库查看不使用文件支持; Database view with file support:数据库查看使用文件支持。 选择
11、默认选项None后,单击Next按钮,将弹出MFC AppWizard-Step 3 of 6对话框,在应用程序中忽略所有的数据库支持,包括定义基本数据库类的头文件,但不创建对应特定表的数据库类或视图类,创建对应指定表的一个数据库类和一个视图类,不附加标准文件支持,创建对应指定表的一个数据库类和一个视图类,并附加标准文件支持,默认选项,不使用数据库特征,标题文件,数据库查看不使用文件支持,数据库查看使用文件支持,(4) MFC AppWizard-Step 3 of 6对话框:设置OLE选项。 因为这里生成的应用程序不使用OLE,所以选择默认选项None,单击Next按钮。,设置应用程序支持的
12、复合文档类型,使程序员可以向应用程序中加入OLE(Object Linking and Embedding,对象连接与嵌入)支持,设置OLE选项,OLE可以用来创建复合文档,复合文档包含了创建于不同源应用程序,有着不同类型的数据,因此它可以把文字、声音、图像、表格等组合在一起。,(5) MFC AppWizard-Step 4 of 6对话框设置应用程序外观。 可以设置应用程序的外观 可以设置工具栏的风格,设置应用程序的外观,工具栏,初始状态栏,打印和打印预览支持,上下文相关帮助,使用3D控件,是否使用消息API,是否使用Windows套接字,设置工具栏外观,普通的工具栏,具有Internet
13、 Explorer风格的工具栏,设置需要显示的最近使用的文件个数,(6) MFC AppWizard-Step 5 of 6对话框:设置应用程序的风格。 可以设置应用程序的风格 可以设置是否在应用程序向导生成的代码中加注注释。 可以设置使用MFC库文件的方式 选择默认选项后,将弹出MFC AppWizard-Step 6 of 6对话框,如图所示。,设置是否在应用程序向导生成的代码中加注释,标准的MFC应用程序,在向导生成的代码中加注释,具有Windows Explorer风格的应用程序,在向导生成的代码中不加注释,设置使用MFC库文件的方式,以共享动态链接库的方式,以静态链接库的方式,使用动
14、态链接库可以在应用程序运行的时候链接起来,而不是在编译的时候就链接,使生成的应用程序.exe文件比较小,设置应用程序的风格,(7) MFC AppWizard-Step 6 of 6:修改类的信息。 可以设置向导生成的文件名和类名。 在设置好文件名和类名后,弹出新建工程信息对话框,列出了关于新建立的应用程序项目文件的相关信息。,设置向导生成 的文件名和类名(一般不改变),(8) 单击OK按钮,应用程序向导所有的工作就全部完成了,向导已经为用户生成了一个可执行的应用程序框架,(9) 编译运行。MFC AppWizard已经生成了一个基本的应用程序。,MFC应用程序的开发流程,8.2.2 查看Ap
15、pWizard生成的信息,1. 生成的C+类 建立的是一个基于文档/视图结构、单文档、无OLE、无数据库选项的最基本的程序框架所需的类,所以MFC AppWizard为Mymfc程序生成了四个类。 CMymfcApp:应用程序类,负责程序的初始化、运行以及结束处理; CMainFrame:主窗口类,负责主窗口的创建、显示和搜索用户命令以及消息派发; CMymfcDoc:文档类,负责应用程序文档的装载和维护,文档是应用程序需要保存的任何内容; CMymfcView:视图类,负责为文档提供一个或几个视图,视图的作用是为显示和修改文档提供人机界面。,查看AppWizard生成的信息,基类及其声明和定
16、义文件如表所示。,查看AppWizard生成的信息,2. 生成的文件 AppWizard创建项目时,在指定的Mymfc目录下创建了许多文件,文件包含了框架程序的所有的类、全局变量的声明和定义。,生成的文件,1) 工作区、项目和类信息文件 AppWizard生成的应用程序框架是通过项目工作区进行管理。所以,无论选择什么类型的应用程序,AppWizard都要为应用程序生成相应的工作区、项目和类信息文件。,2) 应用程序头文件和源文件 根据应用程序的类型单文档、多文档或基于对话框,AppWizard将自动创建一些应用程序源文件和头文件,这些文件分别是应用程序类、对话窗口类等的声明文件和类实现文件。,
17、3) 资源文件 主要资源文件:Mymfc.rc和resource.h。 资源文件含有一般MFC应用程序的默认菜单定义和加速键表、字符串表 指定了默认的About对话框和一个图标文件res Mymfc.ico 包含标准的MFC类的资源 若指定了支持工具栏,将指定工具栏位图文件res toolbar.bmp 资源文件: Mymfc.rc2,用于存放Visual Studio不可编辑的资源,4) StdAfx.cpp和StdAfx .h 预编译头文件,用于建立一个预编译的头文件Mymfc.pch和一个预定义的类型文件StdAfx.obj 将常用的MFC头文件都放在StdAfx.h中,如afxwin.
18、h、afxext.h、afxdisp.h、afxcmn.h等 让StdAfx.cpp包含StdAfx .h StdAfx.cpp只需编译一次,并能生成预编译头文件 若今后在编程时不想让有些MFC头文件每次都被编译,则可将其加入StdAfx .h 采用预编译头文件可以加速编译过程,8.2.3 浏览项目信息与添加代码,1浏览项目信息 FileView:生成的Mymfc应用程序在项目工作区窗口中显示。,ClassView:显示Mymfc项目中所包含的所有类。双击CMymfcApp类的图标(或单击图标旁的+号)时,ClassView展开该类并显示其类成员。 项目中增减C+类或者在类中增减成员,都可以在
19、ClassView中进行。,项目Mymfc的类视图,ResourceView:AppWizard自动为Mymfc程序生成的资源名称和类型,资源类型包括图标、菜单、加速键、工具栏、版本信息等。,项目Mymfc的资源视图,8.2.3 浏览项目信息与添加代码,2添加代码 添加成员变量:利用VC+的可视化编程工具,具体步骤为:在Workspace窗口的ClassView选项卡中选择要添加成员变量的类。右击此类,在弹出菜单中单击Add Member Variable选项,将出现如图所示的Add Member Variable对话框。,添加代码向导ClassWizard,使用ClassWizard的这五个
20、标签,用户可以进行以下操作: 创建新类,这些新类是从处理Windows消息和记录集的主框架类继承得到的; 将消息映射到函数; 创建新的消息处理函数; 定义成员变量; 删除消息处理函数; 查看哪些消息已经有了处理函数,然后跳到该处理函数的代码处; 创建新类时,添加自动化方法和属性; 与类和类库协同工作;,8.3 MFC应用程序框架与Win32程序的关联,8.3.1 MFC应用程序框架对Win32程序的封装,1Windows程序的基本结构,WinMain()/程序的入口点 WNDCLASS wndclass ; /定义窗口类 RegisterClass ( ,WndProc (hwnd, mess
21、age, wParam, lParam) switch (message) case case WM_DESTROY: /关闭窗口并退出程序 PostQuitMessage (0); default: return DefWindowProc (hwnd,message,wParam,lParam); return (0); ,MFC应用程序框架对Win32程序的封装,2MFC类对WinMain和WndProc的封装 在MFC类中,与应用程序框架相关的类如图所示。,MFC的根类,支持对象动态创建和命令传递,基类,MFC类对WinMain和WndProc的封装,Mymfc程序中,生成的类与以上基
22、类的派生关系如下: 基类派生类 CWinAppCMymfcApp CFrameWnd CMainFrame CDocument CMymfcDoc CView CMymfcView CWinApp和CFrameWnd分别替代了WinMain和WndProc两个函数的功能。 CWinApp类封装了与应用程序有关的程序启动、消息循环启动和程序结束等功能 CFrameWnd封装窗口创建、消息处理和窗口销毁等功能,MFC类库的类定义(afxwin.h),以下为CWinApp和CFrameWnd类与应用程序框架相关的最重要细节: CWinApp的定义:,class CWinApp : public CW
23、inThread DECLARE_DYNAMIC(CWinApp) public: / Constructor CWinApp(LPCTSTR lpszAppName = NULL); / app name defaults to EXE name / Attributes / Startup args (do not change) HINSTANCE m_hInstance; HINSTANCE m_hPrevInstance; LPTSTR m_lpCmdLine; int m_nCmdShow; / Running args (can be changed in InitInstanc
24、e) LPCTSTR m_pszAppName;,/ human readable name LPCTSTR m_pszRegistryKey; / used for registry entries CDocManager* m_pDocManager; / Support for Shift+F1 help mode. BOOL m_bHelpMode; / are we in Shift+F1 mode? public: / set in constructor to override default LPCTSTR m_pszExeName; / executable name (no
25、 spaces) LPCTSTR m_pszHelpFilePath; / default based on module path LPCTSTR m_pszProfileName; / default based on app name / Initialization Operations - should be done in InitInstance virtual BOOL InitApplication(); / Command Handlers protected: / map to the following for file new/open afx_msg void On
26、FileNew(); afx_msg void OnFileOpen();,/ Implementation public: / public for implementation access virtual BOOL InitInstance(); virtual int ExitInstance(); / return app exit code virtual int Run(); virtual BOOL OnIdle(LONG lCount); / return TRUE if more idle processing virtual LRESULT ProcessWndProcE
27、xception(CException* e, const MSG* pMsg); public: virtual CWinApp(); DECLARE_MESSAGE_MAP() ;,CFrameWnd的定义:,class CFrameWnd : public CWnd DECLARE_DYNCREATE(CFrameWnd) public: / Constructors static AFX_DATA const CRect rectDefault; CFrameWnd(); BOOL LoadAccelTable(LPCTSTR lpszResourceName); / Create函数
28、的功能是创建窗口,其内部调用了Win32 API的CreateWindow函数 BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle =WS_OVERLAPPEDWINDOW, const RECT,/ Implementation public: virtual CFrameWnd(); protected: virtual BOOL PreCreateWindow(CREATESTRUCT,消息处理函数 窗口消息 OnCreate() WM_CREATE OnDestroy()WM_DESTROY
29、OnClose() WM_CLOSE,消息映射,程序结构剖析(1),CMymfcApp类的主要作用是处理消息,它统一管理程序收到的所有消息,然后把消息分配到相应的对象。 CMainFrame是CMymfcView的父类,即视窗VIEW显示在主框窗MainFrame的客户区中。,程序结构剖析(2),类CMymfcView的作用是显示数据,而数据的来源是类CMymfcDoc。 在MFC程序中,程序的数据是放在文档中,而显示数据则是利用视窗方式。 文档与视窗分离的好处: 一个文档可以同时具有多个视窗,每个视窗只显示文档中的一部分数据,或以特定的风格显示文档中的数据。 在程序中可以处理多个文档,通过对
30、不同的视窗的处理达到对不同的文档分别处理的目的。 MFC方式的WINDOWS应用程序中,处理消息的是系统自动生成的MFC中的类CWinApp的派生类CMymfcApp。,类CMymfcApp,类CMymfcApp是应用程序运行的基础,此类是由MFC中的类CWinApp派生来的。类中除了有一般类都有的构造函数,一个重要的成员函数就是InitInstance()。 在WINDOWS环境下可以运行同一程序的多个实例,函数InitInstance的作用就是在生成的一个新的实例时,完成一些初始化的工作。 CMymfcApp theApp; 代码的作用是生成一个CMymfcApp类型的对象,生成对象时系统
31、会主动调用InitInstance()函数完成一些必要的初始化工作。,InitInstance 函数,InitInstance 函数,InitInstance 函数,8.3.2 MFC应用程序的启动流程,MFC应用程序从theApp开始启动 构建theApp全局对象 操作系统加载AfxWinMain函数,启动应用程序, InitInstance ()函数调用(在CWinApp的派生类中,必须重载InitInstance函数,因为CWinApp并不知道应用程序需要什么样的窗口,它可以多文档窗口、单文档窗口或基于对话框的) 创建并显示窗口(InitInstance ()函数中“注册文档模板”过程中
32、隐含地创建了主窗口) 。 返回AfxWinMain函数,再调用函数Run(),启动消息循环,接收系统或用户的消息,完成用户需要的功能。 当接收WM_QUIT消息或按下键时,应用程序从Run成员函数内部调用函数ExitInstance () ,使应用程序从当前实例中退出当应用程序终止时,执行清除工作,将控制权交给操作系统。 (应用程序类首先删除m_pMainWnd主框架窗口对象,然后退出Run函数,进而退出WinMain,在退出WinMain后删除TheApp对象)。,类CMainFrame,类CMainFrame,类CMainFrame,类CMainFrame,类CMainFrame,AfxW
33、inMain()的执行过程,AfxWinMain()的执行过程是:调用应用程序对象的InitInstance 成员函数来初始化应用程序,然后调用它的Run()成员函数来处理应用程序的消息循环。当程序运行结束时,Run()调用应用程序的ExitInstance成员函数来做清除工作。 这一过程的示意图:,回到项目中,实现窗口实体的初始化,调试方法,Go(F5): 程序运行到不能再运行的语句(如断点)为止 Step over(F10) : 运行当前箭头指向的代码(只运行一条代码),不进入函数内部,每执行一步便完成对一个函数的调用。 Step Into(F11) : 如果当前箭头所指的代码是一个函数的
34、调用,则用Step Into 进入该函数进行单步执行。 Step Out (shift+F5) : 如果当前箭头所指向的代码是在某一函数内,用它使程序运行至函数返回处。 Run to Cursor(ctrl+ F10) : 使程序运行至光标所指的代码处。,分析程序的结构,实现步骤 点击Step Into(F11)找到主程序WinMain() 两次Step Into(F11)进入AfxWinMain()函数 连续Step over(F10) 找到InitInstance ()函数 点击Step Into(F11)进入InitInstance ()函数 继续Step over(F10) 进行浏览
35、通过调试,可以找出程序的执行顺序 以下进行分析,应用程序对象,所有使用MFC类库的应用程序都有且只有一个“应用程序对象” theApp ,该对象负责应用程序初始化和退出时的清理工作,并且进行应用级的消息处理。 因为过程中没有编写CMymfcApp的构造函数,由于虚函数的作用,MFC是调用CWinApp 的构造函数来产生对象theApp。 应用程序对象提供初始化应用程序和运行应用程序的成员函数。该对象是整个应用程序创建的第一个对象,在系统调用AfxWinMain()前就已生成,因此必须将该对象声明为全局变量。 theApp产生后,就相应分配了内存,程序就诞生了。 从CWinApp派生的应用程序类
36、必须重载InitInstance成员函数以便建立应用程序的主窗口对象。,应用程序对象,应用程序对象中还可以重载以下函数: Run() 循环进行消息处理。它负责检查消息队列,如果有消息,则分发它进行处理,如果没有消息,则调用OnIdle进行空闲时间处理。Run还调用 ExitInstance来退出应用程序。 ExitInstance() 负责程序退出时的清理工作。它只能由Run函数来调用。 OnIdle() 当应用程序的消息队列为空时,会执行一个缺省的消息循环,在该循环中调用OnIdle()函数。应用程序可以通过重载该函数来完成一些后台工作。,Run成员函数的消息循环,Run成员函数的消息循环,
37、WinMain在初始化应用程序实例后,就调用Run函数来处理消息循环。 Run成员函数不断执行消息循环,检查消息队列中有没有消息。 如果有消息,Run将其派遣,交由框架去处理,然后返回继续消息循环。 如果没有消息,Run将调用OnIdle来做用户或框架可能需要在空闲时才做的工作,象后面我们讲到的用户接口更新消息处理等。 如果既没有消息要处理,也没有空闲时的处理工作要做,则应用程序将一直等待,直到有事件发生。 当应用程序结束时,Run将调用ExitInstance。,关键虚拟函数,CWinApp:InitInstance /为应用程序提供自身初始化的机会 virtual BOOL InitIns
38、tance( ); CWinApp:Run /执行消息循环并开始向应用程序窗口发送消息 virtual int Run( ); CWinApp:ExitInstance /应用程序结束 virtual int ExitInstance( ); CWinApp:OnIdle /在应用程序空闲时调用该函数,也就是没有消息等候处理时。通常执行如垃圾回收等后台处理事务。 virtual BOOL OnIdle( LONG lCount );,实际的Mymfc程序或者MFC应用程序的流程比Win32程序要复杂许多,主要差别在于以下几点: (1) 程序的主函数名为全局函数AfxWinMain()而不是Wi
39、nMain()。 (2) 一般MFC应用程序在InitInstance函数中,不仅创建了窗口对象、主框架窗口和视图窗口,并显示应用程序的主框架窗口和视图窗口。 并会创建视图对象和视图窗口、文档对象。 (3) 读取应用程序的消息队列的代码在CWinThread:Run()中。因为CWinThread是CWinApp的基类,所以CWinApp:Run()会调用CWinThread:Run()。它负责从消息队列中读取应用程序的消息到窗口,以保持应用程序的正常运行。在WinMain调用InitInstance之后,便调用Run函数。 (4)成员函数ExitInstance:如果用户通过关闭主框架窗口来
40、关闭应用程序,这个操作就将激发一系列事件的发生,包括从Run中退出,从AfxWinMain中退出和应用程序对象的析构。,应用程序举例1,扩充MymfcView.cpp中的OnDraw成员函数: void CMymfcView:OnDraw(CDC* pDC) CMymfcDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here pDC-TextOut (60,100,Hello,Welcome to Visual C+ 6.0!); ,应用程序举例2,修改MymfcApp.cpp中的InitInstance()函数: BOOL CMymfcApp:InitInstance() / TODO: add draw code for native data here CFrameWnd *Frame=new CFrameWnd(); /建立CFrameWnd控件 m_pMa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 项目预算编制与执行分析工具
- 科技创新推动智能保障承诺书5篇
- 智能工业物联网智能制造解决方案
- 雪中的童话冬天的美丽景色写景7篇范文
- 依法合规专业团队责任承诺书范文7篇
- 林区资源保护职责承诺书(6篇)
- 生产运营部生产线节能量化目标达成确认函(3篇)
- 技术参数确认与交付标准商洽函6篇范文
- 合作双方商业诚信承诺函(9篇)
- 平台安全运维责任落实承诺书(3篇)
- 打包箱拆装转运合同范本
- EPC项目单机试车操作规范与管理制度
- 《WPS Office办公应用案例教程》全套教学课件
- 光伏设计进度计划及保证措施
- 医院职工之家介绍
- 党校住宿管理办法
- 文学常识1000题含答案
- 河南省房屋建筑和市政工程施工安全风险隐患双重预防体系建设实施细则
- 2025水利工程生态产品价值核算技术规范
- 2025年 四川德阳三星堆开发建设有限公司招聘考试笔试试卷附答案
- 正念冥想培训课件
评论
0/150
提交评论