建立了一个单文档的程序,单击一个按钮,如何再弹出另外一个视图类窗口(不是对话框).请教,急用 我建立了一个单文档的程序.但我现在想单击一个按钮,就能弹出另外一个视图类窗口(不是对话框).这该如何实现呢?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以倒是可以,但打开一个之后,另一个就没有了,也就是说同时只能存在一个视图类窗口。如果想同时显示多个的话,就用多文档吧。单文档的程序下,你可以在工具栏里建个刷新按钮。代码如下,看看对你有用没。void CMainFrame::OnFileNew() { CNewFileDlg dlg; if(dlg.DoModal()!=IDOK) { GlobalLayout * pGlobalLayout; pGlobalLayout=((CPatternDesignCADApp *)AfxGetApp())->GetGloballayoutPtr(); CRect rc; /*根据客户区大小设置位图宽和高*/ pGlobalLayout->GetClientRect(&rc); m_MainBmpInterFace.InitBmpInterface(rc.Width(),rc.Height()); } else { m_MainBmpInterFace.InitBmpInterface(dlg.m_nWidth,dlg.m_nHeight); } m_wndLayerBox.UpdateLayerList(); Invalidate();} 我的主框架是基于COLE...View的,其余的对话框是基于CFormView的(有很多),实现了这个功能,可在多个窗口间切换(基于单文档)思路如下:1、单击按钮后向主框架发送一个用户自定义消息;2、在主框架中CMainFrame中处理这个消息----〉调用一个ReplaceView函数(要自己写)HWND CMainFrame::ReplaceView(CRuntimeClass *pViewClass);//切换窗口3、ReplaceView函数动态创建一个CFormView类(如果你的另一个要显示的对话框是基于此)的对象,此处要用到CRuntimeClass进行动态创建。4、ReplaceView的通用性很好,如果你需要调用其他对话框,将ReplaceView参数设为你的新的对话框类就行了,如:ReplaceView(CForm2);ReplaceView代码很长,有时间再给你看看,先自己写写吧! 我这几天也在做这个界面,但是在网上大家不大热情到处碰壁,其实也是好事。现在我自己把它做成了。要感谢msdn这么一个好东西。如果你没有的话,强烈建议你马上去买。你可以参照Using Visual++目录下的 Visual c++ Tutorials目录下的 Enroll示例程序你一定可以搞出来。建议你先按照msdn上面做做看,有必要可以看如下代码。楼上所说的void SwitchToForm(int nForm)代码如下: void CMainFrame::SwitchToForm(int nForm){ CView* pOldActiveView = GetActiveView(); CView* pNewActiveView = (CView*)GetDlgItem(nForm); if (pNewActiveView == NULL) { switch (nForm) { case IDW_MONITOR_FORM: pNewActiveView = (CView*)new CMonitorForm; break; case IDW_BRANCH_FORM: pNewActiveView = (CView*)new CBranchForm; break; case IDW_CHARGE_FORM: pNewActiveView = (CView*)new CChargeForm; break; default: break; } CCreateContext context; context.m_pCurrentDoc = pOldActiveView->GetDocument(); pNewActiveView->Create(NULL, NULL, 0L, CFrameWnd::rectDefault, this, nForm, &context); } SetActiveView(pNewActiveView); pNewActiveView->ShowWindow(SW_SHOW); pOldActiveView->ShowWindow(SW_HIDE); if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CMonitorForm)) { pOldActiveView->SetDlgCtrlID(IDW_MONITOR_FORM); } else if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CBranchForm)) { pOldActiveView->SetDlgCtrlID(IDW_BRANCH_FORM); } else if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CChargeForm)) { pOldActiveView->SetDlgCtrlID(IDW_CHARGE_FORM); } pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); RecalcLayout();}按钮函数如下: void CMainFrame::OnButtonBranch() { if (GetActiveView()->IsKindOf(RUNTIME_CLASS(CBranchForm))) return; SwitchToForm(IDW_BRANCH_FORM);} 其中IDW_BRANCH_FORM是表单名字。创建表单要在classview里右击工程名,选择new form还有,在你的app应用类中要把自动添加的模板注释掉,不然,一打开就会让你选显示哪个界面。 /* { // BLOCK: doc template registration // Register the document template. Document templates serve // as the connection between documents, frame windows and views. // Attach this form to another document or frame window by changing // the document or frame class in the constructor below. CSingleDocTemplate* pNewDocTemplate = new CSingleDocTemplate( IDR_BRANCHFORM_TMPL, RUNTIME_CLASS(CM880Doc), // document class RUNTIME_CLASS(CMainFrame), // frame class RUNTIME_CLASS(CBranchForm)); // view class AddDocTemplate(pNewDocTemplate); } */修改原先的模板指向主界面。CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CM880Doc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CMonitorForm)); AddDocTemplate(pDocTemplate);特别是SwitchToForm()函数要仔细研究一下。 其实不难,是吗?呵呵。补充一下,CBranchForm这三个类都是从Formview继承来的。 你看看MSDN中“COLLECT”(属于MFC这类例子)这个例子的功能是否符合拟的需要! 线程读串口的问题 CEdit显示时间 CDateTimeCtrl显示年月格式,但选择2月时,控件的月份就显示不出来了。不知是什么鬼问题。 请问c语言怎么实现像手机键盘输入字母那样,连续点一个键,会切换字母 释放的时候为什么会出错?? 怎么绘制矩形函数无效??帮我改改 我的COM控件不能用啦!! 请教高手:SDK编程中,如何读取文件中一行数据(以\0结尾) 防火墙的实时监控是如何实现的?? 。。。。。。如何在程序中实现禁止窗口被改变大小。。。。。。 如何用串口发送和接收文件? 请问有没有类似qq的局域网聊天程序,我想把它放在单位的局域网上。
如果想同时显示多个的话,就用多文档吧。
单文档的程序下,你可以在工具栏里建个刷新按钮。代码如下,看看对你有用没。
void CMainFrame::OnFileNew()
{
CNewFileDlg dlg;
if(dlg.DoModal()!=IDOK)
{
GlobalLayout * pGlobalLayout;
pGlobalLayout=((CPatternDesignCADApp *)AfxGetApp())->GetGloballayoutPtr();
CRect rc;
/*根据客户区大小设置位图宽和高*/
pGlobalLayout->GetClientRect(&rc);
m_MainBmpInterFace.InitBmpInterface(rc.Width(),rc.Height());
}
else
{
m_MainBmpInterFace.InitBmpInterface(dlg.m_nWidth,dlg.m_nHeight);
}
m_wndLayerBox.UpdateLayerList();
Invalidate();
}
2、在主框架中CMainFrame中处理这个消息----〉调用一个ReplaceView函数(要自己写)
HWND CMainFrame::ReplaceView(CRuntimeClass *pViewClass);//切换窗口
3、ReplaceView函数动态创建一个CFormView类(如果你的另一个要显示的对话框是基于此)的对象,此处要用到CRuntimeClass进行动态创建。
4、ReplaceView的通用性很好,如果你需要调用其他对话框,将ReplaceView参数设为你的新的对话框类就行了,如:ReplaceView(CForm2);
ReplaceView代码很长,有时间再给你看看,先自己写写吧!
到处碰壁,其实也是好事。现在我自己把它做成了。要感谢msdn这么一个好东西。
如果你没有的话,强烈建议你马上去买。
你可以参照Using Visual++目录下的
Visual c++ Tutorials目录下的
Enroll示例程序你一定可以搞出来。建议你先按照msdn上面做做看,有必要可以看如下代码。楼上所说的void SwitchToForm(int nForm)
代码如下: void CMainFrame::SwitchToForm(int nForm)
{
CView* pOldActiveView = GetActiveView();
CView* pNewActiveView = (CView*)GetDlgItem(nForm);
if (pNewActiveView == NULL)
{
switch (nForm)
{
case IDW_MONITOR_FORM:
pNewActiveView = (CView*)new CMonitorForm;
break; case IDW_BRANCH_FORM:
pNewActiveView = (CView*)new CBranchForm;
break; case IDW_CHARGE_FORM:
pNewActiveView = (CView*)new CChargeForm;
break;
default:
break;
} CCreateContext context;
context.m_pCurrentDoc = pOldActiveView->GetDocument();
pNewActiveView->Create(NULL, NULL, 0L, CFrameWnd::rectDefault,
this, nForm, &context);
} SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE); if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CMonitorForm))
{
pOldActiveView->SetDlgCtrlID(IDW_MONITOR_FORM);
}
else if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CBranchForm))
{
pOldActiveView->SetDlgCtrlID(IDW_BRANCH_FORM);
}
else if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CChargeForm))
{
pOldActiveView->SetDlgCtrlID(IDW_CHARGE_FORM);
} pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();
}按钮函数如下:
void CMainFrame::OnButtonBranch()
{
if (GetActiveView()->IsKindOf(RUNTIME_CLASS(CBranchForm)))
return;
SwitchToForm(IDW_BRANCH_FORM);
} 其中IDW_BRANCH_FORM是表单名字。
创建表单要在classview里右击工程名,选择new form还有,在你的app应用类中要把自动添加的模板注释掉,不然,一打开就会让你选显示哪个界面。 /*
{ // BLOCK: doc template registration
// Register the document template. Document templates serve
// as the connection between documents, frame windows and views.
// Attach this form to another document or frame window by changing
// the document or frame class in the constructor below.
CSingleDocTemplate* pNewDocTemplate = new CSingleDocTemplate(
IDR_BRANCHFORM_TMPL,
RUNTIME_CLASS(CM880Doc), // document class
RUNTIME_CLASS(CMainFrame), // frame class
RUNTIME_CLASS(CBranchForm)); // view class
AddDocTemplate(pNewDocTemplate);
}
*/修改原先的模板指向主界面。
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CM880Doc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CMonitorForm));
AddDocTemplate(pDocTemplate);特别是SwitchToForm()函数要仔细研究一下。
补充一下,CBranchForm这三个类都是从Formview继承来的。