一、MFC介绍-程序员宅基地

技术标签: Windows-MFC  mfc  

一、什么是MFC

        MFC(全称:Microsoft Foundation Classes),微软基础类库。他封装了Windows应用程序的各种API以及相关机制的c++类库。

1、特点:

(1)开发效率高

(2)程序执行效率高,相对C#

(3)迁移性差(仅支持Windows)相对QT

二、MFC程序介绍

1、MFC类库常用头文件

(1)afx.h 将其他MFC头文件包含在内

(2)afxwin.h 包含了各种MFC窗口类,包含了afx.h和windows.h

(3)afxext.h 包含了扩展窗口类的支持,如:工具栏和状态栏

2、MFC程序的分类

(1)MFC控制台程序:可以调用MFC的控制台程序

(2)MFC库程序

        MFC静态库

        MFC动态库

        MFC扩展库:扩展库只能被MFC应用程序调用

(3)MFC窗口程序

        单文档视图架构程序

        多文档视图架构程序

        对话框应用程序

三、MFC程序

1、控制台程序

(1)创建

 

 

(2)介绍

        双冒号开头函数为win32的API函数,如:

::GetModuleHandle(NULL);

        以Afx开头函数为MFC库的全局函数,如:

AfxWinInit(hModule, NULL, ::GetCommandLine()

2、MFC库程序

MFC静态库

(1)创建

 

MFC动态库

 (1)创建

 

 

 MFC扩展库

(1)创建

 

 (2)说明

        扩展库只能被MFC应用调用,而且该库使用动态的MFC库

3、MFC窗口程序

单文档框架程序

(1)创建

  

  

 (2)说明

         参与架构的类:

应用程序类:负责程序流程
class CMFCSdlApp : public CWinApp

框架窗口类:负责程序主框架
class CMainFrame : public CFrameWnd

视图类:负责窗户口显示
class CMFCSdlView : public CView

文档类:负责数据管理数据
class CMFCSdlDoc : public CDocument

多文档框架程序

(1)创建

 

 

(2)说明

        参与架构的类:

应用程序类:负责程序流程
class CMFCMdiApp : public CWinApp

多文档主框架窗口类
class CMainFrame : public CMDIFrameWnd

多文档子框架窗口类
class CChildFrame : public CMDIChildWnd

视图窗口类:显示数据
class CMFCMdiView : public CView

文档类:数据管理
class CMFCMdiDoc : public CDocument

对话框应用程序

(1)创建

 

 

(2)说明

        参数框架类:

应用程序类:管理流程
class CMFCDlgApp : public CWinApp

对话框窗口类
class CMFCDlgDlg : public CDialogEx

四、MFC类库介绍

1、MFC库的相关类介绍

(1)CObject类

        MFC类绝大部分的父类,提供了MFC类库中的一只些基本机制

        对运行时类信息的支持

        对动态创建的支持

        对序列化的支持

(2)CWinApp类 应用程序类,封装了应用程序,线程等信息

(3)CDocument类 文档类,管理数据

(4)Frame Windows 框架窗口类,封装了窗口程序组成的各种框架窗口

(5)CSplitterWnd 用来完成拆分窗口的类

(6)Control Bars 控件条(工具栏)类

(7)Dialog Boxes 对话框类,封装了各种对话框

(8)View 视图类,封装了各种显示窗口

(9)Control 控件类,封装了各种常用的控件

(10)Exceptions 异常处理类,封装了中常用的各种异常

(11)File 文件类,各种文件的I/O操作

(12)绘图类,包括CDC类和CGdiObject类

(13)数据集合类,CArray/Clist/CMap,封装了相应的数据结构管理

(14)非Cobject类的子列

        CPoint,CTime,CString

五、第一个的MFC程序

1、创建

 

Win32程序使用MFC,即可以创建一个MFC应用程序

 2、实现MFC应用程序基本框架

//    MFCBase.cpp
#include <afxwin.h>

//框架窗口类
class CMyFrameWnd : public CFrameWnd
{
};

//应用程序类
class CMyWinApp : public CWinApp
{
public:
	CMyWinApp()
	{
	}
	virtual BOOL InitInstance();
};

//初始化函数:InitInstance
//退出释放函数:ExitInstance
BOOL CMyWinApp::InitInstance()
{
	CMyFrameWnd* pFrame = new CMyFrameWnd;
	pFrame->Create(NULL, "MFCBase");
	m_pMainWnd = pFrame;
	pFrame->ShowWindow(SW_SHOW);
	pFrame->UpdateWindow();
	return TRUE;
}

//应用程序类对象,MFC程序入口
CMyWinApp theApp;

3、程序解析

(1)程序启动流程

        构造theApp对象,掉调用父类CWinApp的构造函数

                将theApp对象的地址保存到线程状态信息中

                将theApp对象的地址保存到模块状态信息中

                进入WinMain函数,调用AfxWinMain函数(打断点,通过调用堆栈进入)

AFX_MODULE_STATE aaa;//当前程序模块状态信息
AFX_MODULE_THREAD_STATE bbb; //当前程序线程状态信息

CWinApp::CWinApp()//构造全局对象CMyWinApp theApp
{
  AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
               //获取全局变量&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;//返回的为&theApp
  }
  pModuleState->m_pCurrentWinApp = this;//将&theApp保存到aaa的一个成员中
  AfxGetApp()
  {
    return AfxGetModuleState()->m_pCurrentWinApp;//返回&theApp
  }
}

WinMain(...)//程序流程是不是theApp对象指导向哪走
{
  AfxWinMain(...)
  {
    CWinThread* pThread = AfxGetThread();
    CWinApp* pApp = AfxGetApp();//这两代码都是获取&theApp

    pApp->InitApplication();//利用theApp对象调用应用程序类成员虚函数 初始化
    pThread->InitInstance();//利用theApp对象调用应用程序类成员虚函数 创建并显示窗口
    pThread->Run()//利用theApp对象调用应用程序类成员虚函数 消息循环
    {
      	for (;;)
	{
          while(没有消息时)
              OnIdle(..);//利用theApp对象调用应用程序类成员虚函数 空闲处理
          do{
              if(GetMessage抓到WM_QUIT)
                return ExitInstance();
                 //程序结束前,利用theApp对象调用应用程序类成员虚函数 善后处理。

          }while(...)
        }
    }
  }
}

代码链接:https://download.csdn.net/download/liutit/86245889

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liutit/article/details/125860703

智能推荐

前端开发之vue-grid-layout的使用和实例-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏34次。vue-grid-layout的使用、实例、遇到的问题和解决方案_vue-grid-layout

Power Apps-上传附件控件_powerapps点击按钮上传附件-程序员宅基地

文章浏览阅读218次。然后连接一个数据源,就会在下面自动产生一个添加附件的组件。把这个控件复制粘贴到页面里,就可以单独使用来上传了。插入一个“编辑”窗体。_powerapps点击按钮上传附件

C++ 面向对象(Object-Oriented)的特征 & 构造函数& 析构函数_"object(cnofd[\"ofdrender\"])十条"-程序员宅基地

文章浏览阅读264次。(1) Abstraction (抽象)(2) Polymorphism (多态)(3) Inheritance (继承)(4) Encapsulation (封装)_"object(cnofd[\"ofdrender\"])十条"

修改node_modules源码,并保存,使用patch-package打补丁,git提交代码后,所有人可以用到修改后的_修改 node_modules-程序员宅基地

文章浏览阅读133次。删除node_modules,重新npm install看是否成功。在 package.json 文件中的 scripts 中加入。修改你的第三方库的bug等。然后目录会多出一个目录文件。_修改 node_modules

【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure-程序员宅基地

文章浏览阅读883次。【代码】【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure

整理5个优秀的微信小程序开源项目_微信小程序开源模板-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏97次。整理5个优秀的微信小程序开源项目。收集了微信小程序开发过程中会使用到的资料、问题以及第三方组件库。_微信小程序开源模板

随便推点

Centos7最简搭建NFS服务器_centos7 搭建nfs server-程序员宅基地

文章浏览阅读128次。Centos7最简搭建NFS服务器_centos7 搭建nfs server

Springboot整合Mybatis-Plus使用总结(mybatis 坑补充)_mybaitis-plus ruledataobjectattributemapper' and '-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏3次。前言mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。..._mybaitis-plus ruledataobjectattributemapper' and 'com.picc.rule.management.d

EECE 1080C / Programming for ECESummer 2022 Laboratory 4: Global Functions Practice_eece1080c-程序员宅基地

文章浏览阅读325次。EECE 1080C / Programming for ECESummer 2022Laboratory 4: Global Functions PracticePlagiarism will not be tolerated:Topics covered:function creation and call statements (emphasis on global functions)Objective:To practice program development b_eece1080c

洛谷p4777 【模板】扩展中国剩余定理-程序员宅基地

文章浏览阅读53次。被同机房早就1年前就学过的东西我现在才学,wtcl。设要求的数为\(x\)。设当前处理到第\(k\)个同余式,设\(M = LCM ^ {k - 1} _ {i - 1}\) ,前\(k - 1\)个的通解就是\(x + i * M\)。那么其实第\(k\)个来说,其实就是求一个\(y\)使得\(x + y * M ≡ a_k(mod b_k)\)转化一下就是\(y * M ...

android 退出应用没有走ondestory方法,[Android基础论]为何Activity退出之后,系统没有调用onDestroy方法?...-程序员宅基地

文章浏览阅读1.3k次。首先,问题是如何出现的?晚上复查代码,发现一个activity没有调用自己的ondestroy方法我表示非常的费解,于是我检查了下代码。发现再finish代码之后接了如下代码finish();System.exit(0);//这就是罪魁祸首为什么这样写会出现问题System.exit(0);////看一下函数的原型public static void exit (int code)//Added ..._android 手动杀死app,activity不执行ondestroy

SylixOS快问快答_select函数 导致堆栈溢出 sylixos-程序员宅基地

文章浏览阅读894次。Q: SylixOS 版权是什么形式, 是否分为<开发版税>和<运行时版税>.A: SylixOS 是开源并免费的操作系统, 支持 BSD/GPL 协议(GPL 版本暂未确定). 没有任何的运行时版税. 您可以用她来做任何 您喜欢做的项目. 也可以修改 SylixOS 的源代码, 不需要支付任何费用. 当然笔者希望您可以将使用 SylixOS 开发的项目 (不需要开源)或对 SylixOS 源码的修改及时告知笔者.需要指出: SylixOS 本身仅是笔者用来提升自己水平而开发的_select函数 导致堆栈溢出 sylixos

推荐文章

热门文章

相关标签