下面是我对SDI/MDI,,Single/MultiDocTemplate的一些理解和困惑,欢迎您发表自己的
看法,谢谢一。SDI一次只能打开一份document(与mutidoctemplate或者SingleDocTeplate无关)
    为了显示这份document,必须配备以下内容:
     A。 相应的view(可以是多个,比如所切分视图)
     B。 相应的边框,其实就是mainframe
     C.  相应的IDR(比如说标题等二。  MD1一次可以打开多个documents;
     A.  当这多个documents是不同类型时,每一类document必须配备相应的view
         和边框(CMidChildwnd),至于怎么配置?由相应的DocTemplate来决定
          啦!
     b。  当这多个documents是同一种类型时,只需配备一次即可。
     c。  程序中只有一份document,但是执行了window-》new window时,可以
          打开第二个view,并且这个view也有一个边框midchlldwnd。三。 SingleDocTeplate
      只支持一种“类型”document,为该document指定view和边框以及IDR
四。  MultiDocTemplate
      可以支持多种“类型”documents,,并且为这'所有的多种类型'的doucument
      指定'一套'相应的view,边框和IDR
           好,这就是我的理解(欢迎您指出不对的地方),下面是我的疑惑:
       我有两种类型的document,分别为mydoc1,mydoc2,我要指定它们的view和
       边框为:viewAll,FrameAll,IDR
             
            照理说,应该只需要一个multidoctemplate就可以了吧!!(也许真的
      可以,因为MultiDocTemplate中就有一个CPtrList  m_docList,请您告知小弟
      具体办法)但是,几乎所有的书上都是采用的如下办法:
     
            
           CMultiDocTemplate *pDocTemplate;
           pDocTemplate=new CMultiDocTeplate(IDR,
                                             CRunTimeClass(mydoc1),
                                             CRunTimeClass(frameALL)
                                             CRunTimeClass(ViewAll)
                                             );
          addDocTemplate(pDocTemplate)
                   pDocTemplate=new CMultiDocTeplate(IDR,
                                             CRunTimeClass(mydoc2),
                                             CRunTimeClass(frameALL)
                                             CRunTimeClass(ViewAll)
                                             );
         addDocTemplate(pDocTemplate)
       
        我想问,既然multidocment这么麻烦,
        为什么不用singledoctemplate呢?(说实话,我不知道能不能用??)
        multidoctemplate的优越性在哪呢????????

解决方案 »

  1.   

    你看看最常用的WORD用的是什么文档就能得出答案
      

  2.   

    to zhenxizhou(天上人间  朋友:
         请您告知其中奥妙!
         拜谢!!
      

  3.   

    MFC深入浅出中有详细的讲解。
      

  4.   

    我就是看了mfc深入前出  才提这个问题的,我以前没有发觉这个问题,我觉得侯sir也没有讲得很透彻!!
      

  5.   

    SDI:一次只能打开一个文档,可以有多个视,但是这些视都是对同一文档的不同表现(representation),比如说,对一个数据你可以用曲线图,直条图,饼图等显示在不同的视中显示。虽然是每次只能打开一个文档,但是文档的类型可以不同,需要用不同的视显示,文档的类型由mutidoctemplate和SingleDocTeplate决定。
    MDI:一次可以打开多个文档。
    我觉得上面的代码没有问题,也是必要的。SingleDocTeplate是不能处理多文档类型的问题的。用new CMultiDocTeplate()是必要的,这样就觉得想这个程序可以支撑什么类型的文档一样的。
      

  6.   

    to houdy() 朋友:
    那我想问您,CMultiDocTeplate的multi体现在哪些方面呢??我还想问您,“SingleDocTeplate是不能处理多文档类型的问题”,真的吗??
    如果我也像上面那样,
         CSingleDocTemplate *pDocTemplate;
               pDocTemplate=new CSinlgeDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
              addDocTemplate(pDocTemplate)
                       pDocTemplate=new CSingleDocTeplate(IDR,
                                                 CRunTimeClass(mydoc2),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
             addDocTemplate(pDocTemplate)     注意:直接这样添加也许会遇到很多erro或者warning,我这儿只是提供一种思想,或者
    说理解.
      

  7.   

    CMultiDocTemplate *pDocTemplate;
               pDocTemplate=new CMultiDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frame1)
                                                 CRunTimeClass(View1)
                                                 );
              addDocTemplate(pDocTemplate)
                       pDocTemplate=new CMultiDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frame2)
                                                 CRunTimeClass(View2)
                                                 );
             addDocTemplate(pDocTemplate);//如果不加这句,就不会弹出模板让你选择用那个文档。
    多文档中,因为有ChildFrame,即使你只用一个文档。但是你可以用多个Template,这样,你显示的时候,可以用不同的 frame,frame中有不同的view,每个frame可以有自己的menu,toolbar,statusbar ,有多种的显示方式。在单文档中,只有一个MainFrame.虽然可以达到多个view,但是只有一个frame.这是我的理解,不知道对不对。
      

  8.   

    thanks for your hard work.
     first
      

  9.   

    如果你有多个doc,那就更要用多文档了。
      

  10.   

    to 52001314(谁说程序员不用休息的?) : 
         您说“如果你有多个doc,那就更要用多文档了”,我不知道您的多文档是指的mdi(与sdi
    相对),还是MultiDocTeplate(与SinlgeDocTeplate相对)???    不管是前者,还是后者,我都认为不对!!(为什么呢?我的发言内容有说明,不过,
    我怀疑里面有错误的成分,所以贴出来,让大家矫正)      谢谢!!!! 
      

  11.   

    下面我把我的观点更新一下:
         
          我个人的理解(一):
          程序是否支持多种“不同类型”的文档,与sdi和mdi无关,与
    singledoctemplate和multidoctemplate有关!!下面我还是用侯sir的原话来证明:      我想把侯sir的深入浅出mfc 中的一段 写出来:
          第253页:mdi程序也可以用csingledoctemplate,sdi可以使用cmultidoctemplate
    (我同意侯sir的这种观点,不过我不知道,该怎么实现这两个“可以”,如果你知道,请告知,
    我觉得,当您把一种好的想法拿出来与人分享时,您会加深对它的理解!!!!)      还是第253页   :csigledoctemlate一次只能打开一种文档类型,mdidoctemplate
    可以同时支持多种文档类型
             为什么mdidoctemaplate的功能比singledoctemplate“强大”呢??
    侯sir也给出了解释:
           第347页 :  如果你使用csingledoctemplate,它有一个成员变量 
    cdocument m_pDocument,而cmultidocuplate 有一个成员变量:
    CPtrlist m_pdoclist,它表示能同时打开多个docments。
         所以,我认为,既然所有的事情,都被csingledocplate和cmultidocplate干了,
    那么sdi和mdi,还有什么意义呢??
        可惜,侯sir似乎也没有很好的说明这个问题!
        我个人的理解(二):既然“CMultiDocTemplate中就有一个CPtrList  m_docList”
    那么,CMultiDocTemplate *pDocTemplate;
               pDocTemplate=new CMultiDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
              addDocTemplate(pDocTemplate)
                       pDocTemplate=new CMultiDocTeplate(IDR,
                                                 CRunTimeClass(mydoc2),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
             addDocTemplate(pDocTemplate)
    是不是有点麻烦呢??为什么不仅仅构造一个CMultiDocTeplate对象,然后把mydoc1和mydoc2
    分别加到CPtrList  m_docList中去呢??(我不知道该怎么操作,但是理论上应该可以的,
    毕竟我的两个doc用的view和fuame以及idr都相同)      我个人的理解(三):不管是CMultiDocTeplate还是CSinlgeDocTeplate,程序中都有一个
    文档模板列表,既然如此
         CSingleDocTemplate *pDocTemplate;
               pDocTemplate=new CSinlgeDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
              addDocTemplate(pDocTemplate)
                       pDocTemplate=new CSingleDocTeplate(IDR,
                                                 CRunTimeClass(mydoc2),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
             addDocTemplate(pDocTemplate)
           在理论上又可以做到了,虽然“操作的时候会有很多的erros和warnings等着您去解决”       
          
      

  12.   

    在MSDN中对CMultiDocTemplate class有这么段话.
    An MDI application can support more than one type of document, and documents of different types can be open at the same time.
    对CSingleDocTemplate Class,
    An SDI application typically supports one type of document, so it has only one CSingleDocTemplate object. Only one document can be open at a time.
    当你在向导中选择了建立的项目是SDI或者MDI的时候,向导自动在程序的App的InitInstance中加入pDocTemplate = new CSingleDocTemplate,或pDocTemplate = new CMultiDocTemplate.(侯sir认为,“SDI就是在项目中使用了CSingleDocTemplate,而MDI就是在项目中使用了CMultiDocTemplate ”这样的说法是不精确的。但是他也没有明确说明)。所以,我对SDI,MDI的定义也不是很清楚。
    如果一个SDI程序,我加入了pDocTemplate = new CMultiDocTemplate,那他是算SDI还是MDI?如果要在一个SDI程序中实现多个文档,必然要用
    pDocTemplate=new CSingleDocTeplate(IDR,
                                                 CRunTimeClass(mydoc2),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
             addDocTemplate(pDocTemplate)或 CMultiDocTemplate *pDocTemplate;
               pDocTemplate=new CMultiDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
              addDocTemplate(pDocTemplate)
    如果有多个template,那么,这个SDI这时候算是SDI还是MDI?因为对SDI和MDI的定义不明确,所有下面我只讨论csingledoctemplate和cmultidocuplate .欢迎大家给出SDI和MDI的定义.
      

  13.   

    csingledoctemplate,它有一个成员变量 
    cdocument m_pDocument,而cmultidocuplate 有一个成员变量:
    CPtrlist m_pdoclist,它表示能同时打开多个docments。
    为什么cmultidocuplate 能打开多个document呢?因为CPtrlist 是一个指针链表,对于CMultiDocTemplate 的一个实例,它可以执行多次OpenDucument,把多个CDocument的指针存入链表中(这多个CDocument*都是同一种类型的。因为如果是不同类型的话,取出来的时候不知道它应该转化为那种文档)。
    而csingledoctemplate,它有一个成员变量 
    cdocument m_pDocument,打开文档后的指针就存在这里。所以一次只能打开一个文档。如果要打开多个,必须再new CSingleDocTeplate(IDR,
                                                 CRunTimeClass(mydoc2),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );所有,csingledoctemplate和cmultidocuplate 最大的区别就是,对于一种类型的文档,一个CsingleDocTemplate的实例只能同时打开一个,而一个cmultidocuplate 的实例可以同时打开多个。
      

  14.   

    对 fishsward观点我的理解
    (一)程序是否支持多种“不同类型”的文档,与sdi和mdi无关,与
    singledoctemplate和multidoctemplate也无关。因为侯sir说:CWinApp有CDocManger* m_pDocManager;
    CDocManger中有CPtrList m_templateList;用来维护一系列的document Template
    如果一个程序支持两【种】文件形态,应该有两份Document templates,在App的InitInstance中以AddDocumentTemplate加入CDocManager所维护的链表中。(《深入浅出MFC》的第342页)(mdidoctemplate可以同时支持多种文档类型)--我没有找到这句话在哪里。我的理解是,一个template只支持一种doc,因为一个template只对应一个mydoc,但是mdidoctemplate可以同时打开同一类型的多个.
    pDocTemplate=new CMultiDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
    理论上,CPtrlist 是一个指针链表,可以存放多种类型的指针。
    但是,如果template的函数没有支持存入什么类型的指针。而且你要自己写对链表中读指针,并根据什么类进行类型转换后才能使用这个指针。
    virtual CDocument* OpenDocumentFile( 
    LPCTSTR lpszPathName, 
    BOOL bMakeVisible = TRUE ) = 0; 我觉得,cmultidocuplate 可能把指针链表中的指针读出的时候都转换成mydoc1了。
      

  15.   

    to  52001314(谁说程序员不用休息的?):
          首先,还是要谢谢您的回答,谢谢所有参与过这个帖子的朋友。      然后,我想就两个问题说明我的观点:      1。 我们对“多文档”的定义不同(或者说理解不同)。依照某些人看,“多文档”是可以
    “同时”支持多个“文档”,这些文档可能是同一种类型,也可能是不同类型,甚至还有可能只是
    “同一个文档”的多个显示(比如说执行了window-》new window时)。而另外一些朋友的理解是:程序能够打开多种文档,即为“多文档”,也就是说,有可能打开另外一“种”文档之前,
    必须关闭当前文档!!
         如果依照前者的理解,的确,只有cmultidoctemplate才能实现多文档,
         而  CSingleDocTemplate *pDocTemplate;
               pDocTemplate=new CSinlgeDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
              addDocTemplate(pDocTemplate)
                       pDocTemplate=new CSingleDocTeplate(IDR,
                                                 CRunTimeClass(mydoc2),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
             addDocTemplate(pDocTemplate)
    依旧还是单文档,因为它不能同时打开mydoc1和mydoc2
    从这方面来说,其实他们的理解是没有分歧的!!!     
           2。我想说明一下Multidoctemplate的“multi”的作用:
    我觉得,“multi”并不是说仅仅靠一个“CMultiDocTeplate对象,然后把mydoc1和mydoc2
    分别加到CPtrList  m_docList中去”,就可以实现打开多种类型的文档!!!!
    “Multi”仅仅是说能够“同时”打开多个文档,一个"CMultiDocTeplate对象"只能打开一种
    类型的文档.您希望您的程序支持多少种类型的文档,您就必须构造多少个"CMultiDocTeplate对象".
        CMultiDocTeplate对象的成员变量CPtrList  m_docList只是指向该"CMultiDocTeplate对象"能支持的文档”,并且他们是“同一种”类型的(也就是说
    当您仅仅定义了:pDocTemplate=new CMultiDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
              addDocTemplate(pDocTemplate)
    时,您的程序其实仅仅支持一“种”文档————mydoc1类型的文档,只不过可以同时打开很多“个”“这种类型”的文档!!!     而用"CSingleDocTeplate"的弱点在哪里呢???其实CSingleDocTeplate程序也能
    打开多种类型的文档,您定义了多少个CSingleDocTeplate对象,您的程序就能支持多少种
    文档,只不过,它们不能同时打开罢了    不知您对此还有何看法??
        愿问您的高见
      

  16.   

    早晨没贴完,因为不能连续贴3篇以上帖子。(二)为什么不仅仅构造一个CMultiDocTeplate对象,然后把mydoc1和mydoc2
    分别加到CPtrList  m_docList中去呢?CPtrList  是指针链表,存的相当于存地址。
    这个,上面说了,首先,你要怎么加进去呢?用什么函数加?而且怎么读出指针,并判断类型并转换它?而且,如果CPtrList  m_docList是保护成员变量,你不能直接访问,怎么办?多个template,不仅支持多个doc,同样childframe,view;也支持一个doc,多种childframe,view;也支持多doc,childframe,view。(三)CSingleDocTemplate *pDocTemplate;
               pDocTemplate=new CSinlgeDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
              addDocTemplate(pDocTemplate)
                       pDocTemplate=new CSingleDocTeplate(IDR,
                                                 CRunTimeClass(mydoc2),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
             addDocTemplate(pDocTemplate)这里的frameAll是MainFrame,还是ChildFrame?
    如果是MainFrame,怎么从一个MainFrame切换成另一个MainFrame?如果是childframe,还要在Mainframe中加入(CMDIFrameWnd::OnCreate(lpCreateStruct) 等操作....
      

  17.   

    同意你中午的观点:)我表达的也是这个意思。多个doc必须用到多个template。CSingleDocTeplate程序也能
    打开多种类型的文档,您定义了多少个CSingleDocTeplate对象,您的程序就能支持多少种
    文档,只不过,它们不能同时打开罢了--每个CSingleDocTeplate只能同时打开一个doc.
    但如果你定义了多个CSingleDocTeplate,它们各自打开自己的一个doc,在理论上应该是成立的吧?只是显示的方面要另外考虑了。
      

  18.   

    CSingleDocTemplate *pDocTemplate;
               pDocTemplate1=new CSinlgeDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
              addDocTemplate(pDocTemplate1)
                       pDocTemplate2=new CSingleDocTeplate(IDR,
                                                 CRunTimeClass(mydoc2),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
             addDocTemplate(pDocTemplate2)如果用pDocTemplate1打开mydoc1,pDocTemplate2打开mydoc2应该是可以同时打开的吧?
    不过,这样的话,两个template,还算SDI程序吗?
      

  19.   

    单文档、多文档首先是从我们现实使用中而来的,我们同一个程序需要处理多个文档时,其框架结构就会有所变化。
    目前单文档结构一般只允许你对一个文档进行操作,我们也可以同时对两个相同类型的文档进行操作,如果用户需要这样的操作,它可以启动两个进程。所以我们在设计程序时可以只关注对同一中文档而且只有一个文档的情况进行设计。
    而多文档可以处理多种类型的文档,每一种文档也可以打开多个,这是因为既然我已经需要处理多个框架了,我就可以较为轻松的实现对同一类型文档的多个不同文档进行编辑,而不需要多个进程。
    因此,MFC的设计者根据以上的情况设计了两种不同类型的文档模版来处理这种问题,当然你完全可以自己处理一下CSingleDocmentTpl,使得其支持多个文档(同一类型)甚至你完全可以处理多个不同类型的文档。但你最终会那样的话,你的程序结构会比现在好吗?应用效果呢
      

  20.   

    to 52001314(谁说程序员不用休息的?) :
          讨论到这个时候,我们的观点基本上达成一致了,您的参与给了我很大的
    帮助,谢谢!!不过,还是存在一下分歧:
         1。CSingleDocTemplate *pDocTemplate;
               pDocTemplate1=new CSinlgeDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
              addDocTemplate(pDocTemplate1)
                       pDocTemplate2=new CSingleDocTeplate(IDR,
                                                 CRunTimeClass(mydoc2),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
             addDocTemplate(pDocTemplate2)
    您对此的看法是《如果用pDocTemplate1打开mydoc1,pDocTemplate2打开mydoc2应
    该是可以同时打开的吧?》,,,而我则认为:《它不能同时打开mydoc1和mydoc2》
    为什么呢??因为程序要同时打开多个文档,必须依靠CMultiDocTeplate对象的成员
    变量CPtrList  m_docList。不管您有多少个CSingleDocTeplate,仅仅是表示您的程
    序能够支持多个文档,您在打开另一个文档之前,必须关闭当前文档。
         除非您用CMultiDocTeplate,您永远不能同时打开多个文档!!(注意,我这里反复
    强调《同时》)    2。CSingleDocTemplate *pDocTemplate;
               pDocTemplate=new CSinlgeDocTeplate(IDR,
                                                 CRunTimeClass(mydoc1),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
              addDocTemplate(pDocTemplate)
                       pDocTemplate=new CSingleDocTeplate(IDR,
                                                 CRunTimeClass(mydoc2),
                                                 CRunTimeClass(frameALL)
                                                 CRunTimeClass(ViewAll)
                                                 );
             addDocTemplate(pDocTemplate)
    frameAll肯定指的是MainFrame,因为CSinlgeDocTeplate程序没有ChildFrame,
    至于切换的方法,我现在也在摸索。程序中的有一个模板列表,说不定就可以实现
    多个模板的切换,切换模板的同时,也就切换了MainFrame(遗憾的是,这也许只是
    一种理想,理论上可行的理想,操作起来erro和warning肯定不少,各种书上只是
    有使用多个CMultiDocTeplate,还未见过使用多个CSingleDocTeplate,或者
    把CSingleDocTeplate和CMultiDocTeplate混用的例子,如果您看过,望告知
    小弟和所有参与过这个帖子的朋友)
    to   luogucai(萝卜) 朋友:
       《目前单文档结构一般只允许你对一个文档进行操作,我们也可以同时对两个相同类型的文档进行操作,如果用户需要这样的操作,它可以启动两个进程。所以我们在设计程序时可以只关注对同一中文档而且只有一个文档的情况进行设计》
        这是您的原话,我不知道您说的《单文档》,是指的《CSingleDocTeplate》,还是
    指的《在wizard中选择sdi选项》,如果是前者,我个人认为不可能(原因见上),如果是后者
    ,似乎难度也不小,特别是您要同时显示两套《frame和view》。
        最后,也感谢您的参与!!
      

  21.   

    为什么于一种类型的文档,一个CsingleDocTemplate的实例只能同时打开一个?因为csingledoctemplate,它有一个成员变量 
    cdocument m_pDocument。据我估计,template打开文档后指针就存放在这里。
    不能同时打开两个是因为一个m_pDocument不能同时保存两个doc指针。如果我有两个template,template1->m_pDocument1=doc1;
    template2->m_pDocument2=doc2;为什么不行啊?其实相当于CDocument* m_pDoc1,m_pDoc2;
    m_pDoc1 = doc1;
    m_pDoc2 = doc2;
    这样为什么不行?
      

  22.   

    to    52001314(谁说程序员不用休息的?) :
    那您试过没有呢?据我估计,当您用CsingleDocTemplate打开一个document后,当您继续试图去
    打开另外一个document时(我知道您会说《两个CsingleDocTemplate》),但是,
    框架会关闭您的前一个template中的docment,除非您派生一个CsingleDocTemplate类,
    然后改写它!!但是估计这很难,,至少我是没有这个实力^_^
    如果您有,请告知!拜谢!
      

  23.   

    我们一直讨论的都是理论的东西。
    不过,如果是CsingleDocTemplate,好像没办法同时打开两个template。如果FRAME使用MainFrame的话。
    pDocTemplate1 = new CSingleDocTemplate(
    IDR_TESTSDTYPE,
    RUNTIME_CLASS(CDoc1),
    RUNTIME_CLASS(CMainFrame), 
    RUNTIME_CLASS(CTestSDIView));
    pDocTemplate2 = new CSingleDocTemplate(
    IDR_TESTSDTYPE,
    RUNTIME_CLASS(CDoc2),
    RUNTIME_CLASS(CMainFrame),
    RUNTIME_CLASS(CTestSDIView));如果同时打开,明显是不行的。同时不可能有两个MainFrame存在吧?
    在pTemplate->OpenDocumentFile(NULL);的时候。
    CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();返回空,第二个文档的MainFrame创建失败.而在CDocument* CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,
    BOOL bMakeVisible)这个函数中,
    if (pFrame == NULL)
    {
    AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);//提示建立空文档失败。
    delete pDocument;       // explicit delete on error
    return NULL;
    }但是前面的pDocument = CreateNewDocument();是成功的。说明出错是因为没办法创建出新的MainFrame,而不是没办法创建新文档。
      

  24.   

    如果使用CChildFrame来作为frame.CDocTemplate::CreateNewFrame
    中有一句
    // create new from resource
    if (!pFrame->LoadFrame(m_nIDResource,
    WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,   // default frame styles
    NULL, &context))CMDIChildWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle,而在
    CWnd* pParentWnd, CCreateContext* pContext)函数中有一句.
    ASSERT_KINDOF(CMultiDocTemplate, pTemplate);//因为我们的pTemplate是CSingleTemplate,到这里程序就执行不下去了。所以,CChildFrame的基类CMDIChildWnd是必须和CMultiTemplate配套使用的。而要进行多文档同时打开显示,必然要用到CChildFrame.所以,必须用CMultiTemplate.我上次说的如果我有两个template,template1->m_pDocument1=doc1;
    template2->m_pDocument2=doc2;只考虑了打开,没有考虑显示情况。是完全理论化的。
    doc,frame,view是要一起使用的。所以,理论上可以同时打开。但是无法实现:)