一、MFC的概念和作用
1、什么MFC?
全称 Microsoft Fundation Class Library,我们称之为微软基础类库 从硬盘的存在形式上来说MFC就是一个库。 从原理上来说,MFC还是一个程序框架。
2、为什么使用MFC?
基于框架开发,提供工作效率,减少开发周期,降低开发成本。
二、MFC应用程序的分类
1、使用MFC制作自己的库程序:静态库程序,规则动态库程序,扩展动态库程序
2、使用MFC制作自己的窗口程序:
单文档视图架构程序
CFrameWnd - 框架窗口类(封装了框架窗口的操作)
CWinApp - 应用程序类,(封装了关于流程管理)
CDocument -文档类,(封装了关于数据的管理,例如:提取/转换/存储..)
CView - 视图窗口类,(封装了关于视图窗口的操作)
多文档视图架构程序
CMDIChildWnd - 子框架窗口类(封装了子框架窗口的操作)
CMDIFrameWnd - 主框架窗口类(封装了主框架窗口的操作)
CWinApp - 应用程序类,(封装了关于流程管理)
CDocument -文档类,(封装了关于数据的管理,例如:提取/转换/存储..)
CView - 视图窗口类,(封装了关于视图窗口的操作)
对话框架构程序
CWinApp - 应用程序类,(封装了关于流程管理)
CDialog - 对话框窗口类,(封装了关于对话框窗口的操作)
三、MFC类概述
1、CObject - MFC库中绝大部分类的最基类,运行时类信息机制 / 动态创建机制 / 序列化机制
2、CCmdTarget - 消息映射机制的最基类
3、CWinThread / CWinApp - 应用程序类,管理程序流程。
4、CDocument及其子类 - 文档类,管理数据
5、Exceptions - 异常处理类,封装了MFC库中可能出现各种异常情况
6、CFile及其子类 - 文件操作类,封装了文件的读写等等各种操作。
7、CWnd - 所有窗口类的最基类
8、Frame Windows - 框架窗口类,封装了关于框架窗口的各种操作
9、DialogBox - 对话框窗口类,封装了关于各种对话框的操作
10、Views - 视图窗口类,封装了关于各种视图窗口的操作
11、Controls - 控件窗口类,封装了关于各种控件窗口的操作
12、CDC及其子类,绘图设备类,封装了各种绘图设备的操作
13、CGdiObject及其子类,绘图对象类,封装了各种绘图对象的操作
14、Array / List / Map - 封装了标准中的各种容器结构
15、非CObject类 - 封装了标准中的各种结构的操作,例如:CPoint 、CRect、CTime、CString....
四、制作第一个MFC程序,环境为VS2019
1、新建新建Windows桌面向导
2、配置项目
3、将该项目设为启动项
4、修改属性为多字节,静态库中使用MFC
5、新建MFCbase.cpp源文件
6、文件内容为:
#include <afxwin.h> //定义一个自己的框架类(CMyFrameWnd),派生自CFrameWnd class CMyFrameWnd : public CFrameWnd { }; //定义一个自己的应用程序类(CMyWinApp), 派生自CWinApp,并重写父类的成员虚函数 InitInstance(创建并显示框架窗口) class CMyWinApp : public CWinApp { public: CMyWinApp(); virtual BOOL InitInstance(); }; //定义一个非常非常非常重要的全局变量 theApp(爆破点) CMyWinApp::CMyWinApp()//构造,不写也行,会有默认的 { } CMyWinApp theApp;//爆破点 BOOL CMyWinApp::InitInstance() {//此函数中的this为&theApp CMyFrameWnd* pFrame = new CMyFrameWnd; pFrame->Create(NULL, "测试"); this->m_pMainWnd = pFrame; pFrame->ShowWindow(SW_SHOW); pFrame->UpdateWindow(); return TRUE; }
7、程序执行流程:
构造theApp(爆破点)
1)将&theApp保存到 当前程序线程状态信息 中。
2)将&theApp保存到 当前程序模块状态信息 中。
进入入口函数(WinMain)
1)利用 AfxGetThread() / AfxGetApp()获取 &theApp
2)利用theApp调用应用程序类的成员虚函数InitApplication (初始化)
3)利用theApp调用应用程序类的成员虚函数InitInstance (创建并显示窗口)
4)利用theApp调用应用程序类的成员虚函数Run(消息循环)
5)当没有消息时,利用theApp调用应用程序类成员虚函数OnIdle (空闲处理)
6)当程序退出时,利用theApp调用应用程序类成员虚函数ExitInstance (善后处理)
8、运行效果:
注意:
::开头的函数为WIN32的API函数
Afx开头的函数为MFC中的全局函数