- 文档模板的实例化
- 在MFC(Microsoft Foundation Classes)应用程序中,文档模板通常是需要实例化的。文档模板类(
CDocTemplate
)主要有两种派生类用于不同的文档 - 视图架构场景:CSingleDocTemplate
(单文档模板)和CMultiDocTemplate
(多文档模板)。 - 当应用程序启动或者在需要处理特定类型文档的时候,这些文档模板会被实例化。例如,在应用程序的
InitInstance
函数(这是CWinApp
类或者其派生类中的一个关键函数,用于初始化应用程序实例)中,通常会看到文档模板的实例化代码。对于单文档应用程序,可能会有如下代码:
- 在MFC(Microsoft Foundation Classes)应用程序中,文档模板通常是需要实例化的。文档模板类(
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDocument),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
- 对于多文档应用程序,会使用
CMultiDocTemplate
进行类似的实例化操作。这里的IDR_MAINFRAME
是资源ID,用于标识与文档相关的资源(如菜单、图标等),RUNTIME_CLASS
宏用于获取类的运行时信息,在这个例子中,它指定了文档类(CMyDocument
)、框架窗口类(CMainFrame
)和视图类(CMyView
),这样文档模板就知道了如何创建和关联这些对象来处理特定类型的文档。
- 实例化的作用和意义
- 实例化文档模板的主要作用是建立起文档、视图和框架窗口之间的联系,并且为处理特定类型的文档做好准备。一旦文档模板被实例化并添加到应用程序(通过
AddDocTemplate
函数),当用户打开一个新文档或者应用程序需要创建特定类型的文档时,就可以根据这个文档模板来生成相应的文档、视图和框架窗口组合。 - 例如,在单文档应用程序中,当用户启动应用程序时,基于实例化的单文档模板,系统会创建一个文档对象、一个框架窗口对象和一个视图对象,并且将它们关联起来,使得用户可以通过视图来操作文档内容,而框架窗口为视图提供了容器和一些基本的窗口功能(如标题栏、菜单等)。在多文档应用程序中,文档模板的实例化同样为创建和管理多个文档及其对应的视图和框架窗口提供了基础,使得用户可以同时打开和处理多个同类型的文档。
- 实例化文档模板的主要作用是建立起文档、视图和框架窗口之间的联系,并且为处理特定类型的文档做好准备。一旦文档模板被实例化并添加到应用程序(通过
RUNTIME_CLASS什么意思
RUNTIME_CLASS
宏的基本含义- 在MFC(Microsoft Foundation Classes)中,
RUNTIME_CLASS
是一个宏。它用于获取一个类的运行时信息,这个信息主要与C++ 的运行时类型识别(Runtime Type Identification,RTTI)机制相关。具体来说,它返回一个指向CRuntimeClass
结构的指针,CRuntimeClass
结构包含了类的名称、类的大小、类的基类等信息,这些信息对于在运行时动态地创建对象、确定对象的类型等操作非常重要。
- 在MFC(Microsoft Foundation Classes)中,
在文档模板实例化中的应用
- 当在实例化文档模板(如
CSingleDocTemplate
或CMultiDocTemplate
)时使用RUNTIME_CLASS
宏,是为了告诉文档模板相关类的运行时信息。以CSingleDocTemplate
的实例化代码为例:
- 当在实例化文档模板(如
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDocument),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CMyView));
- 这里的
RUNTIME_CLASS(CMyDocument)
、RUNTIME_CLASS(CMainFrame)
和RUNTIME_CLASS(CMyView)
分别提供了文档类(CMyDocument
)、框架窗口类(CMainFrame
)和视图类(CMyView
)的运行时信息。文档模板(CSingleDocTemplate
)会利用这些信息在需要的时候(比如用户打开一个新文档)动态地创建这些类的对象,并且正确地建立它们之间的关联。例如,它知道通过RUNTIME_CLASS(CMyDocument)
所指向的运行时信息来创建一个文档对象,并且将这个文档对象与通过RUNTIME_CLASS(CMyView)
创建的视图对象以及RUNTIME_CLASS(CMainFrame)
创建的框架窗口对象相连接,从而实现文档 - 视图 - 框架窗口的组合,用于处理特定类型的文档。
- 与运行时类型识别的联系
- 通过
RUNTIME_CLASS
宏获取的运行时信息,可以在程序运行过程中进行类型检查和类型转换等操作。例如,可以使用IsKindOf
函数(它是CRuntimeClass
结构相关的一个函数)来检查一个对象是否是某个特定类或者其派生类的类型。假设pObject
是一个指向某个对象的指针,通过以下代码可以检查它是否是CMyDocument
类或者其派生类的类型:
- 通过
if (pObject->IsKindOf(RUNTIME_CLASS(CMyDocument)))
{
// 执行相关操作,如果对象是CMyDocument类或者其派生类
}
- 这种运行时类型识别的功能在MFC应用程序中非常有用,比如在消息处理、对象持久化(将对象保存到文件或者从文件恢复)等场景中,能够根据对象的类型来采取正确的操作。