应该是视最后建好,视建好后会执行CView::OnInitialUpdate,你可以重载

解决方案 »

  1.   

    我也知道CView的OnInitUpdate里是可以获得文档的.
    但是,问题是我现在的程序是TabView,也就是说每个Tab下是一个View,要是在这里面调用文档里的一个函数,那不就调了多次了么?
    所以,我就不想要在View类里操作的.
    CView的OnInitUpdate执行以后,是Document或框架的哪一个函数被调用呢?要是有的话,我就可以了.
      

  2.   

    在回答你的问题之前,我给你大致讲一下,DOC/VIEW的关于新建文档的消息处理路径!!!
    CWinApp -> CMDIFrameWnd(主窗口) -> CMDIChildWnd(子窗口) -> CView -> CDocument;
    其中CView -> CDocument 是由隐含的文档模版类处理的,它才是Doc/view结构的核心!CDocument不是一个窗口(不继承于CWnd,然而MFC的机制又允许其处理消息)!!!还有一点CView是CMDIChildWnd的一一对应的子窗口!!!然后我们步入正题,有两种情况:
    1、当没有任何子窗口时,
    点新增,那么由CWinApp::OnFileNew接受消息,注意此时,子窗口、视和文档(当然不知道用什么文档摸版)都没有建立,如果此时你要自己处理(重载改函数)的话,必须先用CWinApp的GetFirstDocTemplatePosition和GetNextDocTemplate得到文档摸版CDocTemplate,然后用它的CreateNewFrame创建CMDIChildWnd(同时得到CDocment),然后调用CMDIChildWnd的CreateView来创建CView,最后用CDocument的AddView一切OK!!!!2、如果已经有了子窗口,那么表示文档摸版已经确定!!!
    你可以直接用CDocment的消息响应函数OnFileNew,此时由于已经有确定的文档摸版(就是当前视对应的文档摸版),所以CWinApp就不再直接响应了(即Cwinapp::OnFileOpen无效);
    呵呵!!!我已经好就没有动mfc了,所以不能够给你讲到每个细节,在msdn的TN022(Technical Note 22 )中讲的很详细,你可以回味一下!!!有时间看看侯俊杰的<深入浅出mfc>,可能对你理顺大部分MFC的结构层次大有帮助!!!最后说点离题的话,多练练直接用各种API编程,局限在MFC中是没有出路的!!!
    我的邮箱是:[email protected],有空可以相互交流互相学习!!!
      

  3.   

    唉,好象<深入浅出mfc>是我在大陆第一个叫大家来下的。
    你说的只是MFC最基本的东西啊。对我没有任何help。
    仔细看看我说的东西,是要在非View类里知道哪里是这种三位一体(jjhou就喜欢这样说,呵呵)创建的终结点。
    顺便纠正你几个观点:
    CView是CMDIChildWnd的一一对应的子窗口,不是的,在CMDIChildFrame里没有View的列表,只是存了一个View指针,叫做Active view,要是加上SplitterWnd,View就在逻辑上挂在CMDIChildFrame下,实际上在Splitter下。还有,Splitter也可以挂在任何一个窗口下(要重载很多的函数)。
    由隐含的文档模版类处理的,不是隐含的。CDocManager才是隐含的。
    SDK是学习的第一步,不是编程的好工具。SDK非常容易学,但不好编程,MFC就是为了好编程做出来的。SDK是在有的时候绕过FrameWork有用的一种方案.
    唉.我现在就准备这样做.
    我准备在CDocument里加一个static变量用来记录创建的次数,然后Create出那个CDocument的成员变量,用这个static变量去标记它.
    在CDocument的OnNewDocument和Serialize里去枚举所有窗口,通过那个标志去匹配,再发消息.
      

  4.   

    呵呵,我真是个白痴.
    其实这个问题非常简单.
    做好整个结构是在CView的OnInitUpdate().
    但是这个时候还是无法用比如:GetActiveDocument这样的函数的.因为主框架还没设定好活动子框架.所以,当然就是在子框架的WM_MDIACTIVATE消息相应函数才是MFC结构完全建好的时机了.