半夜睡不着,MFC搞起来!

2023-11-03

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


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

半夜睡不着,MFC搞起来! 的相关文章

  • 将运算符 << 添加到 std::vector

    我想添加operator lt lt to std vector
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 无法将字符串文字分配给装箱的 std::string 向量

    这是我的类型系统的简化版本 include
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • C++继承时派生类与基类有同名函数时如何分别引用

    一 普通函数同名 当某个函数func 在基类和派生类中都有定义时 派生类中的函数func 将修改从基类继承来的函数func 如果非要从派生类中访问基类的函数func 有两种方法 定义基类指针 让基类指针指向派生类对象 则调用的是基类func
  • ns2报错

    若报以下错误 finish couldn t execute nam no such file or directory 最简单的解决方法是在命令行中到你的ns安装目录下 进入nam目录 输入 sudo make install
  • k8s部署SpringBoot项目

    一 前言 本文将介绍如何通过CICD将SpringBoot框架的Web项目发布到k8s集群中 文章中有使用到eureka的注册 如果对如何在k8s集群中部署eureka 那么可以参考本人的 k8s部署eureka集群 文章 如果只是为了测试
  • java常见笔试题目

    1 下列那一行代码编译后不会出现警告或错误 1 char c a 2 byte b 257 3 boolean b null 4 int i 10 5 float f 1 3 2 下面这段代码编译时会发生什么情况 public class
  • 基于光栅波导结构的 R AR&MR 系统的 建模

    增强现实和混合现实 AR MR 作为全新的头戴式显示概念 作为 5G 时代的一个核心应用 具有巨大的市场需求和潜力 其中一种典型的 AR MR 设备是基于光栅波导结构 而正是因为 光学光栅这种微纳元件的使用 我们不能简单地使用基于几何光学的
  • 无线充电技术

    在過去的百年之中 作為電器與插座之間的連線 電線已經成了一種習慣且不可或缺的存在 儘管無線充電技術在實驗室中已存在多年 卻始終因為需求不高而無法量產 不過 這一切將在不久的未來改變 一場以無線充電為主角的科技革命 正以近年來被廣泛使用的各種
  • 很漂亮的按钮css样式(没有用到图片,可直接拷贝代码使用)

    对于程序员 有时候也需要对页面风格做些改动 整体的页面风格还是美工的工作 按钮其实是程序员很常用的 如果美工没有设计好 那就自己设计吧 在网上发现有乐于奉献的人共享了代码 效果很好 而且没有使用到图片 这个很重要 如果你使用别人的css 里
  • 智能家居解决方案及企划书

    一 背景 随着科技的不断发展 智能家居已经成为了一种趋势 越来越多的人开始追求智能化 便捷化 舒适化的生活方式 智能家居市场也因此迅速崛起 本企划书旨在为智能家居市场提供一套完整的解决方案 帮助企业在竞争激烈的市场中占据一席之地 二 市场分
  • verilog设计——SPI

    spi master timescale 1ns 1ps module spi master parameter CLK FREQUENCE 50 000 000 system clk frequence SPI FREQUENCE 5 0
  • 【简单代码】Python 海龟画图简单实现任何图象落在窗口中心处(五角星为例)

    话不多说直接上代码 import turtle import math def go centre zuobiao 此函数实现初始笔点左上移 因为本代码五角星是顺时针画 即在右下角 hang list lie list for hang l
  • Win7/Win10移动用户文件夹(C:\Users)移到非系统盘(如D:)

    Windows的用户文件夹默认所在位置是系统盘 通常是C盘 下的 Users 目录之内 该文件夹中保存着所有的用户个人数据 比如你保存在 桌面 上的文件 实际上是保存在C Users 你的用户名 Desktop 目录之中 再比如你保存在 我
  • 基于标志点特征高精提取与匹配方法,进行双目、结构光、RGBD相机、单目相机多视拼接

    1 工作原理 人工张贴标志点 变换位置拍照 相邻照片的公共视野内有相同的标志点群 匹配两张照片对应标志点对 通过三对以上标志点对 实现两张照片间的坐标变换求解 2 标志点特征 圆形 分类 编码 粘贴于被测物体表面 可利用编码信息辅助特征匹配
  • RTSP/Onvif协议安防平台EasyNVR调用接口录像会被自动删除的原因排查与解决

    EasyNVR安防视频云服务是基于RTSP Onvif协议接入的视频平台 可支持将接入的视频流进行全平台 全终端的分发 分发的视频流包括RTSP RTMP HTTP FLV WS FLV HLS WebRTC等 平台丰富灵活的视频能力 可应
  • yaml语法及格式校验

    基本语法 1 yml文件以缩进代表层级关系 2 缩进不允许使用tab只能使用空格 3 空格的个数不重要 只要相同层级的元素左对齐即可 4 大小写敏感 5 数据格式为 名称 空格 值 也就是说 如果冒号后面有值 冒号后面必须要有空格 另外 后
  • 572. Subtree of Another Tree

    Given two non empty binary trees s and t check whether tree t has exactly the same structure and node values with a subt
  • 不用除号乘号完成除法(C++)

    这个问题是再力扣剑指offer上看到的 题目是 给定两个整数 a 和 b 求它们的除法的商 a b 要求不得使用乘号 除号 以及求余符号 第一印象看到这道题标注的是简单题 但我感觉他不简单 看了讲解之后感觉也不是很难 解题开始 首先一个思想
  • 180道大厂算法工程师(Python语言)面试题合集

    一 算法面试题指南 算法面试一直是程序员大厂面试中的必备环节 接下来 我将从学习思路 学习工具 训练方法 模拟实战这四个角度来分析算法面试经验 1 思路篇 博观而约取 厚积而薄发 1 时间复杂度 空间复杂度 时间复杂度是衡量算法执行效率的重
  • win7 系统盘如何瘦身! 可整理出4-5G。

    1 移走虚拟内存文件到非系统盘 大家都知道 为了加快系统的运行 Windows提供了虚拟内存机制 而在Windows7中 默认是开启这项功能的 而且虚拟内存文件在系统盘 比如一台2G内存的机器 虚拟内存文件大小就是2G 我们完全可以将他移走
  • Eclipse优化,关闭不必要的验证,简单粗暴!

    路径 Window gt Preferences gt Validation 如下图所示 只需勾选这几项即可
  • 半夜睡不着,MFC搞起来!

    一 MFC的概念和作用 1 什么是MFC 全称 Microsoft Foundation Class Library 我们称之为微软基础类库 封装了各种windowsAPI函数 C 语法 中的一些数据结构 1 MFC就是一个类库 2 MFC