一、资源

共有三个和资源有关的文件:资源头文件resource.h、资源描述文件resource.rc和存放在res文件夹下的具体的资源如图片等。

资源头文件中全部是宏定义,应用程序需要为每个资源都定义一个标识符用整数来表示的编号,这些编号就叫做资源标识符(提高了程序的可读性)。

资源描述文件中,是为了描述资源的外观进行定义的一些语句,如菜单资源。

res文件夹下是图片等外部资源。

总之,简单的资源如控件,这类资源的外观和功能只取决于c++代码,所以不需要资源描述文件,更不需要res文件夹,只需要在资源头文件中定义标识符即可。

对于复杂的资源如菜单资源,则需要在资源描述文件中定义好外观,在资源头文件中定义好标识符,但并不需要在res文件夹中有对于的图片等外部文件。

对于位图、图标和鼠标光标等图形或其他的视频数据,需要外部单独文件的,则需要在资源头文件中定义标识符,需要在资源描述文件中说明资源的名称和外部文件的存储位置,需要在res文件夹中存放外部文件。

最终这些定义的资源,包括res文件夹下存放的外部文件会被链接器连同obj文件链接成一个整体exe文件。

二、运行时动态创建对象---利用类信息表CRuntimeClass结构体创建对象

看到标题,大部分会说“运行时创建对象”那不是小儿科,就这样(vb.net语言描述):

Dim newButton As Button = New Button()

newButton.Name = "Button1"

这的确是在运行时创建了一个按钮。不过若需按照用户要求创建按钮、复选框或者单选框怎么办,好像也好办:

Dim newControl As Control

Select Case userSelection     //userSelection 是个字符串

Case "按钮"   newControl = New Button()

Case "复选框"  newControl = New CheckBox()

....

End Select

如果用户需要的是Windows.Forms里面的数十种控件,那么你的Select语句也要写数十行吗?我当然不是想要做这种刁难的用户,但是需求总是多种多样的,若有一种方法能够在运行时任意指定对象的创建类型,甚至是用表示类型的名字的字符串创建所需的对象,该有多么方便。.net Framwork的反射机制给我们带来了解决问题的方法。MFC其实是更早的原型(虽然有缺陷),就是类信息表。

二、动态创建对象:类信息表(或称类信息结构体)

(1)MFC中CRuntimeClass结构体的定义大致如下:

struct CRuntimeClass

{

  LPCSTR m_LpszClassName;  //类名字

  CObject*(PASCAL *m_pfnCreateObject)();  //建立类的工厂函数的指针

  CObject* CreateObject();  //工厂函数原型的声明,这个无意义,暂时不要管他,因为工厂函数定义都是在这个结构体的外部,是全局的或其他类中的函数

  CRuntimeClass* m_pBaseClass;  //基类信息表(一个节点)指针

  CRuntimeClass* m_pNextClass;  //下一个类信息表(一个节点)指针

  ............  //其他的诸如,所描述的对象所占内存大小,版本号等信息

}

实际上一个MFC应用程序有一个全局的总表,便于管理,结构图如下:

这样,根据类名来创建一个对象时,就只需要遍历这个总表找到对应的创建对象的工厂函数即可。

(2)使用时,实际上只需要用到三个宏即可(CRuntimeClass(一个参数),IMPLEMENT_DYNCREATE(两个参数)),RUNTIME_CLASS(一个参数)):

其中,前两个宏需要我们在对于的头文件和cpp文件中添加,而最后一个宏不用管他,我们直接使用就行了。

首先是类信息表(我叫类信息结构)的创建宏(用到两个宏),这个宏完成了类信息结构体的声明和相关成员数据的填充工作(说白了,这个宏给一个类加入了一个含有数据的类信息结构体的实例,并且这个实例是属于这个类的静态成员变量)。

举例如下:

//CMainFrame类的声明

class CMainFrame:public CFrameWnd

{

protected:

  CMainFrame();

  DECLARE_DYNCREATE(CMainFrame)  //完成类信息结构体的声明

  ........................

}

//CMainFrame类的实现

CMainFrame::CMainFrame(){.........}

IMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)  //完成类信息结构体数据成员的填充,需要本类和基类名称。 比如这个宏中会出现:return new CMainFrame;字样,所以创建了对象。

在main函数中使用时,直接用获取“一个类信息结构体对象”的指针的全局宏RUNTIME_CLASS(一个参数)即可,实际上RUNTIME_CLASS内容就是获取类的静态成员变量“类信息结构”。形如下面:

CRuntimeClass*(&CMainFrame::类信息结构成员)。只需要记住这个宏返回一个类信息表的指针(或者说一个元数据的指针)即可。

举例如下:

void main()

{

  //动态创建对象,通过类型信息表的成员“建立类的工厂函数的指针”来调用工厂函数以便动态创建对象。

  CObject* m=RUNTIME_CLASS(CMainFrame)->m_pfnCreateObject();  //本质上是创建了一个CMainFrame对象

  CMainFrame objFrm=(CMainFrame*)m;

  //下面就可以调用objFrm对象的成员函数了。

}

转载于:https://www.cnblogs.com/hnfxs/p/3163501.html

MFC使用简单总结(便于以后查阅)相关推荐

  1. 表格的列标题具有排序功能可便于读者查阅

    表格的栏目名具有排序功能可便于读者查阅 : 下表中,点击蓝色字体的列标题就可以升序排序 序号 基金代码 简称 相关链接 2011-09-30 2011-09-29 日增长值 日增长率 申购状态 单位净 ...

  2. C++之MFC制作简单计算器(VS2019实现),附带完整代码

    资源下载 代码下载 代码失效可以联系本人: 15377920718 效果演示 MFC制作简单的计算器(VS2019实现) VS2019可以用于制作简单的计算器,用的是MFC,通过设立button以及编 ...

  3. 用计算机源码计算加法,MFC实现简单计算器(支持加减乘除和括号运算)

    [实例简介] 自己写的计算器,支持加减乘除和括号运算.开发环境为VS2010,MFC框架.代码内容简单不复杂适合初学者参考. [实例截图] [核心代码] Calculator[VS2010_MFC] ...

  4. MFC CStdioFile简单用法

    转自: http://hi.baidu.com/mysolarstar/blog/item/8d1898012df3b2cd277fb5fc.html VC++ MFC 使用CStdioFile类来操 ...

  5. MFC CStdioFile简单用法

    转自: http://hi.baidu.com/mysolarstar/blog/item/8d1898012df3b2cd277fb5fc.html VC++ MFC 使用CStdioFile类来操 ...

  6. MFC函数简单解释(更新至28日凌晨)

    以该博文http://blog.csdn.net/column/details/megogame.html 为基础,涉及到的每个都尽量解释和说明其用法. 以下是流程图,由于太大,请尝试右键另存为查看. ...

  7. 关于对 NUMA 理解(学习笔记,便于以后查阅)

    对NUMA的理解: NUMA是多核心CPU架构中的一种,其全称为Non-Uniform Memory Access,简单来说就是在多核心CPU中,机器的物理内存是分配给各个核的,架构简图如下所示: 每 ...

  8. cvm服务器虚拟化,云服务器cvm简单高效便于处理能力提升

    在虚拟服务器的成熟技术面前,各行业的网络应用都得到了明显的改善,毕竟简单高效的特点已经极为明显,在不同领域所发挥的作用也为用户的网络体验带来了明显的改善,这也是云服务器cvm能够备受青睐的原因所在,毕 ...

  9. MFC实现简单飞机大战(含游戏声音)

    1 实验内容 本实验主要是实现简单的飞机大战游戏,包含游戏声音.碰撞后爆炸效果,有大小敌机等.所用到的知识点如下: 1.贴图技术 2.飞机类.子弹类实现 3.位图移动 4.碰撞判断,实现爆炸效果 5. ...

最新文章

  1. 如何在Java代码中去掉烦人的“!=null”
  2. 目录 文件 链接管理命令总结
  3. 数据缺失、混乱、重复怎么办?最全数据清洗指南
  4. 2018 前端面试题(不定期更新)
  5. $.each()与$(selector).each()
  6. JS面向对象——class定义类、类的构造函数、实例方法、访问器方法、静态方法、继承、super、多态
  7. 记住:永远不要在MySQL中使用“utf8”,请使用“utf8mb4” 程序员
  8. 聚类算法详解——深度AI科普团队
  9. 从wait_type入手模拟SQL Server Lock
  10. java 取数组的前90位_java 从int数组中获取最大数的方法
  11. android tools add native support,使用NDK进行开发android
  12. 虚拟化技术天书:九宫格图解虚拟化——此文多风险,阅读需谨慎
  13. 修改完out不更新_CyclicBarrier 不就是比 CountDownLatch 多了个回环么?
  14. 桌面被恶意软件放上几个ie图标删除不了怎么办?
  15. text edit model FELIX的理解与python实现
  16. 一键检测Linux VPS/服务器配置、IO、国内节点下载测速
  17. c++模板(函数模板,类中函数模板,类模板)
  18. ip2977_desc.TXT
  19. 家族关系查询系统程序设计算法思路_数据结构课程设计(家族关系查询系统).....
  20. Neat Download Manager Mac(多线程下载管理器)

热门文章

  1. 数据库实验2:数据库的建立与维护
  2. 重名剔除(Deduplicate)
  3. pytorch中lr_scheduler的使用
  4. java执行cmd命令并获取返回结果字符串
  5. jquery遍历元素children、find、parent、parents、parentsUntil、next、prev、siblings、closest、filter、not
  6. Linux环境下实现一个简单socket通信
  7. python123.io简单编程题合集
  8. [2019.05.09]Linux 学习笔记(3)
  9. 【文文殿下】[BZOJ4008] [HNOI2015] 亚瑟王
  10. centos下 将(jgp、png)图片转换成webp格式