[MFC]动态对象创建、文档模板加载.rc资源
来源:互联网 发布:弗洛伊德算法 编辑:程序博客网 时间:2024/06/05 21:03
1. MFC动态创建对象的实现:
1) 可以看到文档/视图结构中的三个类(App、View、Doc)都使用了动态创建类型的技术;
2) MFC实现动态对象创建只需要三步即可:
i. 从CObject派生类型;
ii. 在类声明部分使用DECLARE_DYNCREATE(类名)宏声明该类是一个可以动态创建的类型;
iii. 在类实现部分使用IMPLEMENT_DYNCREATE(类名, 基类名)来实现动态创建对象的具体功能;
!!可以看到在Wizzard生成的代码中,在构造函数声明之后使用DECLARE_DYNCREATE宏,在.cpp中的消息映射之前使用了IMPLEMENT_DYNCREATE宏;
3) DECLARE_DYNCREATE的原理:
i. 可以实现C++语法不允许的运行时创建类,例如:
CString strMyClass = _T("MyClass");CMyClass *ptr = new strMyClass;ii. 其底层展开实际上是声明了一个CRuntimeClass对象以及两个函数(GetRuntimeClass和CreateObject);
iii. CRuntimeClass对象用来保存宏参数中输入的自定义的类名;
iv. GetRuntimeClass以CRuntimeClass对象作为输入并动态创建和注册CRuntimeClass中保存的自定义类名;
!!改函数可以返回一个CRuntimeClass*:virtual CRuntimeClass* GetRuntimeClass() const;
!!其实在CSingleDocTemplate中使用的RUNTIME_CLASS()返回的就是CRuntimeClass指针,其实在宏内功就调用了GetRuntimeClass来获取运行时类型信息;
v. CreateObject可以创建上面动态定义和注册的类的对象(其函数体就包含一句话,即return new CMyClass);
vi. DECLARE宏展开后是具有访问限定符public的,因此里面声明的函数都是类的共有成员函数,因此在文档构造函数中可以使用RUNTIME_CLASS的返回值来调用CreateObject来创建动态定义的类的对象:RUNTIME_CLASS(CView)->CreateObject(),当然这个调用发生在文档模板的构造函数中;
4) IMPLEMENT_DYNCREATE的原理:展开后最主要的内容就是CreateObject的实现
CObject* PASCAL CMyClass::CreateObject() { return new CMyClass; }
2. 文档模板加载.rc资源的过程:
1) CSingleDocTemplate的构造函数的第一个参数是一个资源ID,可以用一个这样的ID来表示4种资源:应用程序图标、菜单、菜单加速键、文档字符串(关于文档字符串的内容会用一章特别讲解),但前提是想要一次性加载那么多资源就必须得将这些资源都用同一个ID来命名;
2) 加载.rc资源的过程:
i. RUNTIME_CLASS->CreateObject创建主框架对象;
ii. 调用该对象的LoadFrame接受CSingleDocTemplate传入的资源ID并加载相关的资源;
- [MFC]动态对象创建、文档模板加载.rc资源
- 动态创建模板,视图和文档对象的过程
- MFC动态创建对象
- 仿MFC动态对象创建
- kubernetes创建资源对象yaml文件例子--rc
- MFC rc资源LOAD FAIELD
- MFC单文档视图之图标资源加载及绘制
- 关于MFC中的动态对象创建
- MFC之对象的动态创建
- MFC多文档模板手动创建框架的一个问题
- MFC MDI使用自定义模板对话框创建子文档
- MFC加载图片资源
- MFC复习和学习 第五章 MFC动态创建 MFC文档 MFC消息处理 MFC单文档应用程序 MFC多文档应用程序
- MFC 动态提取资源
- 纯资源(.rc)DLL创建与使用
- VS2010 VC++创建.rc资源文件
- kubernetes资源对象--RC和RS
- 2.3--如何创建 具有 新的文档模板资源ID 的资源?
- IAR常用快捷键和使用小技巧
- ScheduledThreadPoolExecutor
- Android 百度云推送
- bzoj-2278 Garbage
- 开发指南专题十七-JEECG图表配置说明
- [MFC]动态对象创建、文档模板加载.rc资源
- Xpages 主题的使用
- 轻码云(PaaS), 携码验证创业梦
- Neural Networks, Manifolds, and Topology
- 【VC++】程序运行到if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)异常的解决方案
- 数据库端分页的写法(即所谓的真分页)
- 验证Xcode真伪的方法,来自苹果官网
- linux下yum安装配置mysql数据库
- linux 安装问题make: 没有指明目标并且找不到makefile。 停止