MFC使用简单总结(便于以后查阅)
一、资源
共有三个和资源有关的文件:资源头文件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对象的成员函数了。
}
MFC使用简单总结(便于以后查阅)的更多相关文章
- MFC时间简单比较方法
MFC//时间简单比较方法 void CMFCsaveListTofileDlg::OnBnClickedButton6()//时间简单比较方法 { // TODO: 在此添加控件通知处理程序代码 C ...
- MFC的简单加法器(二)
创建对话框主要分两大步,第一,创建对话框资源,主要包括创建新的对话框模板.设置对话框属性和为对话框添加各种控件:第二,生成对话框类,主要包括新建对话框类.添加控件变量和控件的消息处理函数等.鸡啄米在本 ...
- MFC制作简单通讯录程序
学习c++和MFC一段时间了,苦于没有项目实战,所以自己写了一个简单的简单通讯录程序,以前用c#写简单很多,例程是这本书上的实例,我的第一个winform程序也是从这本书上学的,总结c#写的话更简单, ...
- 关于对 NUMA 理解(学习笔记,便于以后查阅)
对NUMA的理解: NUMA是多核心CPU架构中的一种,其全称为Non-Uniform Memory Access,简单来说就是在多核心CPU中,机器的物理内存是分配给各个核的,架构简图如下所示: 每 ...
- MFC实现简单飞机大战(含游戏声音)
1 实验内容 本实验主要是实现简单的飞机大战游戏,包含游戏声音.碰撞后爆炸效果,有大小敌机等.所用到的知识点如下: 1.贴图技术 2.飞机类.子弹类实现 3.位图移动 4.碰撞判断,实现爆炸效果 5. ...
- MFC之简单计算器
1.界面 2.变量 combobox的变量类型是CComBoBox类型,三个输入框是double类型: 它的type是Drop List 3.代码 (1).初始化combobox BOOL Ccalc ...
- MFC TreeControl简单应用
目录 1. TreeControl添加节点 2. TreeControl菜单 3. TreeControl修改节点 4. TreeControl查找节点 5. TreeControl折叠展开节点 6. ...
- DCMTK354之VC++ 2008 MFC应用程序配置完整过程
花了一个礼拜,终于在VC++2008 MFC 应用程序中完成了首个基于DCMTK354的首个程序ECHOSCUWIN32,现将过程记录下来,便于日后查阅,同时也提供给那些有幸看到此博文而对他们又有帮助 ...
- Qt简介 及与MFC、GDK+的比较
Qt C++图形用户界面应用程序开发框架. Qt的由来和发展 1.QT由来 Haavard Nord 和Eirik Chambe-Eng于1991年开始开发"Qt",1994年3月 ...
随机推荐
- Atitit.跨语言系统服务管理器api兼容设计
Atitit.跨语言系统服务管理器api兼容设计 1. Common api,兼容sc ,service control??1 1.1. 服务创建,use sc1 1.2. 服务delete ,use ...
- iOS中文输入法多次触发的问题及解决方案
最近要在移动端实现一个文本框实时搜索的功能,即在文本框里每输入一个字,就向服务器请求一次搜索结果.暂且不考虑性能优化问题,第一时间想到的是用keyup实现: $('input').on('keyup' ...
- 【数据挖掘】分类之Naïve Bayes(转载)
[数据挖掘]分类之Naïve Bayes 1.算法简介 朴素贝叶斯(Naive Bayes)是监督学习的一种常用算法,易于实现,没有迭代,并有坚实的数学理论(即贝叶斯定理)作为支撑. 本文以拼写检查作 ...
- Memcached下载、安装及使用演示。
Memcached下载及安装: 下载地址: memcached-1.4.5-amd64.zip================================================通过cmd ...
- jsonp 小结
JSONP是JSON with Padding的略称. 它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实 ...
- Android开发 adb命令提示:Permission denied (转)
如题:模拟器版本->android 7.1.1 遇到这样的情况把模拟器root一下就好了:su root =============2017年4月3日20:57:33============== ...
- CardView的具体使用方法(转)
转载自:CardView的具体使用方法 因为学习做此记录方便查找使用 今天主要是CardView的用法,CardView是在安卓5.0提出的卡片式控件.首先介绍一下它的配置. 在gradle文件下添 ...
- selenium驱动Firefox跳转页慢慢慢的问题(待验证)
转载至http://www.cnblogs.com/yicaifeitian/p/5198871.html 为了解决这个问题,我是查了很多资料,解决方案是百度出来的.抱歉,我忘记出处在哪了,代码如下: ...
- Hadoop环境搭建2_hadoop安装和运行环境
1 运行模式: 单机模式(standalone): 单机模式是Hadoop的默认模式.当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选择了最小配置.在这种默认模式下所有 ...
- 大华NVR设备接分别入宇视摄像机Onvif和RTSP主子码流的方案说明
需求提要 1.各个内网现场有多种网络摄像机IPC和网络硬盘录像机NVR设备: 2.需要将这些设备统一接入到云端中心平台,进行统一的视频直播和录像回放管理: 3.由于目前IPC设备都属于高清设备,主码流 ...