赞
踩
一 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();//应用程序类的虚函数(善后处理)
- }
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。