http://blog.csdn.net/dw903632958/article/details/8878368
一 MFC的概念和作用
1 什么是MFC?
全称 Microsoft Foundation Class Library 我们称之为微软基础类库, 封装了各种windowsAPI函数,C++语法 中的一些数据结构。
1) MFC就是一个类库。
2)MFC还是一个程序框架。
2 为什么使用MFC?
基于框架之上编程,提供编程速度,降低开发周期,减少
开发成本。
二 MFC的头文件
afx - application frameword X
Afx......函数为MFC库中的全局函数。
双冒号修饰的函数 基本可以确定为 windows API函数
afx.h - 包含了MFC的各种头文件
afxwin.h - 包含了afx.h和windows.h
afxext.h - 包含了对扩展窗口类的支持
例如:工具栏、状态栏等等。
三 MFC的应用程序类型
1 使用MFC库的控制台程序多了一个全局变量 CWinApp theApp入口函数,和普通控制台的入口函数有区别
AfxWinInit - MFC库中的全局函数,初始化MFC库。
2 库程序
2.1 使用MFC的静态库程序
2.2 使用MFC的动态库程序
1)使用动态MFC库 制作自己的规则动态库
2)使用静态MFC库 制作自己的规则动态库
3) 扩展MFC库
对MFC库功能的扩展,必须在支持MFC库的环境中才可以调用。
3 MFC的窗口程序
3.1 单文档视图构架程序(SDI)
CFrameWnd - 框架窗口类,负责管理主框架窗口。
CWinApp - 应用程序类,负责整个程序的执行流程。
CDocument - 文档类,负责管理数据。
CView - 视图窗口类,负责管理视图窗口,在视图窗口显示中显示数据
3.2 多文档视图构架程序(MDI)
CMDIChildWnd - 子框架窗口,负责管理子框架窗口
CMDIFrameWnd - 主框架窗口类,负责管理主框架窗口
CWinApp - 应用程序类,负责整个程序的执行流程。
CDocument - 文档类,负责管理数据。
CView - 视图窗口类,负责管理视图窗口,在视图窗口显示中显示数据
3.3 对话框构架程序
CWinApp - 应用程序类,负责整个程序的执行流程。
CDialog - 对话框窗口类,负责管理对话框窗口。
四 MFC类库中类的概述
1 CObject - MFC库中绝大部分类的基类。封装了MFC库中最基本的机制
运行时类信息机制
动态创建机制
2 CCmdTarget - 消息映射机制的最基类
3 CWinApp/CWinThread - 应用程序类。
4 CDocTemplate - 文档模板类
CSingleDocTemplate/CMultiDocTemplate
5 CDocument及其子类 - 文档类,负责管理数据
6 Exceptions - 异常类,封装了MFC程序的各种异常情况
7 CFile及其子类 - 文件操作类,封装了对硬盘文件的操作
8 CWnd - MFC库中所有窗口类的最基类
9 Frame Windows - 框架窗口类,管理框架窗口。
10 Control Bars - 控件条类
11 Property Sheets - 属性页类(属性表单类)
12 Dialog Boxes - 各种对话框类,管理各种对话框窗口
13 Views - 视图窗口类,负责管理各种视图窗口
14 Controls - 控件类,管理各种控件,以及对控件的操作
15 CDC、CGdiObject及其类 - 绘图类
16 CArrary/CMap/CList及其子类 - 对c++的数据结构
进行封装。
17 非CObject 类 主要封装了各种数据结构
例如:CPoint/CRect.....
五 第一个MFC程序
1 设置环境
1.1 删除入口函数(WinMain)
1.2 更改头文件为 afxwin.h
1.3 Project-->Settings中设置使用MFC库。
2 程序启动
2.1 构造 theApp 全局对象 执行构造函数
1)将theApp的地址保存到当前程序模块状态信息中
2)将theApp的地址保存到当前程序线程状态信息中
注意:
AfxGetThread/AfxGetApp - 返回 theApp对象地址。
2.2 程序的执行
1)进入入口函数WinMain,在函数内部调用
全局函数AfxWinMain
2)AfxWinMain的执行过程
1 获取 theApp 对象地址
2 调用AfxWinInit初始化MFC库
3 利用theApp对象地址调用 应用程序类的成员虚
函数 InitApplication 初始化应用程序
4 利用theApp对象地址调用 应用程序类的成员虚
函数 InitInstance 注册/创建 / 显示 窗口
5 利用theApp对象地址调用 应用程序类的成员选
函数 Run 消息循环
6 程序退出 利用 theApp对象地址调用 应用程序类
成员虚函数 ExitInstance 善后处理
3 应用程序类(CWinApp)
3.1 成员虚函数
InitApplication/InitInstance/Run/ExitInstance
3.2 成员变量
m_pMainWnd - 保存当前程序 主框架类对象地址
代码:
#include "stdafx.h"
class CMyFrameWnd : public CFrameWnd{
};
class CMyWinApp : public CWinApp{
public:
CMyWinApp();
virtual BOOL InitInstance();
virtual int Run();
};
int CMyWinApp :: Run(){
AfxMessageBox("CMyWinApp::Run");
return 0;
}
CMyWinApp::CMyWinApp(){
};
CMyWinApp theApp;//全局对象
BOOL CMyWinApp::InitInstance(){//此函数内部 this指针为 &theApp
CMyFrameWnd *pFrame = new CMyFrameWnd();
pFrame->Create(NULL,"MFCBase");
this->m_pMainWnd = pFrame;
//将框架类对象地址保存 应用程序类的一个成员中
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}
内部机制的实现大致流程伪代码如下:
AFX_MODULE_STATE aaa;//当前程序模块状态信息 AFX_MODULE_STATE / AFX_MODULE_THREAD_STATE
AFX_MODULE_THREAD_STATE bbb;//当前程序线程状态信息
CMyWinApp theApp{
AFX_MODULE_STATE* pModuleState = m_pModuleState;
//获取全局变量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;
}
}
**********************************
WinMain(){
AfxWinMain(...){//体会程序流程由 应用程序类控制
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxetApp();
//以上俩句获取 &theApp
AfxWinInit(...);//初始化MFC库
pApp->InitApplication() //虚函数,初始化应用程序
pThread->InitInstance(){
//回到自己的代码
}
pThread->Run(){//虚函数,内部this指针为 &theApp
CWinThread::Run(){//函数内部 this 指针为 &theApp
while(没有消息){
OnIdle(...)//应用程序类的 虚函数.(空闲处理)
}
PumpMessage(){//函数内部 this 指针为 &theApp
if(GetMessage 抓到WM_QUIT)
return FALSE;
}
if(PumpMessage 返回FALSE)
ExitInstance();//应用程序类的虚函数(善后处理)
}
}
}
}