我建立了一个单文档的程序.
但我现在想单击一个按钮,就能弹出另外一个视图类窗口(不是对话框).这该如何实现呢??

解决方案 »

  1.   

    可以倒是可以,但打开一个之后,另一个就没有了,也就是说同时只能存在一个视图类窗口。
    如果想同时显示多个的话,就用多文档吧。
    单文档的程序下,你可以在工具栏里建个刷新按钮。代码如下,看看对你有用没。
    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.   

    我的主框架是基于COLE...View的,其余的对话框是基于CFormView的(有很多),实现了这个功能,可在多个窗口间切换(基于单文档)思路如下:1、单击按钮后向主框架发送一个用户自定义消息;
    2、在主框架中CMainFrame中处理这个消息----〉调用一个ReplaceView函数(要自己写)
    HWND CMainFrame::ReplaceView(CRuntimeClass *pViewClass);//切换窗口
    3、ReplaceView函数动态创建一个CFormView类(如果你的另一个要显示的对话框是基于此)的对象,此处要用到CRuntimeClass进行动态创建。
    4、ReplaceView的通用性很好,如果你需要调用其他对话框,将ReplaceView参数设为你的新的对话框类就行了,如:ReplaceView(CForm2);
    ReplaceView代码很长,有时间再给你看看,先自己写写吧!
      

  3.   

    我这几天也在做这个界面,但是在网上大家不大热情
    到处碰壁,其实也是好事。现在我自己把它做成了。要感谢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()函数要仔细研究一下。
      

  4.   

    其实不难,是吗?呵呵。
    补充一下,CBranchForm这三个类都是从Formview继承来的。
      

  5.   

    你看看MSDN中“COLLECT”(属于MFC这类例子)这个例子的功能是否符合拟的需要!