我原来做好了一个多文档程序,现在要增加一个数据库视图,所以加了一个菜单响应函数,其中的代码如下,程序能运行,但是我选“显示数据库”菜单时弹出错误:“命令失败”,不能显示新的视图。请问代码错在哪里?如何改正。
         CMDIChildWnd* pChild=MDIGetActive();
CDocument* pDocument;
if(pChild==NULL||(pDocument=pChild->GetActiveDocument())==NULL)
{
TRACE0("No active document for WindowNew command.\n");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return;
}
CMiniDrawApp* pApp=(CMiniDrawApp*)AfxGetApp();
CDocTemplate* pTemplate=pApp->GetDocTemplate2();
ASSERT_VALID(pTemplate);
CFrameWnd* pFrame=pTemplate->CreateNewFrame(pDocument,pChild);
if(pFrame==NULL)
{
TRACE0("Failed to create new frame");
pTemplate->InitialUpdateFrame(pFrame,pDocument);
}另外,我用的是.dll,要装了vc才能运行,在没有vc的电脑运行不了,请问怎样修正这个缺点?

解决方案 »

  1.   

    if(this->m_pDocManager==NULL||this->m_pTestTemplate==NULL)//没有初始化文档
    {
    CMultiDocTemplate* pDocTemplate;
        pDocTemplate = new CMultiDocTemplate(IDR_TESTTYPE,
    RUNTIME_CLASS(CTestDoc),
    RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
    RUNTIME_CLASS(CTestView));
        AddDocTemplate(pDocTemplate);
    this->m_pTestTemplate=pDocTemplate; 
    pDocTemplate->OpenDocumentFile(NULL);
    }
    else 
    {   
            POSITION p=this->m_pTestTemplate->GetFirstDocPosition();
    if(p)//活动文档存在
    {
    CDocument* pDoc=this->m_pTestTemplate->GetNextDoc(p);
    p=pDoc->GetFirstViewPosition();
    if(p)//视存在
    {
       CView* pView=pDoc->GetNextView(p);
       pView->GetParentFrame()->BringWindowToTop();
    }
    }
    else
    {
    this->m_pTestTemplate->OpenDocumentFile(NULL); 
    }
    }
      

  2.   

    另外,我用的是.dll,要装了vc才能运行,在没有vc的电脑运行不了,请问怎样修正这个缺点?
    ===
    project->setting->use mfc in static
      

  3.   

    dll可以用static link的方式,不过这样会造成文件过大
    可以把用到的dll带上,然后发布
      

  4.   

    多文档的我没有试过,但文档是没有问题的。
    再但文档中,无非就是创建新的视图类对象,切断原来视图类与文档类的联系,将新的视图与文档类关联,以下代码仅供参考:
    void SwitchToForm()
    {
     CView *pOldActiveView=GetActiveView();             //保存旧视图
        CView *pNewActiveView=(CView*)GetDlgItem(nForm);   //取得新视图
        if(pNewActiveView==NULL)
        {
           pNewActiveView=(CView*)new CView1;//CView1是FormView1的派生类
           CCreateContext context;   //将文挡和视图相连
           context.m_pCurrentDoc=pOldActiveView->GetDocument();
           pNewActiveView->Create(NULL, NULL, WS_BORDER|WS_CHILD ,
                CFrameWnd::rectDefault, this, nForm, &context);
           pNewActiveView->OnInitialUpdate();
        }
        SetActiveView(pNewActiveView);        //改变活动的视图
        pNewActiveView->ShowWindow(SW_SHOW);  //显示新的视图
        pOldActiveView->ShowWindow(SW_HIDE);  //隐藏旧的视图    if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView1))
    pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM1);    pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);    delete pOldActiveView;   //删除旧视图
    RecalcLayout();          //调整框架窗口
    }
      

  5.   

    首先感谢各位的回复。
    我原来没有说清楚,我上面的那段代码是写在CMainFrame类的彩单中,所以laiyiling你的代码中的this后面的变量都没有,编译报错。ldiqing你的代码要删去原来的视图,我的是要同时有两个视图。
    请各位能进一步赐教,谢谢!
    我用laiyiling的方法实现了在没有vc的环境也能运行,不过oyljerry说的对,文件变大,请问怎么把ddll带上?报错时说找不到MFC42.dll,把它拷过去后好像要注册吧?要怎样做呢?
      

  6.   

    CMDIChildWnd* pChild=MDIGetActive();//返回空指针
    CDocument* pDocument;
    if(pChild==NULL||(pDocument=pChild->GetActiveDocument())==NULL)
    {
    TRACE0("No active document for WindowNew command.\n");
    AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
    return;
    }
    CMiniDrawApp* pApp=(CMiniDrawApp*)AfxGetApp();
    CDocTemplate* pTemplate=pApp->GetDocTemplate2();
    ASSERT_VALID(pTemplate);
    CFrameWnd* pFrame=pTemplate->CreateNewFrame(pDocument,pChild);
    if(pFrame==NULL)
    {
    TRACE0("Failed to create new frame");
    pTemplate->InitialUpdateFrame(pFrame,pDocument);
    }
    经过测试,我发现是第一行返回的是空指针,请问应该怎么改正啊?各位大侠帮帮忙。