创建支持动态框架窗口布局的通用文档模板





3.00/5 (8投票s)
2002年12月15日
4分钟阅读

50489

670
介绍一种编程技术,用于设计非常复杂、丰富的文档类型。
引言
MFC类库最重要的特点是实现文档-视图体系结构的机制。当你使用MFC文档-视图机制创建基于文档的应用程序时,你可能会面临以下问题:
- MFC应用程序支持的文档类型受文档模板集合的限制。通常,一个MFC应用程序只能支持有限的文档模板。
- 一个MFC应用程序通常包含有限的“MFC视图”类。
- 由于只有有限的“MFC视图”类,一个MFC程序只能支持有限的窗口布局类型,并且实现一个框架窗口布局通常需要编写非常复杂的C++代码。
- 用户通常无法添加或扩展应用程序支持的新的视图类,并且在应用程序编译完成后,用户或开发人员无法添加应用程序内部支持以外的新框架窗口布局。
- 用户扩展代码很困难。
- 在不同的应用程序之间共享“MFC视图”非常困难。
ObjManager
是一个MFC库,用于实现通用文档模板,以克服文档模板不足的限制。通常,一个文档模板只能有一个文档类、一个子框架窗口和一些视图,使用C++代码实现一个文档模板的多种文档布局非常困难。通常,要实现不同的文档布局,您必须覆盖框架窗口的OnCreateClient
类成员函数,并且您必须编写硬编码的C++代码。将文档布局与文档结构分离并为文档模型实现“设计模型”是一个好主意。典型的文档布局通常由一些分割器、一些视图和一些类似选项卡(tab)的窗口组成。有可能以一种视觉化的方式(无需C++编码)实现文档布局的设计机制,并且有可能为一个特殊的文档类型实现多种文档布局,并将相应的布局信息数据保存到相应的文档中,并在用户打开它时恢复。有关详细技术信息,请参考ObjManager
库(包含完整的源代码)。
如何创建包含通用文档类型并支持多种文档布局的MFC框架应用程序?
示例项目包含所有源代码,请下载并编译它。
如何在VisualFrameWork中动态使用MFC CView?
请参考CAtlForm
类和TestFormView
类的实现。
如何创建包含MFC视图并能在MFC应用程序(如“VisualFrameWork”)中以共享方式使用的DLL库?
请参考示例项目MfcViewLib。
如何使用源代码?
- 您必须编译lib objmanager.lib。
- 在VS.NET环境中设置正确的包含路径,以便正确编译其他项目。
- 编译项目VisualFrameWork并链接objmanager.lib。
- 编译项目MfcViewLib。
- 编译项目VbComLib。
- 编译项目VCSharpComLib。
- 编译VBDoc文件夹中的项目prjVBDoc。
- 编译CNN文件夹中的项目PrjCnn。
- 运行项目VisualFrameWork。
- 打开DemoDoc文件夹中的文档“Demo1”、“Demo2”和“Demo3”。
如何插入组件(MFC视图、ActiveX控件、ActiveX文档和.NET组件)?
在设计器中,请在ComWndID
中输入对象ID:如果要创建ActiveX控件、ActiveX文档或.NET控件,请输入正确的相应对象类ID。例如,如果要创建VB ListView
控件(由Visual Basic 6提供),您需要输入“mscomctllib.listviewctrl
”。如果要创建DLL(如mfcviewlib.dll)中存在的MFC视图,请输入其“库名”+“.”+“类名”,例如,如果要创建视图CShareFormview1
,您的输入将是“mfcviewlib.cshareformview1”。如果要创建宿主应用程序中的视图,只需输入C++类名作为对象ID。输入对象ID后,单击“创建COM窗口”按钮。
(设计界面:在库MfcViewLib.dll中创建视图)
(在宿主应用程序中创建名为“TestFormView”的视图)
如何使插入的组件相互交互?
您可以控制应用程序外部的这些组件。您可以使用任何编程语言来处理这些组件的交互。您只需将应用程序所需的对象引用到另一个项目;并将其连接到应用程序。例如,我有一个名为PrjVBDoc.UD的VB项目。我有一个名为CShareFormview3
的MFC视图。根据上述规则,将这两个对象插入到应用程序中。交互的关键部分是在填写COMWinID
后填写对象名。这就是交互的接口,对象名必须与接口名统一(我稍后会介绍)。
插入这两个对象后,您可以打开一个VB Active DLL项目。在此项目中引用“PrjVBDoc”、“VisualFrameWork1.0”和“MFCViewLibLib 1.0 Type Library”。并将以下代码添加到类中
'Reference the document of application.
Dim WithEvents ThisDoc As VisualFrameWorkLib.Document
'Reference VB project
Dim WithEvents xForm1 As prjVBDoc.ud
'Reference MFC View.
Dim WithEvents xForm2 As MfcViewLibLib.AtlView3
Public Property Let TangramDoc(ByVal vNewValue As Object)
Set ThisDoc = vNewValue
'ObjectName must be unified with the object name you input in the designer.
Set xForm1 = ThisDoc.ObjectX("Form1")
Set xForm2 = ThisDoc.ObjectX("Form2")
End Property
Private Sub xForm1_ShowText(ByVal str As String)
xForm2.GetText str
End Sub
编译此项目,然后切换到主界面。在菜单栏的“视图”选项中找到“DocProperty”。在“文档对象ID:”文本框中填写VB DLL名称。
保存更改后,您会发现当您在VB创建的文本框中输入一些文字并单击“Command1”按钮时,您输入的文字将显示在MFC视图创建的右侧编辑控件中。
如果您想获得新版本的objmanger,请访问我们的网站 here。