MFC类库相关的头文件
- stdafx.h:不是类库的头文件,可以称为项目的头文件,在其中包含了一些MFC标准头文件(如:windows.h,afxwin.h),预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果(生成projectname.pch)。这样可以加快编译速度,节省时间。
- Afxwin.h:MFC核心组件和标准组件
- Afxext.h:MFC扩展
- Afxcmn.h:MFC对Windows 公共控件的支持
- Afxdisp.h:MFC自动化类
- Afxdtctl.h:MFC对Internet Explorer 4 公共控件的支持
MFC相关类的说明
对象类CObject |
MFC类库中绝大部分类的父类。提供了MFC类库的一些基本的机制。包括对运行时类信息,动态创建和串行化的支持 |
应用程序类CWinApp |
封装应用程序,线程等信息。是应用程序开始创建的第一个对象(theApp),并且是结束前最后一个执行的对象。启动时,应用程序类负责创建程序的其它对象,在InitInstance()函数中完成。 |
文档模板类 CDocTemplate |
两个子类CSingleDocTemplate和CMultiDocTemplate。 |
文档类CDocument |
封装数据的管理 |
框架窗口类 Frame Windows |
封装了窗口程序组成的各种框架 |
对话框类Dialog Boxes |
封装了各种对话框,通用对话框等 |
视图类Views |
封装了各种显示窗口 |
控件类Controls |
封装了各种常用的控件 |
异常类 Exceptions |
封装了MFC各种常见的异常 |
文件类File Service |
封装了各种文件的I/O操作 |
绘图类 CDC/CGdiObject |
封装了绘图DC/API/绘图对象 |
数据支持 ODBC/DAO |
|
数据集合类 CArray/CList/CMap |
|
以上都是CObject的子类 非CObject类的子类 |
提供了各种数据结构相关的管理 |
MFC应用程序类型
应用程序 |
对话框程序 ① CWinApp-应用程序类 ② CDialog-对话框窗口类 注:①和②导出的项目是相同的 单文档视图程序 ① CWinApp-应用程序类 ② CFrameWnd-框架窗口类 ③ CView-视图窗口类 ④ CDocument-文档类 多文档视图程序 ① CWinApp-应用程序类 ② CMDIFrameWnd-多文档主框架窗口类 ③ CMDIChildWnd-多文档子框架窗口类 ④ CView-视图窗口类 ⑤ CDocument-文档类 |
MFC库程序 |
支持MFC的静态库 MFC的动态库 ① 静态链接MFC库 ② 动态链接MFC库 ③ MFC扩展库 |
支持MFC的控制台程序 |
MFC程序启动过程
1.0 程序启动,CXXApp中的全局变量定义:CXXApp theApp,调用CWinApp()构造函数(将theApp对象的地址分别保存到线程状态信息和模块状态信息中);调用CXXApp()构造函数
1.1 进入WinMain函数,调用AfxWinMain(_tWinMain为宏,值为WinMain)
1.2 AfxWinMain函数的执行
1.2.1 获取theApp对象的地址
1.2.2 调用AfxWinInit,初始化MFC库
1.2.3 调用InitApplication,初始化应用程序数据
1.2.4 调用InitInstance,在函数中创建并显示窗口
1.2.5 调用Run进行消息循环处理
1.2.6 结束MFC库,退出程序
涉及到MFC函数的源文件位置根目录
- CWinApp构造函数: MFC=>SRC=>APPCORE.CPP
- AfxWinMain:MFC=>SRC=>WINMAIN.CPP
- AfxEndDeferRegisterClass: MFC=>SRC=>APPCORE.CPP
- CFrameWnd::PreCreateWindow()函数所在文件:MFC=>SRC=>WINFRM.CPP
- CFrameWnd::Create()函数路径:MFC=>SRC=>WINFRM.CPP
- CWnd::CreateEx()函数路径:MFC=>SRC=>WINCORE.CPP
- CWinThread::Run()方法路径:MFC=>SRC=>THRDCORE.CPP
实例:对话框类应用程序
1.新建项目MFCTest-->MFC应用程序-->下一步-->选择基于对话框-->下一步-->下一步-->-下一步->CMFCTestDlg-->完成。
2.做成:
3.在界面中,右击某一控件,添加变量
其会自动生成如下代码
CDlogMFCADlg::CDlogMFCADlg(CWnd* pParent /*=NULL*/) : CDialogEx(CDlogMFCADlg::IDD, pParent) , m_nX(0)//当在界面给控件添加关联变量时,会自动添加 , m_nY(0) , m_nAnser(0) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CDlogMFCADlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); //与上面是一起的,当在界面给控件添加关联变量时,会自动添加 DDX_Text(pDX, IDC_EDIT_X, m_nX); DDX_Text(pDX, IDC_EDIT_Y, m_nY); DDX_Text(pDX, IDC_EDIT_ANSSER, m_nAnser); } BEGIN_MESSAGE_MAP(CDlogMFCADlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_ADD, &CDlogMFCADlg::OnBnClickedButtonAdd)//当双击界面按钮时,会自动添加 ON_BN_CLICKED(IDC_BUTTON_MINUS, &CDlogMFCADlg::OnBnClickedButtonMinus) ON_BN_CLICKED(IDC_BUTTON_OK, &CDlogMFCADlg::OnBnClickedButtonOk) END_MESSAGE_MAP()
4.双击控件,添加逻辑处理
void CDlogMFCADlg::OnBnClickedButtonAdd() { UpdateData(TRUE); m_nAnser=m_nX+m_nY; UpdateData(FALSE); } void CDlogMFCADlg::OnBnClickedButtonMinus() { UpdateData(TRUE); m_nAnser=m_nX-m_nY; UpdateData(FALSE); } void CDlogMFCADlg::OnBnClickedButtonOk() { CDialogEx::OnOK(); }
5.其结果会有
其实,我们做的工作并不多,大部分流程都是系统框架给做了,这样有主要把精力放在实际的业务逻辑上。不过要熟悉其MFC的程序执行流程和框架。