http://blog.sina.com.cn/s/blog_601ceb5a0100dt5m.html 类的构造函数是私有的原因可以看下这里
你那两个方式其实就是一个方法,还有的另外一种获得视图的方法是用遍历视图的方法
//遍历所有的视图
POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView* pView=GetNextView(pos);   
if( pView->IsKindOf(RUNTIME_CLASS(testView)))//这里的testView就是要做操作的视图的名字
{
CVehicleInpectionStickersDetectionDemoView *myView = (CVehicleInpectionStickersDetectionDemoView*)pView;
       myView->OnUpdate();//执行一个该视图中的函数,函数的内容就是修改视图中控件的一些内容来判断是否获得视图指针成功
}

解决方案 »

  1.   

    CMainFrame、CView、CxDoc这个类的构造函数都是私有的;这样就是不能定义这样的变量CxxxVIew variable;
    如果使用的构造函数都是私有的,那么这个类是无法使用的,一般私有的构造函数通过public的调用单文档程序的分割窗体,下图中获得左边视图对象的两种方法哪种更好,还是有更好的办法?
    两种方法差别不大,方法2更简洁
      

  2.   

    CMainFrame、CView、CxDoc这个类的构造函数都是私有的
    -------------------------------------------------------------------------------------
    你确定?CMainFrame的构造函数是public的,而CView、CxDoc的构造函数是protected的!
    CView、CxDoc的构造函数弄成protected是为了保证view和doc对象仅从序列化创建,即由框架创建,说白了就是DYNCREATE动态创建
      

  3.   


    向导生成构造函数就是protected的,为什么要定义成protected的,其他的类都没有定义成这样;我想在CMainFrame类中定义个CxxxView类的变量,这样就不用到方法一和方法二;但是该类的构造函数是protected:的
      

  4.   

    在CMainFrame类中定义个CxxxView类的变量做什么?CMainFrame类中,你也没有办法确保View对象是存在的(用户可能会关闭窗口)
      

  5.   

    CMainFrame的也是在protected,然后就在构造函数的声明下面又动态创建使用了DECLARE_DYNCREATE(CMainFrame_1);我用的VS2010; 但是它们的析构函数都是public的;为什么要序列化创建(这个问题好像说起来有点复杂);
      

  6.   

    单文档程序中分割成2个窗口,那就是2个view了吗?用你这样也可以遍历的吗?那一共有3个view了,原先向导的一个view,然后我用CTreeView和CListView用CSplitterWnd::CreateView(RUNTIME_CLASS(CMyTreeView)和 RUNTIME_CLASS(CMyListView))在OnCreateClient调用创建了两个,一共是3个吗?如果是三个的话,最后面的那个大的就被前面创建的两个给遮住了,用不到,怎么把后面的那注销掉,这样对程序的性能也好点,可以这么想吗?
      

  7.   

    为什么要序列化创建
    ---------------------------------------
    这个主要是为了保证框架的一致性,不允许用户手动去创建文档/视图对象,而是通过框架本身的文档视图管理类去创建,比如CDocManager::OnFileNew,或者CDocManager::OpenDocumentFile等,如此做也是为了便于文档视图对象的管理,当销毁doc的时候一定会去销毁view。倘若你自己去管理文档视图对象,你能够保证上述的完整性吗?
      

  8.   

    CHMI_manView* CMainFrame::GetRightPane()
    {
    CWnd* pWnd = m_wndSplitter.GetPane(0, 1);
    CHMI_manView* pView = DYNAMIC_DOWNCAST(CHMI_manView, pWnd);
    return pView;
    }
    ////
    CLeftView* CMainFrame::GetLeftPane()
    {
    CWnd* pWnd = m_wndSplitter.GetPane(0, 0);
    CLeftView* pView = DYNAMIC_DOWNCAST(CLeftView,pWnd);
    return pView;
    }