当前位置:   article > 正文

半夜睡不着,MFC搞起来!_mfc主播blondbunny

mfc主播blondbunny

一 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 - 保存当前程序 主框架类对象地址

代码:

  1. #include "stdafx.h"
  2. class CMyFrameWnd : public CFrameWnd{
  3. };
  4. class CMyWinApp : public CWinApp{
  5. public:
  6. CMyWinApp();
  7. virtual BOOL InitInstance();
  8. virtual int Run();
  9. };
  10. int CMyWinApp :: Run(){
  11. AfxMessageBox("CMyWinApp::Run");
  12. return 0;
  13. }
  14. CMyWinApp::CMyWinApp(){
  15. };
  16. CMyWinApp theApp;//全局对象
  17. BOOL CMyWinApp::InitInstance(){//此函数内部 this指针为 &theApp
  18. CMyFrameWnd *pFrame = new CMyFrameWnd();
  19. pFrame->Create(NULL,"MFCBase");
  20. this->m_pMainWnd = pFrame;
  21. //将框架类对象地址保存 应用程序类的一个成员中
  22. pFrame->ShowWindow(SW_SHOW);
  23. pFrame->UpdateWindow();
  24. return TRUE;
  25. }



 内部机制的实现大致流程伪代码如下:

  1. AFX_MODULE_STATE aaa;//当前程序模块状态信息 AFX_MODULE_STATE / AFX_MODULE_THREAD_STATE
  2. AFX_MODULE_THREAD_STATE bbb;//当前程序线程状态信息
  3. CMyWinApp theApp{
  4. AFX_MODULE_STATE* pModuleState = m_pModuleState;
  5. //获取全局变量aaa的地址
  6. AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
  7. //获取全局变量bbb的地址
  8. pThreadState->m_pCurrentWinThread = this;
  9. //将&theApp保存到全局变量bbb的一个成员中
  10. AfxGetThread(){
  11. AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
  12. //获取全局变量bbb的地址
  13. CWinThread* pThread = pState->m_pCurrentWinThread;
  14. return pThread;
  15. }
  16. }
  17. **********************************
  18. WinMain(){
  19. AfxWinMain(...){//体会程序流程由 应用程序类控制
  20. CWinThread* pThread = AfxGetThread();
  21. CWinApp* pApp = AfxetApp();
  22. //以上俩句获取 &theApp
  23. AfxWinInit(...);//初始化MFC库
  24. pApp->InitApplication() //虚函数,初始化应用程序
  25. pThread->InitInstance(){
  26. //回到自己的代码
  27. }
  28. pThread->Run(){//虚函数,内部this指针为 &theApp
  29. CWinThread::Run(){//函数内部 this 指针为 &theApp
  30. while(没有消息){
  31. OnIdle(...)//应用程序类的 虚函数.(空闲处理)
  32. }
  33. PumpMessage(){//函数内部 this 指针为 &theApp
  34. if(GetMessage 抓到WM_QUIT)
  35. return FALSE;
  36. }
  37. if(PumpMessage 返回FALSE)
  38. ExitInstance();//应用程序类的虚函数(善后处理)
  39. }
  40. }
  41. }
  42. }


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/947661
推荐阅读
相关标签
  

闽ICP备14008679号