[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并加载相关的资源;

0 0
原创粉丝点击