因为我要实现二个子窗口里的鼠标操作不同,所以需要创建不同有view来管理,我现在想在原来的基础上再增加一个view类,但是碰到了问题:
原系统是MDI,有一个CScrollView,现在想再建一个继承自CView的类,但是这个类希望能调用原来的那个XXXDoc中的函数,也就是需要使用原来的文档类,只是调用另外一个视图类,别的都跟原来的一样,这样的话如何创建这个子窗口?

解决方案 »

  1.   

    试试:
    CXXXDoc* CYourView::GetDocument() 
    {
       CTheScrollView *pview;
       CMainFrame *pMainFrame;
       pMainFrame = (CMainFrame *)AfxGetApp()->GetMainWnd();
       pview = STATIC_DOWNCAST(CTheScrollView, pMainFrame->GetActiveView());
       ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CXXXDoc)));
       
       return (CXXXDoc*)m_pDocument;
    }
      

  2.   

    楼主的意思是一个文档,多种视图。
    楼主应该添加一个文档模板,比如
    CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(
    IDR_FISHTYPE,
    RUNTIME_CLASS(CFishDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CFishView));
    AddDocTemplate(pDocTemplate);这样就将文档-框架-视图联系起来,
    建议楼主参阅《深入浅出MFC》侯××著。
      

  3.   

    用楼上的办法可以把视图类替换掉,换句话说,以后所有新建的view都是楼主的那个自定义的view不知道楼主是不是要有控制的新建view就是说,一会是新建旧的,系统的view,一会是新建自定义的那个view
    不知道楼主是这个意思,还是只要以后新建的都是那个自定义的,呵呵
      

  4.   

    void CMainFrame::OnNewView() 
    {
    // TODO: Add your command handler code here
    CView* pOldVIew = GetActiveFrame()->GetActiveView();
    if (pOldVIew->IsKindOf(RUNTIME_CLASS(CView)))
    {
    //更新数据
    pOldVIew->OnInitialUpdate();
    }
    else
    {
    pOldVIew->ShowWindow(SW_HIDE);
    if (m_pNewView == NULL)
    {
    CCreateContext context;
    context.m_pNewViewClass = RUNTIME_CLASS(CView);
    context.m_pCurrentDoc = GetActiveFrame()->GetActiveDocument();
    CView* pNewView= STATIC_DOWNCAST(CView, CreateView(&context));
    m_pNewView = (CNewView* )pNewView;
    }
    if (m_pNewView != NULL)
    {
    m_pNewView->GetParentFrame()->ShowWindow(SW_SHOW);          } }
    }
      

  5.   

    从CVIEW继承的窗口只能打开一个,但是跟原先的那个不一样,原先的那个采用原始的文件->新建,而这个是用另个一个菜单项来控制的
      

  6.   

    to handsomerun:
    我的意思是:一会是新建旧的,系统的view,一会是新建自定义的那个view
      

  7.   

    to icegirl914:
    你看我的回复,你新建一个c××view类后,如果和原来的文档绑定,就必须要AddDocTemplate(pDocTemplate);你在app的那个InitInstance()函数中添加。
    注意相关参数。
      

  8.   

    这个我已经添加了: CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(
    IDR_DRAWTYPE,
    RUNTIME_CLASS(CDRAWDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CDRAWView));
    AddDocTemplate(pDocTemplate); CMultiDocTemplate* pViewDocTemplate;
    pViewDocTemplate = new CMultiDocTemplate(
    IDR_DRAWTYPE,
    RUNTIME_CLASS(CDRAWDoc),
    RUNTIME_CLASS(CChildFrame),
    RUNTIME_CLASS(CDRAWView1));
    AddDocTemplate(pViewDocTemplate);
      

  9.   

    研究了一下深入浅出mfc,呵呵
    可以这样,
    在CMyAPP中,定义两个成员指针protected:
    CMultiDocTemplate* m_p1;
    CMultiDocTemplate* m_p2;在CMyApp::InitInstance()中
    这样做 CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(
    IDR_MYTYPE,
    RUNTIME_CLASS(CMyDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CMyView));
    AddDocTemplate(pDocTemplate);
    m_p1 = pDocTemplate;
      
              此为视图1,或者说是系统生成的
    CMultiDocTemplate* pDocTemplate1;
    pDocTemplate1 = new CMultiDocTemplate(
    IDR_MYTYPE,
    RUNTIME_CLASS(CMyDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CMyView1));
    AddDocTemplate(pDocTemplate1);
    m_p2 = pDocTemplate1;          这个CMyView1是你自己做的那个视图   于是,要生成CMyView的窗口
      调用m_p1 ->OpenDocumentFile(NULL); 于是,要生成CMyView1的窗口
      调用m_p2 ->OpenDocumentFile(NULL);
     最后一点,原来窗口上有个打开的菜单,就是系统自带的菜单,如果你要使它还是新建旧的视图
    那么在CmyApp中响应ON_FILE_NEW,在其中调用
    void CMyApp::OnFileNew() 
    {
    // TODO: Add your command handler code here
    m_p1->OpenDocumentFile(NULL);
    }
    嗯,嗯,你所有新建子窗口的响应最好在app中做,个人觉得,因为默认就是这样的,呵呵