现在的位置: 首页 > 综合 > 正文

半夜睡不着,MFC搞起来!

2013年08月13日 ⁄ 综合 ⁄ 共 4048字 ⁄ 字号 评论关闭

一 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();//应用程序类的虚函数(善后处理)
		    }
		}
	}
}

 

抱歉!评论已关闭.