MFC(全称:Microsoft Foundation Classes),微软基础类库。他封装了Windows应用程序的各种API以及相关机制的c++类库。
(1)开发效率高
(2)程序执行效率高,相对C#
(3)迁移性差(仅支持Windows)相对QT
(1)afx.h 将其他MFC头文件包含在内
(2)afxwin.h 包含了各种MFC窗口类,包含了afx.h和windows.h
(3)afxext.h 包含了扩展窗口类的支持,如:工具栏和状态栏
(1)MFC控制台程序:可以调用MFC的控制台程序
(2)MFC库程序
MFC静态库
MFC动态库
MFC扩展库:扩展库只能被MFC应用程序调用
(3)MFC窗口程序
单文档视图架构程序
多文档视图架构程序
对话框应用程序
(1)创建



(2)介绍
双冒号开头函数为win32的API函数,如:
::GetModuleHandle(NULL);
以Afx开头函数为MFC库的全局函数,如:
AfxWinInit(hModule, NULL, ::GetCommandLine()
MFC静态库
(1)创建


MFC动态库
(1)创建



MFC扩展库
(1)创建


(2)说明
扩展库只能被MFC应用调用,而且该库使用动态的MFC库
单文档框架程序
(1)创建



(2)说明
参与架构的类:
- 应用程序类:负责程序流程
- class CMFCSdlApp : public CWinApp
-
- 框架窗口类:负责程序主框架
- class CMainFrame : public CFrameWnd
-
- 视图类:负责窗户口显示
- class CMFCSdlView : public CView
-
- 文档类:负责数据管理数据
- class CMFCSdlDoc : public CDocument
多文档框架程序
(1)创建



(2)说明
参与架构的类:
- 应用程序类:负责程序流程
- class CMFCMdiApp : public CWinApp
-
- 多文档主框架窗口类
- class CMainFrame : public CMDIFrameWnd
-
- 多文档子框架窗口类
- class CChildFrame : public CMDIChildWnd
-
- 视图窗口类:显示数据
- class CMFCMdiView : public CView
-
- 文档类:数据管理
- class CMFCMdiDoc : public CDocument
对话框应用程序
(1)创建



(2)说明
参数框架类:
- 应用程序类:管理流程
- class CMFCDlgApp : public CWinApp
-
- 对话框窗口类
- class CMFCDlgDlg : public CDialogEx
(1)CObject类
MFC类绝大部分的父类,提供了MFC类库中的一只些基本机制
对运行时类信息的支持
对动态创建的支持
对序列化的支持
(2)CWinApp类 应用程序类,封装了应用程序,线程等信息
(3)CDocument类 文档类,管理数据
(4)Frame Windows 框架窗口类,封装了窗口程序组成的各种框架窗口
(5)CSplitterWnd 用来完成拆分窗口的类
(6)Control Bars 控件条(工具栏)类
(7)Dialog Boxes 对话框类,封装了各种对话框
(8)View 视图类,封装了各种显示窗口
(9)Control 控件类,封装了各种常用的控件
(10)Exceptions 异常处理类,封装了中常用的各种异常
(11)File 文件类,各种文件的I/O操作
(12)绘图类,包括CDC类和CGdiObject类
(13)数据集合类,CArray/Clist/CMap,封装了相应的数据结构管理
(14)非Cobject类的子列
CPoint,CTime,CString


Win32程序使用MFC,即可以创建一个MFC应用程序



- // MFCBase.cpp
- #include
-
- //框架窗口类
- class CMyFrameWnd : public CFrameWnd
- {
- };
-
- //应用程序类
- class CMyWinApp : public CWinApp
- {
- public:
- CMyWinApp()
- {
- }
- virtual BOOL InitInstance();
- };
-
- //初始化函数:InitInstance
- //退出释放函数:ExitInstance
- BOOL CMyWinApp::InitInstance()
- {
- CMyFrameWnd* pFrame = new CMyFrameWnd;
- pFrame->Create(NULL, "MFCBase");
- m_pMainWnd = pFrame;
- pFrame->ShowWindow(SW_SHOW);
- pFrame->UpdateWindow();
- return TRUE;
- }
-
- //应用程序类对象,MFC程序入口
- CMyWinApp theApp;
(1)程序启动流程
构造theApp对象,掉调用父类CWinApp的构造函数
将theApp对象的地址保存到线程状态信息中
将theApp对象的地址保存到模块状态信息中
进入WinMain函数,调用AfxWinMain函数(打断点,通过调用堆栈进入)
- AFX_MODULE_STATE aaa;//当前程序模块状态信息
- AFX_MODULE_THREAD_STATE bbb; //当前程序线程状态信息
-
- CWinApp::CWinApp()//构造全局对象CMyWinApp theApp
- {
- AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
- //获取全局变量&aaa
- AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
- //获取全局变量&bbb
- pThreadState->m_pCurrentWinThread = this;//将&theApp保存到bbb的一个成员中
-
- AfxGetThread()
- {
- AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();//获取&bbb
- CWinThread* pThread = pState->m_pCurrentWinThread;
- return pThread;//返回的为&theApp
- }
- pModuleState->m_pCurrentWinApp = this;//将&theApp保存到aaa的一个成员中
- AfxGetApp()
- {
- return AfxGetModuleState()->m_pCurrentWinApp;//返回&theApp
- }
- }
-
- WinMain(...)//程序流程是不是theApp对象指导向哪走
- {
- AfxWinMain(...)
- {
- CWinThread* pThread = AfxGetThread();
- CWinApp* pApp = AfxGetApp();//这两代码都是获取&theApp
-
- pApp->InitApplication();//利用theApp对象调用应用程序类成员虚函数 初始化
- pThread->InitInstance();//利用theApp对象调用应用程序类成员虚函数 创建并显示窗口
- pThread->Run()//利用theApp对象调用应用程序类成员虚函数 消息循环
- {
- for (;;)
- {
- while(没有消息时)
- OnIdle(..);//利用theApp对象调用应用程序类成员虚函数 空闲处理
- do{
- if(GetMessage抓到WM_QUIT)
- return ExitInstance();
- //程序结束前,利用theApp对象调用应用程序类成员虚函数 善后处理。
-
- }while(...)
- }
- }
- }
- }