我想问一下如何实现在MDI内的同一个文档模板内,实现多个不同类型的文档(Document)和相应的视,而不是用不同的文档模板来实现不同的文档类型和视。
如果能实现的话,在新建文件和打开、存储文件时,如何识别要打开或新建的文档和视是属于哪一个文档的,从而实现对不同文档的存储功能。
谢谢。
15 个解决方案
#1
up
#2
帮你UP 一下
#3
帮楼主顶!关注!
#4
up
#5
关注
#6
up
#7
up
#8
up
#9
hehe,一个文档多个视图倒可以实现。多文档多视图又不用文档模板就不知道了。
#10
提供我认为可能的一种思路:
1、建立多个和各种文档类型对应的视图,一开始都隐藏;
2、拦截OnFileNew()函数,先让选择新建文件类型,然后显示对应的视图;
3、拦截OnFileSave()、OnFileSaveAs()函数,保存的是那个视图就调用哪个视图的OnSerialize()函数进行文档保存;
4、拦截OnFileOpen()函数,判断打开文档类型,然后显示对应的视图,也用该视图的OnSerialize()将数据读出。
这中思路的特点就是:人为的关联文档和视图,而不是靠系统自己操作,这样就能实现你的功能了
1、建立多个和各种文档类型对应的视图,一开始都隐藏;
2、拦截OnFileNew()函数,先让选择新建文件类型,然后显示对应的视图;
3、拦截OnFileSave()、OnFileSaveAs()函数,保存的是那个视图就调用哪个视图的OnSerialize()函数进行文档保存;
4、拦截OnFileOpen()函数,判断打开文档类型,然后显示对应的视图,也用该视图的OnSerialize()将数据读出。
这中思路的特点就是:人为的关联文档和视图,而不是靠系统自己操作,这样就能实现你的功能了
#11
可是如何实现在同一模板内实现不同的文档呢?比如在模板pTempLate内有一个文档1Doc,如何将2Doc加入该模板中,谢谢。
swimmingfish2004(something)说可以一文档多个视图,请问如何在一个文档内加入多个视,能给出代码吗?谢谢。我用AddView()老是出错。
swimmingfish2004(something)说可以一文档多个视图,请问如何在一个文档内加入多个视,能给出代码吗?谢谢。我用AddView()老是出错。
#12
up
#13
我估计swimmingfish2004(something)兄说的是“一框架多个视图”的意思
“一模板内实现不同的文档呢”实现的可能性不大,当然,也可能是我见识少了,呵呵
“一模板内实现不同的文档呢”实现的可能性不大,当然,也可能是我见识少了,呵呵
#14
“一模板内实现不同的文档”是可以实现的,早在2000年本人就实现了这个模型.事实上,也可以实现一个程序对应任意多个文档摸版,问题的关键是以下几个方面:
一、如何使得你的程序支持任意多个CView的派生类;如果这个问题不解决,支持任意多个文档就毫无意义。如果你考虑用COM或.NET模型,你可以实现一类动态连接库,这类Dll中包含CView类的实现(可以包含任意多个CView对象),难度是你如何得到这些个CView对象,事实上,MFC库中有一个类CRuntimeClass,这个类是一个类信息的链表,在一个MFC程序中就是依靠这个类来创建类对象的,你的程序如果支持任意多个类,必须有一个途径在其他库中加载由您或其他开发者提供的CView类,可以考虑的是在程序中建立一个类字典(例如一个CMapStringToObj对象),这样您可以需要一个CView类时先从对应的字典中查询相对的类信息(CRuntimeClass),如果查询成功,用CRuntimeClass的成员函数CreateObject创建类对象,如果查询失败,就加载相应的动态连接库以填充类字典,关键是类字典的设计,如果设计得当,您的程序可以恰当的初始化相关的库以加载需要的CView类信息。
二、文档保存,这是个十分关键的问题,MFC中的文档序列化问题的关键是CRuntimeClass,可序列化的CObject形成一个list结构,您可以参考CRuntimeClass的实现,这个问题相对复杂,如果需要,本人可以写篇文章详细描述,可以肯定的是这个问题可以彻底解决,文档保存的另一个关键问题是文档结构信息的描述,本人采用的技术途径是结构化存储,即Microsoft的复合文档技术,可以参考COM技术资料以及MFC中COleDocument类的实现。
三、文档打开,由于异构文档结构存在很大的差别,文档打开的第一步是得到文档结构的描述,现在可行的办法是,你可以用XML描述你的文档结构,然后将XML描述保存在一个CString中,采用结构化存储技术,你可以在每个文档中建立一个子存储结构,打开文档时,首先打开保存文档结构的子存储以得到描述文档结构的XML描述,采用XML解析技术(COM机制参考MSXML模型,.NET可以参考相关的.NET技术文档),注意,每个类初始化(CView、CSplitterWnd以及其他的CWnd、CObject对象均可以在XML中精确的描述)信息在解析XML过程中进行。
四、文档设计,你必须实现一种可描述的文档结构,流行的做法是XML,利用XML,你可以实现可读性很好的文档结构描述(例如描述Splitter结构、类的信息等等),此外也可以实现可视化的设计机制,同时也可以实现内置的二次开发引擎的集成(例如Microsoft的VBA)。本人正在准备写一系列有关的文章来讨论相关的问题。
希望以上粗浅的描述会对您有一定的启发,如果您有兴趣进一步探讨,可以与我联系,我的email:sunhui@mail.apptemplate.com
一、如何使得你的程序支持任意多个CView的派生类;如果这个问题不解决,支持任意多个文档就毫无意义。如果你考虑用COM或.NET模型,你可以实现一类动态连接库,这类Dll中包含CView类的实现(可以包含任意多个CView对象),难度是你如何得到这些个CView对象,事实上,MFC库中有一个类CRuntimeClass,这个类是一个类信息的链表,在一个MFC程序中就是依靠这个类来创建类对象的,你的程序如果支持任意多个类,必须有一个途径在其他库中加载由您或其他开发者提供的CView类,可以考虑的是在程序中建立一个类字典(例如一个CMapStringToObj对象),这样您可以需要一个CView类时先从对应的字典中查询相对的类信息(CRuntimeClass),如果查询成功,用CRuntimeClass的成员函数CreateObject创建类对象,如果查询失败,就加载相应的动态连接库以填充类字典,关键是类字典的设计,如果设计得当,您的程序可以恰当的初始化相关的库以加载需要的CView类信息。
二、文档保存,这是个十分关键的问题,MFC中的文档序列化问题的关键是CRuntimeClass,可序列化的CObject形成一个list结构,您可以参考CRuntimeClass的实现,这个问题相对复杂,如果需要,本人可以写篇文章详细描述,可以肯定的是这个问题可以彻底解决,文档保存的另一个关键问题是文档结构信息的描述,本人采用的技术途径是结构化存储,即Microsoft的复合文档技术,可以参考COM技术资料以及MFC中COleDocument类的实现。
三、文档打开,由于异构文档结构存在很大的差别,文档打开的第一步是得到文档结构的描述,现在可行的办法是,你可以用XML描述你的文档结构,然后将XML描述保存在一个CString中,采用结构化存储技术,你可以在每个文档中建立一个子存储结构,打开文档时,首先打开保存文档结构的子存储以得到描述文档结构的XML描述,采用XML解析技术(COM机制参考MSXML模型,.NET可以参考相关的.NET技术文档),注意,每个类初始化(CView、CSplitterWnd以及其他的CWnd、CObject对象均可以在XML中精确的描述)信息在解析XML过程中进行。
四、文档设计,你必须实现一种可描述的文档结构,流行的做法是XML,利用XML,你可以实现可读性很好的文档结构描述(例如描述Splitter结构、类的信息等等),此外也可以实现可视化的设计机制,同时也可以实现内置的二次开发引擎的集成(例如Microsoft的VBA)。本人正在准备写一系列有关的文章来讨论相关的问题。
希望以上粗浅的描述会对您有一定的启发,如果您有兴趣进一步探讨,可以与我联系,我的email:sunhui@mail.apptemplate.com
#15
楼上的方法,和我前面的思路是差不多的,我认为这实际上和“模板”没有什么关系了,也不是单模板理的多文档类型,因为除一个文档类型以外,其他文档类型并没有添加到模板里去
当然,这个方法实际上是可以解决楼主的问题的,不一定非要在一个模板里添加多个文档类型,楼主可以和楼上多交流,我没有做过,呵呵,只能说思路
当然,这个方法实际上是可以解决楼主的问题的,不一定非要在一个模板里添加多个文档类型,楼主可以和楼上多交流,我没有做过,呵呵,只能说思路
#1
up
#2
帮你UP 一下
#3
帮楼主顶!关注!
#4
up
#5
关注
#6
up
#7
up
#8
up
#9
hehe,一个文档多个视图倒可以实现。多文档多视图又不用文档模板就不知道了。
#10
提供我认为可能的一种思路:
1、建立多个和各种文档类型对应的视图,一开始都隐藏;
2、拦截OnFileNew()函数,先让选择新建文件类型,然后显示对应的视图;
3、拦截OnFileSave()、OnFileSaveAs()函数,保存的是那个视图就调用哪个视图的OnSerialize()函数进行文档保存;
4、拦截OnFileOpen()函数,判断打开文档类型,然后显示对应的视图,也用该视图的OnSerialize()将数据读出。
这中思路的特点就是:人为的关联文档和视图,而不是靠系统自己操作,这样就能实现你的功能了
1、建立多个和各种文档类型对应的视图,一开始都隐藏;
2、拦截OnFileNew()函数,先让选择新建文件类型,然后显示对应的视图;
3、拦截OnFileSave()、OnFileSaveAs()函数,保存的是那个视图就调用哪个视图的OnSerialize()函数进行文档保存;
4、拦截OnFileOpen()函数,判断打开文档类型,然后显示对应的视图,也用该视图的OnSerialize()将数据读出。
这中思路的特点就是:人为的关联文档和视图,而不是靠系统自己操作,这样就能实现你的功能了
#11
可是如何实现在同一模板内实现不同的文档呢?比如在模板pTempLate内有一个文档1Doc,如何将2Doc加入该模板中,谢谢。
swimmingfish2004(something)说可以一文档多个视图,请问如何在一个文档内加入多个视,能给出代码吗?谢谢。我用AddView()老是出错。
swimmingfish2004(something)说可以一文档多个视图,请问如何在一个文档内加入多个视,能给出代码吗?谢谢。我用AddView()老是出错。
#12
up
#13
我估计swimmingfish2004(something)兄说的是“一框架多个视图”的意思
“一模板内实现不同的文档呢”实现的可能性不大,当然,也可能是我见识少了,呵呵
“一模板内实现不同的文档呢”实现的可能性不大,当然,也可能是我见识少了,呵呵
#14
“一模板内实现不同的文档”是可以实现的,早在2000年本人就实现了这个模型.事实上,也可以实现一个程序对应任意多个文档摸版,问题的关键是以下几个方面:
一、如何使得你的程序支持任意多个CView的派生类;如果这个问题不解决,支持任意多个文档就毫无意义。如果你考虑用COM或.NET模型,你可以实现一类动态连接库,这类Dll中包含CView类的实现(可以包含任意多个CView对象),难度是你如何得到这些个CView对象,事实上,MFC库中有一个类CRuntimeClass,这个类是一个类信息的链表,在一个MFC程序中就是依靠这个类来创建类对象的,你的程序如果支持任意多个类,必须有一个途径在其他库中加载由您或其他开发者提供的CView类,可以考虑的是在程序中建立一个类字典(例如一个CMapStringToObj对象),这样您可以需要一个CView类时先从对应的字典中查询相对的类信息(CRuntimeClass),如果查询成功,用CRuntimeClass的成员函数CreateObject创建类对象,如果查询失败,就加载相应的动态连接库以填充类字典,关键是类字典的设计,如果设计得当,您的程序可以恰当的初始化相关的库以加载需要的CView类信息。
二、文档保存,这是个十分关键的问题,MFC中的文档序列化问题的关键是CRuntimeClass,可序列化的CObject形成一个list结构,您可以参考CRuntimeClass的实现,这个问题相对复杂,如果需要,本人可以写篇文章详细描述,可以肯定的是这个问题可以彻底解决,文档保存的另一个关键问题是文档结构信息的描述,本人采用的技术途径是结构化存储,即Microsoft的复合文档技术,可以参考COM技术资料以及MFC中COleDocument类的实现。
三、文档打开,由于异构文档结构存在很大的差别,文档打开的第一步是得到文档结构的描述,现在可行的办法是,你可以用XML描述你的文档结构,然后将XML描述保存在一个CString中,采用结构化存储技术,你可以在每个文档中建立一个子存储结构,打开文档时,首先打开保存文档结构的子存储以得到描述文档结构的XML描述,采用XML解析技术(COM机制参考MSXML模型,.NET可以参考相关的.NET技术文档),注意,每个类初始化(CView、CSplitterWnd以及其他的CWnd、CObject对象均可以在XML中精确的描述)信息在解析XML过程中进行。
四、文档设计,你必须实现一种可描述的文档结构,流行的做法是XML,利用XML,你可以实现可读性很好的文档结构描述(例如描述Splitter结构、类的信息等等),此外也可以实现可视化的设计机制,同时也可以实现内置的二次开发引擎的集成(例如Microsoft的VBA)。本人正在准备写一系列有关的文章来讨论相关的问题。
希望以上粗浅的描述会对您有一定的启发,如果您有兴趣进一步探讨,可以与我联系,我的email:sunhui@mail.apptemplate.com
一、如何使得你的程序支持任意多个CView的派生类;如果这个问题不解决,支持任意多个文档就毫无意义。如果你考虑用COM或.NET模型,你可以实现一类动态连接库,这类Dll中包含CView类的实现(可以包含任意多个CView对象),难度是你如何得到这些个CView对象,事实上,MFC库中有一个类CRuntimeClass,这个类是一个类信息的链表,在一个MFC程序中就是依靠这个类来创建类对象的,你的程序如果支持任意多个类,必须有一个途径在其他库中加载由您或其他开发者提供的CView类,可以考虑的是在程序中建立一个类字典(例如一个CMapStringToObj对象),这样您可以需要一个CView类时先从对应的字典中查询相对的类信息(CRuntimeClass),如果查询成功,用CRuntimeClass的成员函数CreateObject创建类对象,如果查询失败,就加载相应的动态连接库以填充类字典,关键是类字典的设计,如果设计得当,您的程序可以恰当的初始化相关的库以加载需要的CView类信息。
二、文档保存,这是个十分关键的问题,MFC中的文档序列化问题的关键是CRuntimeClass,可序列化的CObject形成一个list结构,您可以参考CRuntimeClass的实现,这个问题相对复杂,如果需要,本人可以写篇文章详细描述,可以肯定的是这个问题可以彻底解决,文档保存的另一个关键问题是文档结构信息的描述,本人采用的技术途径是结构化存储,即Microsoft的复合文档技术,可以参考COM技术资料以及MFC中COleDocument类的实现。
三、文档打开,由于异构文档结构存在很大的差别,文档打开的第一步是得到文档结构的描述,现在可行的办法是,你可以用XML描述你的文档结构,然后将XML描述保存在一个CString中,采用结构化存储技术,你可以在每个文档中建立一个子存储结构,打开文档时,首先打开保存文档结构的子存储以得到描述文档结构的XML描述,采用XML解析技术(COM机制参考MSXML模型,.NET可以参考相关的.NET技术文档),注意,每个类初始化(CView、CSplitterWnd以及其他的CWnd、CObject对象均可以在XML中精确的描述)信息在解析XML过程中进行。
四、文档设计,你必须实现一种可描述的文档结构,流行的做法是XML,利用XML,你可以实现可读性很好的文档结构描述(例如描述Splitter结构、类的信息等等),此外也可以实现可视化的设计机制,同时也可以实现内置的二次开发引擎的集成(例如Microsoft的VBA)。本人正在准备写一系列有关的文章来讨论相关的问题。
希望以上粗浅的描述会对您有一定的启发,如果您有兴趣进一步探讨,可以与我联系,我的email:sunhui@mail.apptemplate.com
#15
楼上的方法,和我前面的思路是差不多的,我认为这实际上和“模板”没有什么关系了,也不是单模板理的多文档类型,因为除一个文档类型以外,其他文档类型并没有添加到模板里去
当然,这个方法实际上是可以解决楼主的问题的,不一定非要在一个模板里添加多个文档类型,楼主可以和楼上多交流,我没有做过,呵呵,只能说思路
当然,这个方法实际上是可以解决楼主的问题的,不一定非要在一个模板里添加多个文档类型,楼主可以和楼上多交流,我没有做过,呵呵,只能说思路