cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing;
这样,程序启动后就不会自动产生一个View了,但是现在我想按主框架菜单中的某一项,来象File->New那样产生某一个View,例如按button1产生View1,按Button2产生View2...,请问高手如何实现。
11 个解决方案
#1
此语句使你的程序不自动创建新文档.不是不产生View.
只要重载OnNewFile就行了
只要重载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时,隐藏就是了.
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的类型。
IDR_xxx_MENU,
RUNTIME_CLASS(CxxxDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CxxxView));
不能返回View类吧,我就是这样做的。我的意思是按下Button1后,怎样弹出View1,怎样确定弹出View的类型。
#4
你的View的类型不一样?
小舟的方法我没有试过,用GetActiveView得到当前类型不行吗?
小舟的方法我没有试过,用GetActiveView得到当前类型不行吗?
#5
To smq:
非常抱歉,严正更正:
上面不能返回View,是CMultiDocTemplate,(作过很长时间,只知道有这个方法,忘了具体写法,见笑,请原谅),代码如下:
(菜单里)
CDocTemplate *pTemplate = ((CBSHKSEApp*)AfxGetApp())->m_pTemplate1 ;
((CMainFrame*) AfxGetMainWnd())->SwitchView (pTemplate, RUNTIME_CLASS(CxxxView), SW_MINIMIZE ) ;
非常抱歉,严正更正:
上面不能返回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);
}
{
……
……
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)
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;
.......
}
不知如何解决?
在下面的程序中
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);
}
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就行了
只要重载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时,隐藏就是了.
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的类型。
IDR_xxx_MENU,
RUNTIME_CLASS(CxxxDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CxxxView));
不能返回View类吧,我就是这样做的。我的意思是按下Button1后,怎样弹出View1,怎样确定弹出View的类型。
#4
你的View的类型不一样?
小舟的方法我没有试过,用GetActiveView得到当前类型不行吗?
小舟的方法我没有试过,用GetActiveView得到当前类型不行吗?
#5
To smq:
非常抱歉,严正更正:
上面不能返回View,是CMultiDocTemplate,(作过很长时间,只知道有这个方法,忘了具体写法,见笑,请原谅),代码如下:
(菜单里)
CDocTemplate *pTemplate = ((CBSHKSEApp*)AfxGetApp())->m_pTemplate1 ;
((CMainFrame*) AfxGetMainWnd())->SwitchView (pTemplate, RUNTIME_CLASS(CxxxView), SW_MINIMIZE ) ;
非常抱歉,严正更正:
上面不能返回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);
}
{
……
……
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)
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;
.......
}
不知如何解决?
在下面的程序中
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);
}
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,谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!