希望能通过菜单点“子窗口1”,弹出一个唯一的“子窗口1”;点“子窗口2”,弹出一个唯一的“子窗口2”;.....
我自己尝试用多文档模版建,但老弹出叫我选择文档模版小窗口;用子窗口的方法去建,主框架窗口和子窗口又只能有一个框架兰色(=一个焦点),难看,不知道问题出在哪里,希望各位大侠比吝赐教,帮帮我这个菜鸟,谢谢!100分及时呈上

解决方案 »

  1.   

    #if !defined(AFX_TABDLG_H__7F15FD4D_C850_4306_8EB8_4791CA7604C5__INCLUDED_)
    #define AFX_TABDLG_H__7F15FD4D_C850_4306_8EB8_4791CA7604C5__INCLUDED_
    我以前的MDI#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // TabDlg.h : header file
    ///////////////////////////////////////////////////////////////////////////////
    // CTabDlg form view#ifndef __AFXEXT_H__
    #include <afxext.h>
    #endif
    class CShowPicFrmWnd;
    class CPicViewDoc;
    class CShowChartWnd;
    class CResultViewFrmWnd;
    class CTabDlg : public CFormView
    {
    protected:
    CTabDlg();           // protected constructor used by dynamic creation
    DECLARE_DYNCREATE(CTabDlg)
    private:

    // Form Data
    public:
    //{{AFX_DATA(CTabDlg)
    enum { IDD = IDD_TABDLG };
    //}}AFX_DATA// Attributes
    public:
    BOOL b_ChartOpened,b_mainpicOpened,b_ResultOpened;
        
        CShowPicFrmWnd *p_FrameShowPic;
    CShowChartWnd  *p_ShowChartWnd;
    CResultViewFrmWnd *p_ResultWnd;
      CCreateContext context_showpic,resultview_context;
    // Operations
    public:// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CTabDlg)
    public:
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL// Implementation
    protected:
    virtual ~CTabDlg();
    #ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
    #endif // Generated message map functions
    //{{AFX_MSG(CTabDlg)
    afx_msg void OnMainpic();
    afx_msg void OnPanechart();
    afx_msg void OnPaneresult();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_TABDLG_H__7F15FD4D_C850_4306_8EB8_4791CA7604C5__INCLUDED_)
    //////////////////////实现// TabDlg.cpp : implementation file
    //#include "stdafx.h"
    #include "lab.h"
    #include "TabDlg.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    #include "ShowPicFrmWnd.h"
    #include "ShowPicView.h"
    #include "PicViewDoc.h"
    #include "ShowChartWnd.h"#include "ResultViewFrmWnd.h"
    #include "ResultListView.h"IMPLEMENT_DYNCREATE(CTabDlg, CFormView)
    CPicViewDoc *p_Doc=NULL;
    CTabDlg::CTabDlg()
    : CFormView(CTabDlg::IDD)
    {
    //{{AFX_DATA_INIT(CTabDlg)
    // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
    b_ChartOpened=FALSE;
    b_mainpicOpened=FALSE;
    b_ResultOpened=FALSE;
        p_ShowChartWnd=NULL;
    p_FrameShowPic=NULL;
    p_ResultWnd=NULL;

    p_Doc=new CPicViewDoc;
    }CTabDlg::~CTabDlg()
    {
    delete p_FrameShowPic;
    delete p_ShowChartWnd;
    delete p_ResultWnd;
    }void CTabDlg::DoDataExchange(CDataExchange* pDX)
    {
    CFormView::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CTabDlg)
    //}}AFX_DATA_MAP
    }
    BEGIN_MESSAGE_MAP(CTabDlg, CFormView)
    //{{AFX_MSG_MAP(CTabDlg)
    ON_BN_CLICKED(IDC_MAINPIC, OnMainpic)
    ON_BN_CLICKED(IDC_PANECHART, OnPanechart)
    ON_BN_CLICKED(IDC_PANERESULT, OnPaneresult)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CTabDlg diagnostics#ifdef _DEBUG
    void CTabDlg::AssertValid() const
    {
    CFormView::AssertValid();
    }void CTabDlg::Dump(CDumpContext& dc) const
    {
    CFormView::Dump(dc);
    }
    #endif //_DEBUG/////////////////////////////////////////////////////////////////////////////
    // CTabDlg message handlers
    //extern CPicViewDoc *g_picviewDoc;
    void CTabDlg::OnMainpic() 
    {
    // TODO: Add your control notification handler code here
    if(!b_mainpicOpened)
    {
    p_FrameShowPic=new CShowPicFrmWnd();
    context_showpic.m_pNewViewClass=RUNTIME_CLASS(CShowPicView);
    context_showpic.m_pCurrentDoc=p_Doc;//new CPicViewDoc;//g_picviewDoc;
    p_FrameShowPic->LoadFrame(IDI_ICON1,WS_OVERLAPPEDWINDOW|WS_CHILD ,NULL,&context_showpic);
    p_FrameShowPic->ShowWindow(SW_SHOW); CRect rect;
    AfxGetMainWnd()->GetClientRect(rect);
    CRect DlgRect;
    GetClientRect(DlgRect);

    int width=rect.Width()-DlgRect.Width();
    p_FrameShowPic->MoveWindow(CRect(0,rect.top,width*3/5,rect.bottom/2));
    p_FrameShowPic->SetFocus();
    b_mainpicOpened=TRUE;
    }
    else
    {
    if(p_FrameShowPic->IsWindowVisible())
    {
    p_FrameShowPic->ShowWindow(SW_HIDE);
    }
    else
    {
    p_FrameShowPic->ShowWindow(SW_SHOW);
    p_FrameShowPic->SetFocus();
    }
    }
    }void CTabDlg::OnPanechart() 
    {
    // TODO: Add your control notification handler code here
    if(!b_ChartOpened)
    {
    p_ShowChartWnd=new CShowChartWnd;
    p_ShowChartWnd->LoadFrame(IDI_ICON1,WS_OVERLAPPEDWINDOW|WS_CHILD,NULL);
    p_ShowChartWnd->ShowWindow(SW_SHOW); CRect rect;
    AfxGetMainWnd()->GetClientRect(rect);
    CRect DlgRect;
    GetClientRect(DlgRect);

    int width=rect.Width()-DlgRect.Width(); p_ShowChartWnd->MoveWindow(CRect(width*3/5,rect.top,width,rect.bottom/2)); p_ShowChartWnd->SetFocus();
    b_ChartOpened=TRUE;
    }
    else
    {
    if(p_ShowChartWnd->IsWindowVisible())
    {
    p_ShowChartWnd->ShowWindow(SW_HIDE);
    }
    else
    {
    p_ShowChartWnd->ShowWindow(SW_SHOW);
    p_ShowChartWnd->SetFocus();
    }
    }
    }void CTabDlg::OnPaneresult() 
    {
    // TODO: Add your control notification handler code here
    if(!b_ResultOpened)
    {
    p_ResultWnd=new CResultViewFrmWnd();
    resultview_context.m_pNewViewClass=RUNTIME_CLASS(CResultListView);
    resultview_context.m_pCurrentDoc=p_Doc;//new CPicViewDoc;//g_picviewDoc;

    if(p_Doc==NULL)
    {
    AfxMessageBox("Doc is null");
    return;
    }
    p_ResultWnd->LoadFrame(IDI_ICON1,WS_OVERLAPPEDWINDOW|WS_CHILD ,NULL,&resultview_context);
    p_ResultWnd->ShowWindow(SW_SHOW);

    CRect rect;
    AfxGetMainWnd()->GetClientRect(rect);
    CRect DlgRect;
    GetClientRect(DlgRect);

    int width=rect.Width()-DlgRect.Width();
    p_ResultWnd->MoveWindow(CRect(0,rect.bottom/2,width,rect.bottom));
    p_ResultWnd->SetFocus();
    b_ResultOpened=TRUE;
    }
    else
    {
    if(p_ResultWnd->IsWindowVisible())
    {
    p_ResultWnd->ShowWindow(SW_HIDE);
    }
    else
    {
    p_ResultWnd->ShowWindow(SW_SHOW);
    p_ResultWnd->SetFocus();
    }
    }
    }
      

  2.   

    说明 首先要把 app里面对  CMultiDocTemplate *pDocTemplate1 = new CMultiDocTemplate(
    IDI_ICON1,
    RUNTIME_CLASS(CPicViewDoc),
    RUNTIME_CLASS(CShowPicFrmWnd), // custom MDI child frame
    RUNTIME_CLASS(CShowPicView));
    AddDocTemplate(pDocTemplate1);的声名去掉我的程序中的几个class CShowPicFrmWnd;class CShowChartWnd;
    class CResultViewFrmWnd;
    都是从CMDIChildWnd派生的子类,
    void CTabDlg::OnPanechart() 等函数就是生成相应窗口的函数
      

  3.   

    给你一个子类的代码
    #if !defined(AFX_SHOWPICFRMWND_H__F24D853C_0B18_42AA_8AAD_CDE230418C29__INCLUDED_)
    #define AFX_SHOWPICFRMWND_H__F24D853C_0B18_42AA_8AAD_CDE230418C29__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // ShowPicFrmWnd.h : header file
    ///////////////////////////////////////////////////////////////////////////////
    // CShowPicFrmWnd frameclass CShowPicFrmWnd : public CMDIChildWnd
    {
    DECLARE_DYNCREATE(CShowPicFrmWnd)
    public:
    CShowPicFrmWnd();           // protected constructor used by dynamic creation// Attributes
    public:// Operations
    public:// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CShowPicFrmWnd)
    //}}AFX_VIRTUAL// Implementation
    public:
    virtual ~CShowPicFrmWnd(); // Generated message map functions
    //{{AFX_MSG(CShowPicFrmWnd)
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_SHOWPICFRMWND_H__F24D853C_0B18_42AA_8AAD_CDE230418C29__INCLUDED_)
      

  4.   

    我这种方法就不需要文档模板了.CMainFrame::On子窗口1()
    {
            CCreateContext context;       CChildFrame *pFrmae = new CChildFrame;
           context.m_pNewViewClass = RUNTIME_CLASS(CMyView);
           
           context.的其它参数你可以根据需要再设置了.// show
         pFrame ->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW, this, &context);
         pFrame ->InitialUpdateFrame(NULL, TRUE);
    }
      

  5.   

    这样就可以了.你只需要写好你自己的视图类,框架若需要的话也可以自己写,否则就CChildFrame.