想要在SDI程序实现多视图 两行 第一行又分两列 第一行第一列的试图是CTreeView 第二列CListView 第二行也是CListView1.假如工程名字叫做Net建立之初有一个CNetView,我通过newclass分别添加了三个基类分别是CTreeView CListView CListView的新类 然后在mainfrm.cpp中添加OnCreateClient()进行静态分割 界面是出来我想要的效果了 但是这样的话工程里加上原来的CNetView总共就会出现四个视图 而CNetView我没用 对以后的程序有没有什么影响 各位前辈能不能教教我上面这个工程应该怎么做才不会出现我上面说的情况.
2.按照我上面说的方法 建好新的视图后 我在mainfrm.h中声明了三个视图指针分别指向新加的三个视图,例如新建的第一个视图是CListView1 基类是CListView 在CListView1中OninitialUpdate()中增加如下代码
void CTreeView1::OnInitialUpdate() 
{
CTreeView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
CMainFrame* pMain=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pMain->pListView=this;//pListView为指向该视图的指针
}在mainfrm.cpp中想对CListView1中的树控件进行操作 应该怎么操作 我的思路是先在CListView1定义一个CListCtrl m_list1用GetListCtrl()取得的控件为他赋值,在mainfrm.cpp中直接用pListView->m_list1操作? 还是应该直接在mainfrm.cpp中直接声明CListCtrl 然后再去取控件呢
3.在mainfrm.cpp中对视图中的控件进行操作后应该怎么显示出来呢 用pDoc->UpdateAllView(NULL)?
源程序代码有点多也不好发上来 
完全新手自己的分也不多 见谅! 麻烦高手指点一下 问题可能很乱,不知道有没有说明白
或者是有什么例子可以给我借鉴一下 我的e-mail:[email protected] 谢谢 不胜感激!

解决方案 »

  1.   

    对于第二个问题,没必要这么做GetPane方法你不会用吗?参考
      

  2.   

    1. 没有影响。
    2. 这三个指针不是必须的,在CMainFrame类中,可以通过拆分器的GetPane()方法取得CView的对象指针。至于对ListCtrl的操作,在CMainFrame类里、View类里做操作,都可以,不过按照MVC(Document/View)模式,个人觉得这个操作或者放在View类里,会更合适。CMainFrame类,只管理它所有的View,但不管理View内的其它东西。
    3. 显示不是问题,数据与显示是分离的,显示,只是对数据的一种表示形式。只要你通过pListView添加了数据,它就会显示,系统会自动为你刷新。
      

  3.   

    1. 虽然不会带来什么逻辑错误,但是还是有一定的影响,首先是文档模板里面指定的主View悬挂起来了,再就是如果你以后遍历所有View的时候它总是第一个View其实你应该把这个View用上,并且作为主View。其实最好是用上这个View,在OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)里面pContext有主View的指针。
    m_wndSplitter.CreateView(0, 1,pContext->m_pNewViewClass, CSize(0, cyText), pContext)
    pContext->m_pNewViewClass就是你的主View。2. 你可以保存这些View的指针,也可以GetNextView遍历所有的View,还有其它一些解决办法都可以。3. 可以在Doc类pDoc->UpdateAllView(FLASE),单独刷新一个View也可以Invalidate(FALSE);
      

  4.   

    建立工程时可以把你的SDI种的视图的基类指定为CListView或CTreeView