1. MFC是什么?
微软基础类库(英语:Microsoft Foundation Classes
,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
MFC把Windows SDK API函数包装成了几百个类,MFC给Windows操作系统提供了面向对象的接口,支持可重用性、自包含性以及其他OPP原则。MFC通过编写类来封装窗口、对话框以及其他对象,引入某些关键的虚函数(覆盖这些虚函数可以改变派生类的功能)来完成,并且MFC设计者使类库带来的总开销降到了最低。
2. 编写第一个MFC应用程序
2.1 代码的编写
项目的创建和之前一样,只是此次的源文件后缀为.cpp
,因为MFC是由C++编写的,编写MFC程序需要包含#include <afxwin.h>
头文件。
配置环境后,代码才可编译运行:
2.2 程序执行流程
① 程序开始时,先实例化应用程序对象(有且只有一个)
② 执行程序的入口函数InitInstance()
③ 给框架类MyFrame
对象动态分配空间(自动调用它的构造函数),在其构造函数内部,通过CWnd::Create
创建窗口
④ 框架类对象显示窗口CWnd::ShowWindow
⑤ 框架类对象更新窗口CWnd::UpdateWindow
⑥ 保存框架类对象指针CWinThread::m_pMainWnd
2.3 代码分析
2.3.1 CFrameWnd 框架窗口类
CFrameWnd是从CWnd
(窗口基类)派生出来的。CFrameWnd
模仿框架窗口行为,我们可以把框架窗口作为顶层窗口看待,它是应用程序与外部世界的主要接口。
如果想要创建一个窗口,可以在此类中调用CWnd::Create
或CWnd::CreateEX
函数:
virtual BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL );
Create 接收的8个参数后6个有默认值定义
lpszClassName 指定了窗口基于WNDCLASS类的名称,为此将其设定为NULL将创建一个基于已注册的WNDCLASS类的默认框架窗口
lpszWindowName 参数指定将在窗口的标题栏出现的文字
2.3.2 CWinApp应用程序类
MFC应用程序的核心就是基于CWinApp类的应用程序对象。CWinApp提供了消息循环来检索消息并将消息调度给应用程序窗口。它还包括可被覆盖的、用来自定义应用程序行为的主要虚函数。
一个MFC程序可以有且仅有一个应用程序对象,此对象必须声明为在全局范围内有效,以便它在程序开始时即在内存中被实例化。
2.3.3 InitInstance函数
CWinApp::InitInstance函数是一个虚函数,其默认操作仅有一条语句:
CWinApp::InitInstance函数是一个虚函数,其默认操作仅有一条语句: BOOL MyApp::InitInstance()//程序入口地址 { return TRUE; }
InitInstance的目的是给应用程序提供一个自身初始化的机会,其返回值决定了框架接下来要执行的内容,如果返回FALSE将关闭应用程序,如果初始化正常返回TRUE以便允许程序继续进行。此函数是MFC应用程序的入口。
2.3.4 m_pMainWnd 成员变量
在CWinApp中有一个名为CWinThread::m_pMainWnd的成员变量。 该变量是一个CWnd类型的指针,它保存了应用程序框架窗口对象的指针。也就是说,是指向CFramWnd对象(框架窗口类对象)的指针。