高分请教一个问题,高手请进

时间:2022-05-17 18:53:06
我建了一个多文档程序,其中用到了4个View,但是在程序启动时,我想将程序自动生成的View去掉,所以我在主程序中加入了以下代码:
cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing;

这样,程序启动后就不会自动产生一个View了,但是现在我想按主框架菜单中的某一项,来象File->New那样产生某一个View,例如按button1产生View1,按Button2产生View2...,请问高手如何实现。

11 个解决方案

#1


此语句使你的程序不自动创建新文档.不是不产生View.
只要重载OnNewFile就行了

#2


1.我觉得你要那样作也可以(肯定是可以实现的)
2.更自然的做法是:
在你的CxxxApp::InitInstance()里,
定义公有m_pView1,m_pView...,m_pView4,然后
m_pView1 = new CMultiDocTemplate(
IDR_xxx_MENU,
RUNTIME_CLASS(CxxxDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CxxxView));

这样,你的View在程序起来以后就建立了,以后你通过菜单选择View时,只需要取 App中的View就可以了(这样不是每次选菜单都要New;每次都New,不合理吧),当然,你不想看见那些View时,隐藏就是了.

#3


m_pView1 = new CMultiDocTemplate(
        IDR_xxx_MENU,
        RUNTIME_CLASS(CxxxDoc),
        RUNTIME_CLASS(CChildFrame), // custom MDI child frame
        RUNTIME_CLASS(CxxxView));

不能返回View类吧,我就是这样做的。我的意思是按下Button1后,怎样弹出View1,怎样确定弹出View的类型。

#4


你的View的类型不一样?
  小舟的方法我没有试过,用GetActiveView得到当前类型不行吗?

#5


To smq:
非常抱歉,严正更正:
上面不能返回View,是CMultiDocTemplate,(作过很长时间,只知道有这个方法,忘了具体写法,见笑,请原谅),代码如下:
(菜单里)
CDocTemplate *pTemplate = ((CBSHKSEApp*)AfxGetApp())->m_pTemplate1 ;

((CMainFrame*) AfxGetMainWnd())->SwitchView (pTemplate, RUNTIME_CLASS(CxxxView), SW_MINIMIZE ) ;

#6


SwitchView,好像没有这个函数呀

#7


BOOL CMyApp::InitInstance()
{
……
……
m_pDocViewTemplate1 = new CMultiDocTemplate(
IDR_VIEWTYPE1,
RUNTIME_CLASS(CDoc1),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(Cview1));
AddDocTemplate(m_pBlackEditDocTemplate);

m_pDocViewTemplate2 = new CMultiDocTemplate(
IDR_VIEWTYPE2,
RUNTIME_CLASS(CDoc2),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CView2));
AddDocTemplate(m_pEditDocTemplate);

m_pDocViewTemplate3 = …

….
}


void CMainFrame::ShowView(CDocTemplate *pTemplate,CRuntimeClass *pViewClass)
{
        CMDIChildWnd * pMDIActive=MDIGetActive();

if(pMDIActive==NULL) return;
CDocument * pDoc=pMDIActive->GetActiveDocument();
CView * pView;

POSITION pos=pDoc->GetFirstViewPosition();
while(pos)
{
pView=pDoc->GetNextView(pos);
if(pView->IsKindOf(pViewClass))
{
pView->GetParentFrame()->ActivateFrame();
return;
}
}

CMDIChildWnd*pNewFrame=(CMDIChildWnd*)pTemplate->CreateNewFrame(pDoc,NULL);
if(!pNewFrame)
return;

pTemplate->InitialUpdateFrame(pNewFrame,pDoc);
}

void CMainFrame::OnShowView1()
{
    CDocTemplate *pTemplate=m_pDocViewTemplate1, 
    CRuntimeClass *pViewClass=RUNTIME_CLASS(CView1);
    ShowView(pTemplate,pViewClass);
}

void CMainFrame::OnShowView2()
{
    CDocTemplate *pTemplate=m_pDocViewTemplate2, 
    CRuntimeClass *pViewClass=RUNTIME_CLASS(CView2);
    ShowView(pTemplate,pViewClass);
}

#8


对不起,前面的AddDocTemplate(m_pBlackEditDocTemplate)应为AddDocTemplate(m_pDocViewTemplate1);
AddDocTemplate(m_pEditDocTemplate)为AAddDocTemplate(m_pDocViewTemplate2)



#9


farland老兄:
在下面的程序中
void CMainFrame::ShowView(CDocTemplate *pTemplate,CRuntimeClass *pViewClass)
{
        CMDIChildWnd * pMDIActive=MDIGetActive();

    if(pMDIActive==NULL) return; 因为我启动时没有View,所以此处pMDIActive为NULL.
    CDocument * pDoc=pMDIActive->GetActiveDocument();
    CView * pView;
    .......
}

不知如何解决?

#10


试试下面代码,我没试过。
void CMainFrame::ShowView(CDocTemplate *pTemplate,CRuntimeClass *pViewClass)
{
    CMDIChildWnd * pMDIActive=MDIGetActive();
    CDocument * pDoc;

    if(pMDIActive==NULL) 
{
         pDoc=pTemplate->CreateNewDocument();
}
else
{
        pDoc=pMDIActive->GetActiveDocument();
        CView * pView;

        POSITION pos=pDoc->GetFirstViewPosition();
        while(pos)
{
            pView=pDoc->GetNextView(pos);
            if(pView->IsKindOf(pViewClass))

                pView->GetParentFrame()->ActivateFrame();
                return;
}
        }
    }

    CMDIChildWnd*pNewFrame=(CMDIChildWnd*)pTemplate->CreateNewFrame(pDoc,NULL);
    if(!pNewFrame)
        return;

    pTemplate->InitialUpdateFrame(pNewFrame,pDoc);
}



#11


谢谢各位的回答,尤其感谢farland(lyzhou)老兄和xyzboat,谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!

#1


此语句使你的程序不自动创建新文档.不是不产生View.
只要重载OnNewFile就行了

#2


1.我觉得你要那样作也可以(肯定是可以实现的)
2.更自然的做法是:
在你的CxxxApp::InitInstance()里,
定义公有m_pView1,m_pView...,m_pView4,然后
m_pView1 = new CMultiDocTemplate(
IDR_xxx_MENU,
RUNTIME_CLASS(CxxxDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CxxxView));

这样,你的View在程序起来以后就建立了,以后你通过菜单选择View时,只需要取 App中的View就可以了(这样不是每次选菜单都要New;每次都New,不合理吧),当然,你不想看见那些View时,隐藏就是了.

#3


m_pView1 = new CMultiDocTemplate(
        IDR_xxx_MENU,
        RUNTIME_CLASS(CxxxDoc),
        RUNTIME_CLASS(CChildFrame), // custom MDI child frame
        RUNTIME_CLASS(CxxxView));

不能返回View类吧,我就是这样做的。我的意思是按下Button1后,怎样弹出View1,怎样确定弹出View的类型。

#4


你的View的类型不一样?
  小舟的方法我没有试过,用GetActiveView得到当前类型不行吗?

#5


To smq:
非常抱歉,严正更正:
上面不能返回View,是CMultiDocTemplate,(作过很长时间,只知道有这个方法,忘了具体写法,见笑,请原谅),代码如下:
(菜单里)
CDocTemplate *pTemplate = ((CBSHKSEApp*)AfxGetApp())->m_pTemplate1 ;

((CMainFrame*) AfxGetMainWnd())->SwitchView (pTemplate, RUNTIME_CLASS(CxxxView), SW_MINIMIZE ) ;

#6


SwitchView,好像没有这个函数呀

#7


BOOL CMyApp::InitInstance()
{
……
……
m_pDocViewTemplate1 = new CMultiDocTemplate(
IDR_VIEWTYPE1,
RUNTIME_CLASS(CDoc1),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(Cview1));
AddDocTemplate(m_pBlackEditDocTemplate);

m_pDocViewTemplate2 = new CMultiDocTemplate(
IDR_VIEWTYPE2,
RUNTIME_CLASS(CDoc2),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CView2));
AddDocTemplate(m_pEditDocTemplate);

m_pDocViewTemplate3 = …

….
}


void CMainFrame::ShowView(CDocTemplate *pTemplate,CRuntimeClass *pViewClass)
{
        CMDIChildWnd * pMDIActive=MDIGetActive();

if(pMDIActive==NULL) return;
CDocument * pDoc=pMDIActive->GetActiveDocument();
CView * pView;

POSITION pos=pDoc->GetFirstViewPosition();
while(pos)
{
pView=pDoc->GetNextView(pos);
if(pView->IsKindOf(pViewClass))
{
pView->GetParentFrame()->ActivateFrame();
return;
}
}

CMDIChildWnd*pNewFrame=(CMDIChildWnd*)pTemplate->CreateNewFrame(pDoc,NULL);
if(!pNewFrame)
return;

pTemplate->InitialUpdateFrame(pNewFrame,pDoc);
}

void CMainFrame::OnShowView1()
{
    CDocTemplate *pTemplate=m_pDocViewTemplate1, 
    CRuntimeClass *pViewClass=RUNTIME_CLASS(CView1);
    ShowView(pTemplate,pViewClass);
}

void CMainFrame::OnShowView2()
{
    CDocTemplate *pTemplate=m_pDocViewTemplate2, 
    CRuntimeClass *pViewClass=RUNTIME_CLASS(CView2);
    ShowView(pTemplate,pViewClass);
}

#8


对不起,前面的AddDocTemplate(m_pBlackEditDocTemplate)应为AddDocTemplate(m_pDocViewTemplate1);
AddDocTemplate(m_pEditDocTemplate)为AAddDocTemplate(m_pDocViewTemplate2)



#9


farland老兄:
在下面的程序中
void CMainFrame::ShowView(CDocTemplate *pTemplate,CRuntimeClass *pViewClass)
{
        CMDIChildWnd * pMDIActive=MDIGetActive();

    if(pMDIActive==NULL) return; 因为我启动时没有View,所以此处pMDIActive为NULL.
    CDocument * pDoc=pMDIActive->GetActiveDocument();
    CView * pView;
    .......
}

不知如何解决?

#10


试试下面代码,我没试过。
void CMainFrame::ShowView(CDocTemplate *pTemplate,CRuntimeClass *pViewClass)
{
    CMDIChildWnd * pMDIActive=MDIGetActive();
    CDocument * pDoc;

    if(pMDIActive==NULL) 
{
         pDoc=pTemplate->CreateNewDocument();
}
else
{
        pDoc=pMDIActive->GetActiveDocument();
        CView * pView;

        POSITION pos=pDoc->GetFirstViewPosition();
        while(pos)
{
            pView=pDoc->GetNextView(pos);
            if(pView->IsKindOf(pViewClass))

                pView->GetParentFrame()->ActivateFrame();
                return;
}
        }
    }

    CMDIChildWnd*pNewFrame=(CMDIChildWnd*)pTemplate->CreateNewFrame(pDoc,NULL);
    if(!pNewFrame)
        return;

    pTemplate->InitialUpdateFrame(pNewFrame,pDoc);
}



#11


谢谢各位的回答,尤其感谢farland(lyzhou)老兄和xyzboat,谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!