单文档程序,视图通过静态拆分,拆分稍微复杂了点,大致描述下是:先拆分一次得
到上下视图,假设为View上和View下。再把View上左右拆分了,为View左和View右。
其中View右会根据View左的树形视图里选择的不同,动态的切换不同的视图:View右1、
View右2、View右3等等。 正常使用时候都是没有问题的,现在碰到的问题是,如果
焦点在View下的时候,执行打开新文档这个操作,重新载入了新的文档后,View右1里
无论什么方式都获得不到doc指针了(AfxGetMainWnd正常,但是GetDocument,
GetActiveView,GetActiveDocument都返回NULL),但是通过View左是可以获得doc指针的,
如果再通过View左使得右侧视图切换到View右2再切换回View右1时,又正常了。 现象挺
奇怪的,好像是视图关联什么的丢失了,实在找不到头绪,请大侠们指教。

解决方案 »

  1.   

    doc指针被楼主搞成垃圾指针了
      

  2.   

    已经请cnzdgs(王老师)指点,尽请关注。
      

  3.   

    在出问题的视图类中设置一些断点调试,监视成员变量m_pDocument的变化,重点看一下OnInitialUpdate、OnUpdate、OnActivateFrame以及与切换视图有关的代码。
      

  4.   

    观察发现,重新打开新文档后,View右都会无法获得doc指针,而View左和View下都可以正常获得(OnInitUpdate函数调用时,本来doc指针就应该到位的)。此时,如果再次通过View左树节点的
    点击切换一下View右,则View右又正常了。按我的理解,如果CSplitterWnd的某个视图正常的通过DeleteView,CreateView来装载,都应该
    正确的和doc关联上,而重新创建时,好像View右没关联上。大侠帮忙看看,谢谢了~~
      

  5.   

    发现只有焦点在View下的时候,重新打开会出现本问题,在别的View的时候,都没有问题。
    暂时靠在OnFileOpen里主动设置ActivePane为其它的来规避本问题。
    但是具体产生的原因实在想不明白。
      

  6.   

    问题是你的view和你的doc关联了吗???
      

  7.   

    就是按照您的方法,观察的m_pDocument,一般各个视图在构造函数时候,m_pDocument都是空的,到了OnInitUpdate时候,都会有值。 但是我这个程序如果焦点在View下的时候,执行“打开新文档”操作后,View下和View左的m_pDocument值正常,View右不正常(OnInitUpdate时候还没有值)。    我现在只是靠在OnFileOpen的时候,主动设置分割视图的活动pane(SetActivePane)不为View下,来避免出现此问题。   而这种奇怪现象的原因是什么,暂时不知道,大侠看看  :)
      

  8.   

    正常情况下,分割视图类CreateView的时候,mfc代码会把所创建的视图和doc关联上的,这个不是人为主动设置的
      

  9.   

    View右1是什么时候创建的?在OnInitialUpdate上设置断点看一下每次执行到该函数时this指针是否相同。
      

  10.   

    发现是这样一个现象: 其实不需要打开新文档,我做了个试验,随便设个菜单项,在里面做
    m_cSplitterWnd.DeleteView(0, 1);
    m_cSplitterWnd.CreateView(0, 1, RUNTIME_CLASS(CMyView), CSize(100, 100), NULL);
    这段代码用来删除View右,再创建新的View右。
    当焦点不在View下的时候,新创建出来的View右(新创建的,this指针不同,但是没关系,一样能关联到doc指针上)都可以正常的关联到当前doc指针上;当焦点切换到View下的时候,执行这段代码所创建出来的View右,始终是无法获得doc指针的。我觉得是不是因为我的拆分是做了两次,第一次拆分产生View下和View上,第二次拆分把View上拆分成了View左和View右。
    代码在mainframe的OnCreateClient函数里:
    m_cEventView.CreateStatic (this, 2, 1)  拆分上下
    m_cConfigView.CreateStatic (&m_cEventView, 1, 2)  把第一次拆分的CSplitterWnd作为拆分对象拆分为左右。   是不是这里导致的问题
      

  11.   

    顺便再问下, 左  右   这样的视图,能通过m_cEventView.CreateStatic (this, 2, 1)  
                  下                       m_cConfigView.CreateStatic (&m_cEventView, 1, 2)  这样的呢:    上          这样的拆分该怎么写
                 左  右
      

  12.   

    m_cSplitterWnd.CreateView(0, 1, RUNTIME_CLASS(CMyView), CSize(100, 100), NULL);
    最后参数不要给NULL,可以自己构造一个CCreateContext结构。
    一般情况是不需要把视图删除重建的,不同的视图可以创建多个根据需要切换,同类视图也可以只用一个根据需要显示不同数据。
    15楼没看懂什么意思。
      

  13.   

    15楼排版没排好
    我的意思就是创建三分视图,一般可以先上下拆分:m_cSplitter1.CreateStatic (this, 2, 1) this
    代表mainframe指针, 再m_cSplitter2.CreateStatic (&m_cSplitter1, 1, 2) 把分割视图类m_cSplitter1作为被拆分对象传入,完成第二次拆分。 这样拆分得到的视图是上面一左一右两个,下面一个。可如果我想拆分得到上面一个大的,下面一左一右两个的话,拆分语句该怎么写呢?(就是想先上下拆分,再把下面的视图拆成左右两个)
      

  14.   

    与现在的做法一样,参数改成对应的窗格就可以了。
    m_wndSplitter1.CreateStatic(this, 2, 1);
    m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2, WS_CHILD | WS_VISIBLE, m_wndSplitter1.IdFromRowCol(1, 0));
    m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext);
    m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(100, 100), pContext);
    m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CTopView), CSize(100, 100), pContext);
      

  15.   

    拆分的这个问题知道了,谢谢~~
    上面那个问题还有点不太明白的地方,想问下这个CCreateContext该怎么构造。我试着
    CCreateContext pContext;  
    pContext.m_pCurrentDoc = GetActiveView()-> GetDocument(); 
    pContext.m_pCurrentFrame = this; //this为当前的MainFrame
    好像不行,会有问题。
      

  16.   

    m_pNewViewClass也要填,另外的记不清了,你先给NULL试试。