本人开发一个单文档应用,视类继承CView。窗口分割为左右两部分,分割窗口通过CSplitterWnd实现。左右视图均继承CFormView类。左视图为包含树控件的视图,右视图为包含一个或多个列表控件(List Control)的几种视图,具体显示哪个视图由左视图中树控件的选择而定。视图间的转换依照MSDN中Split32示例的方法。问题是:我将各个视图的列表表头进行初始化工作放在OnInitialUpdate中,运行程序,首先显示根节点视图,其列表内容为我初始化的内容。当点击其他子节点时,所有子节点视图的内容都没显示出来。再点击根节点,根节点视图中的列表内容也无法显示了。这是为什么呢?我查了一下MSDN,说OnInitialUpdate仅仅在初始化文档类时调用一次,这就可以解释为什么第一次打开程序,根节点视图的内容是可以显示的。我也实验过在OnUpdate中加列表内容,总是在第二次选择根节点视图时程序崩掉,追断点是由于在OnUpdate中,视图句柄为0。为什么获得不到视图句柄了呢?请高手指教。Split32示例中切换视图的方法:
BOOL CSplitter::ReplaceView(int row, int col,CRuntimeClass * pViewClass,SIZE size)
{
  CCreateContext context;
  BOOL bSetActive;
       
   
  if ((GetPane(row,col)->IsKindOf(pViewClass))==TRUE)
       return FALSE;
    
   
   // Get pointer to CDocument object so that it can be used in the creation 
   // process of the new view
   CDocument * pDoc= ((CView *)GetPane(row,col))->GetDocument();
   CView * pActiveView=GetParentFrame()->GetActiveView();
   if (pActiveView==NULL || pActiveView==GetPane(row,col))
      bSetActive=TRUE;
   else
      bSetActive=FALSE;    // set flag so that document will not be deleted when view is destroyed
pDoc->m_bAutoDelete=FALSE;    
    // Delete existing view 
   ((CView *) GetPane(row,col))->DestroyWindow();
    // set flag back to default 
    pDoc->m_bAutoDelete=TRUE;
 
    // Create new view                      
   
   context.m_pNewViewClass=pViewClass;
   context.m_pCurrentDoc=pDoc;
   context.m_pNewDocTemplate=NULL;
   context.m_pLastView=NULL;
   context.m_pCurrentFrame=NULL;
   
   CreateView(row,col,pViewClass,size, &context);
   
   CView * pNewView= (CView *)GetPane(row,col);
   
   if (bSetActive==TRUE)
      GetParentFrame()->SetActiveView(pNewView);
   
   RecalcLayout(); 
   GetPane(row,col)->SendMessage(WM_PAINT);
   
   return TRUE;
}