这样的文档、框架、视图的问题,肯定都是老生长谈了,我们都知道文档和视图的关系是一对多关系。也做很久的项目了,可是还有些疑问没有解决。请各位DX讨论指点下。程序基本情况:MDI程序架构,一个文档对应多个视图。比如:CMyApp --> CMyDocument -->(CChartView/CChildFrme + CListView/CChildFrme + CFormView/CChildFrme ...),每个文档对应的视图有多个,每一类视图都有自己的菜单和工具栏。那么对于这样的实现,比较经典的做法是如何的?特开此贴总结一下以享各位朋友。假设Class有:
CMyApp
CMainFrame
CMyDocuemnt
CChartView
CListView
CFormView
CChildFrame1
CChildFrame2
CChildFrame3我对于多种视图的创建一般都是采用context,以及CChildFrame的LoadFrame来做。 CCreateContext context;

//CMyChildFrame* pMyChildFrame = new CMyChildFrame();
CRuntimeClass* pFrameClass = RUNTIME_CLASS(CMyChildFrame);
CMyChildFrame* pMyChildFrame =(CMyChildFrame*) pFrameClass->CreateObject();

context.m_pNewViewClass = RUNTIME_CLASS(CMyTestView); pMyChildFrame->LoadFrame(IDI_ICON1,WS_OVERLAPPEDWINDOW|FWS_ADDTOTITLE,this,&context); pMyChildFrame->InitialUpdateFrame(NULL,TRUE); 可对于菜单、工具栏切换我就不熟悉了。请各位DX稍微详细给出你的方法和示例代码,谢谢了!

解决方案 »

  1.   

    MDI的主菜单(MainFrame),没有打开任何子窗口(即文档模板)时是 IDR_MAINFRAME, 打开了文档模板就是 IDR_文档模板TYPE。可以利用这个MainFrame自动切换菜单的特性。 不足支持是需要 定义多个文档模板才会有更多的菜单切换。只想用一个文档模板的MDI, 可以利用MSDN中非常之语焉不详,几乎找不到记录的一个特性,就是 CDocument::GetDefaultMenu(); 重载这个函数就可以随心所欲的设定你想要的菜单。
      

  2.   

    楼上DX所说的GetDefaultMenu我已经试验过,确实是一个不错的方法进行针对MDI每个视图菜单的切换。代码示例如下:void CMDIAppDemoView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
    {
    /*
    Parameters
    bActivate
    Indicates whether the view is being activated or deactivated. pActivateView
    Points to the view object that is being activated. pDeactiveView
    Points to the view object that is being deactivated. */
    // TODO: Add your specialized code here and/or call the base class
    if (bActivate)
    {
    ((CMDIAppDemoDoc*)GetDocument())->m_hMyMenu = ::LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MDIAppDemoTYPE));
    CMainFrame* pMain = (CMainFrame*) AfxGetMainWnd();
    if (pMain)
    {
    pMain->OnUpdateFrameMenu(NULL);
    pMain->DrawMenuBar();
    }
    } CView::OnActivateView(bActivate, pActivateView, pDeactiveView);
    }
    比较关注的就是各位dX都是如何控制MDI框架下一个文档对应的多视图的创建呢?
      

  3.   

    当然需要重载函数CDocument::GetDefaultMenu()HMENU CMDIAppDemoDoc::GetDefaultMenu()
    {
    return m_hMyMenu;    // just use original default
    }