一、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

智能推荐

mysql 实数型变量定义,PL/pgSQL从入门到放弃(2)-变量定义与数据类型-程序员宅基地

文章浏览阅读256次。本文由 @小刘先森 原创,转载请注明出处。使用PL/pgSQL也有比较久的时间了,写几篇从入门开始学习的文章,方便小伙伴们学习。PL/pgSQL从入门到放弃(1)-入门PL/pgSQL从入门到放弃(2)-变量定义与数据类型PL/pgSQL从入门到放弃(3)-函数PL/pgSQL从入门到放弃(4)-控制结构PL/pgSQL从入门到放弃(5)-游标声明变量上一篇介绍到,PL/pgSQL是块结构的语言。..._plsql实数

warning C4251-程序员宅基地

文章浏览阅读115次。c++ - Warning C4251 when building a DLL that exports a class containing an ATL::CString member - Stack Overflow_warning c4251

真·卷积神经网络发明者福岛邦彦获奖!李飞飞、LSTM之父点赞祝贺-程序员宅基地

文章浏览阅读1.8k次。点击下方卡片,关注“CVer”公众号AI/CV重磅干货,第一时间送达本文转载自:机器之心1980 年,福岛邦彦首次使用卷积神经网络实现了模式识别,他被认为是真正的卷积神经网络发明者。近日,..._卷积 彦

C语言 预处理指令和宏定义_c#宏定义和预处理指令-程序员宅基地

文章浏览阅读167次。C语言 预处理指令和宏定义_c#宏定义和预处理指令

华为S系列交换机修改密码不成功_华为s1730s交换机重置密码失败怎么办-程序员宅基地

文章浏览阅读2.4w次,点赞2次,收藏18次。问题描述 在客户局点为接入层设备S5700-52P-LI-AC做预配置,配置完成后客户要求修改维护账号huawei的密码为该局点专用密码。修改前AAA下配置如下: aaa authentication-scheme default authorization-scheme default accountin..._华为s1730s交换机重置密码失败怎么办

摄影光学与镜头pdf_【摄影科普】揭秘老蛙24mmF14探针式微距镜头光学原理-程序员宅基地

文章浏览阅读1.7k次。今天聊一聊这支火遍国内外的老蛙24mm F14 2X Macro Probe视频作者:苏科大物理实验(bilibili)以下为图文版,看视频不方便的朋友可以先看看图文!细长的结构,24mm的视角,两倍的微距,老蛙探针式微距镜头可以呈现独特的视觉体验。细长的镜头结构由三部分组成,物镜组、接力镜头组和微距放大镜头组。被拍摄物体经过三组镜头三次成像,最终呈现在相机的感光元件上。第一部分,物镜组..._探针镜头原理

随便推点

java 虚拟机最佳实践_深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)-程序员宅基地

文章浏览阅读43次。第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的改进:根据最新的JDK1.7对全书内容进行了全面的升级和补充;增加了大量处理各种常见JVM问题的技巧和最佳实践;增加了若干与生产环境相结合的实战案例;对第1版中的错误和不足之处的修正等等。第2版不...

程序员进阶篇:简单聊聊mysql的脏读、不可重复读-程序员宅基地

文章浏览阅读905次,点赞18次,收藏13次。脏读,就是读到了其他会话还没有提交的修改。下面用例子说明:可以看到,会话 2 修改了 id 为 222 的用户,在还没提交或回滚事务之前,会话 1 就读到了这些改动。脏读的本质就是,还没结束的写操作被读操作分割了。所以,为了解决脏读,就必须让写操作不可被读操作分割(当然,也不能被其他写操作分割),即保证所谓的原子性。不可重复读,就是在同一个事务中,多次读相同的记录但读到了不同的结果。

eclipse javaee版本配置tomcat并向tomcat发布工程 ._eclipse javaee 编译 发布-程序员宅基地

文章浏览阅读3.9k次。1.下载最新的eclipse javaee版本,下载地址为:http://www.eclipse.org/downloads/,这里注意一定要选择javaee版本,2.Tomcat下载,链接为:http://tomcat.apache.org/3.下载eclipse tomcat插件,下载地址为:http://download.csdn.net/detail/longsheng_eclipse javaee 编译 发布

第十一届 “MathorCup“- B题:基于机器学习的团簇能量预测及结构全局寻优方法-程序员宅基地

文章浏览阅读214次。团簇是由多个分子或原子聚集在一起的微观结构,研究团簇的全局最优结构(即能量最低)对于发现新型材料的结构和性能具有重要意义。传统的理论研究方法存在计算时间长、计算效果差等问题,而机器学习作为一个极具前景的多学科交叉领域,能够有效提高模型学习与计算的效率。因此本文针对三维团簇的能量预测和结构寻优问题,采用了多种机器学习方法进行研究。最后,我们对模型进行了灵敏度分析不断改变学习因子的数值,发现模型预测出的能量值波动幅度较低,具有较强的稳定性,证明了建立模型的可靠性、有效性及鲁棒性,

【HTML/CSS/JavaScript-编程指南】-程序员宅基地

文章浏览阅读676次,点赞8次,收藏10次。学习网站:https://www.runoob.com/html/html-tutorial.html。

推荐文章

热门文章

相关标签