怎么加入一个新视图! 我现在后期想加入一个自己新插入的类CFormView,在某MenuItem点击后会出现自己新建的这个CFormView,如何实现啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 现在在MDI中能出来了,但它没有最大化,最小化按钮,并且窗体上的控件不能被激活,不像file->new那样能出来一个Child窗体,附此代码:void CMainFrame::OnTwo() { SwitchToForm(IDD_DIALOG2); }void CMainFrame::SwitchToForm(int nForm){ //CDocument* pDoc = GetActiveDocument(); CView *pOldActiveView=GetActiveView(); //保存旧视图 CView *pNewActiveView=(CView*)GetDlgItem(nForm); //取得新视图 if(pNewActiveView==NULL) { switch(nForm) //这些ID是对话框的标志符,但也可以用其他的标志 { case IDD_DIALOG1 : pNewActiveView=(CView*)new COne; break; case IDD_DIALOG2 : pNewActiveView=(CView*)new CTwo; break; } CCreateContext context; //将文挡和视图相连 context.m_pCurrentDoc=pOldActiveView->GetDocument(); if (pNewActiveView==NULL) { AfxMessageBox("aaa"); } else { AfxMessageBox("bbb"); } pNewActiveView->Create(NULL, NULL, WS_BORDER|WS_CHILD , this->rectDefault, this, nForm, &context); pNewActiveView->OnInitialUpdate(); } SetActiveView(pNewActiveView); //改变活动的视图 pNewActiveView->ShowWindow(SW_SHOW); //显示新的视图 pOldActiveView->ShowWindow(SW_HIDE); //隐藏旧的视图 if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(COne)) pOldActiveView->SetDlgCtrlID(IDD_DIALOG1); else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CTwo)) pOldActiveView->SetDlgCtrlID(IDD_DIALOG2); pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); delete pOldActiveView; //删除旧视图 RecalcLayout(); //调整框架窗口} 我觉的你应该在New Window 这个框架自动生成的菜单中添加自己相应代码,如在用户点击这个菜单的时候你就弹出一个对话框让用户选择哪一种方式的View。我们在CChildFrame中的OnCreateClient中可以根据用户选择的不同View来设置pContext中的CurView的值这样就可以生成不同的View了。当然你也可以使用多文档类型的结构也可以;另外你也可以考虑使用拆分窗口的方式来实现这一功能;总之,我觉的你不应该自己来创建CChildFrame,而应该有MFC来给你创建,你只是在CChildFrame中创建它的Client的时候才去干涉让它创建自己要求的View的风格; 字符串搜索问题 MFC 画直线 两个类在之间如何传递数据? 谁能告诉我怎么学习VC? 小弟想跟着做项目,有人要没,可以不要钱的! 用directshow采集音频的问题 MFC SDI 程序 加载工具栏按钮错乱!!!!!!!!! 线程接受到指针参数出错 套接字问题再次提问 谁帮我(和所有vc初学者)介绍几本好书???(没分?) 菜鸟提问 怎样用对话框打开位图文件并显示
那样能出来一个Child窗体,附此代码:
void CMainFrame::OnTwo()
{
SwitchToForm(IDD_DIALOG2);
}void CMainFrame::SwitchToForm(int nForm)
{
//CDocument* pDoc = GetActiveDocument();
CView *pOldActiveView=GetActiveView(); //保存旧视图
CView *pNewActiveView=(CView*)GetDlgItem(nForm); //取得新视图
if(pNewActiveView==NULL)
{
switch(nForm)
//这些ID是对话框的标志符,但也可以用其他的标志
{
case IDD_DIALOG1 :
pNewActiveView=(CView*)new COne;
break;
case IDD_DIALOG2 :
pNewActiveView=(CView*)new CTwo;
break;
}
CCreateContext context; //将文挡和视图相连
context.m_pCurrentDoc=pOldActiveView->GetDocument();
if (pNewActiveView==NULL)
{
AfxMessageBox("aaa");
}
else
{
AfxMessageBox("bbb");
}
pNewActiveView->Create(NULL, NULL, WS_BORDER|WS_CHILD ,
this->rectDefault, this, nForm, &context); pNewActiveView->OnInitialUpdate();
}
SetActiveView(pNewActiveView); //改变活动的视图
pNewActiveView->ShowWindow(SW_SHOW); //显示新的视图
pOldActiveView->ShowWindow(SW_HIDE); //隐藏旧的视图 if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(COne))
pOldActiveView->SetDlgCtrlID(IDD_DIALOG1); else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CTwo))
pOldActiveView->SetDlgCtrlID(IDD_DIALOG2); pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
delete pOldActiveView; //删除旧视图
RecalcLayout(); //调整框架窗口}
可以根据用户选择的不同View来设置pContext中的CurView的值这样就可以生成不同的View了。当然你也可以使用多文档类型的结构也可以;另外你也可以考虑使用拆分窗口的方式来实现这一功能;
总之,我觉的你不应该自己来创建CChildFrame,而应该有MFC来给你创建,你只是在CChildFrame中创建它的Client的时候才去干涉让它创建自己要求的View的风格;