例如有CView1,对应菜单Cmenu1,Cview2对应菜单cMenu2,如何在激活cview1的时候,菜单为cmenu1,激活cview2的时候,菜单为cmenu2

解决方案 »

  1.   

    CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(
    IDR_MDITESTYPE,//指明了用到的资源
    RUNTIME_CLASS(CMDITestDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CMDITestView));
    AddDocTemplate(pDocTemplate);
      

  2.   


    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CSDI_Two_DocDoc),
    RUNTIME_CLASS(CMainFrame),       // main SDI frame window
    RUNTIME_CLASS(CSDI_Two_DocView));
    AddDocTemplate(pDocTemplate);
    CSingleDocTemplate* pDocTemplate2;
    pDocTemplate2=new CSingleDocTemplate(
      IDR_MENU_EDITVIEW,
      RUNTIME_CLASS(CSDI_Two_DocDoc),
      RUNTIME_CLASS(CEditFrame),
      RUNTIME_CLASS(CWriteEdit));
    AddDocTemplate(pDocTemplate2);
      

  3.   

    如果每个视图是对应于不同的文档的话MFC已经有很好的实现。如果不是对应于同一文档的话。参照一下MFC的中下面这个函数的原代码:
    (在WinMDI.cpp中)
    CMDIChildWnd::OnUpdateFrameMenuOnUpdateFrameMenu(BOOL bActivate, CWnd* pActivateWnd,HMENU hMenuAlt)
      

  4.   

    psusong(人类失去指针,世界将会怎样?) 说的对。
      

  5.   

    to: psusong(人类失去指针,世界将会怎样?) 
    我在*.cpp文件中按照您的方法定义了文档莫板,如下:
    //〉〉〉〉〉〉〉〉〉〉〉〉〉〉
    CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(
    IDR_DFDFMETYPE,
    RUNTIME_CLASS(CDfdfmenuDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CDfdfmenuView));
    AddDocTemplate(pDocTemplate); CMultiDocTemplate* pDocTemplate1;
    pDocTemplate1 = new CMultiDocTemplate(
    IDR_MENU1,
    RUNTIME_CLASS(CDfdfmenuDoc),
    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
    RUNTIME_CLASS(CTestEdit));
    AddDocTemplate(pDocTemplate1);
    //《〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈
    然后切换视图,如下:
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    void CMainFrame::SwitchView(enum eview nview)
    {
    CView* pOldView=GetActiveView();
    CView* pNewView=(CView*)GetDlgItem(nview);
    if(pNewView==NULL)
    {
    switch(nview)
    {
    case TEST:
    pNewView=(CView*)new CTestEdit;
    break;
    case TETET:
    pNewView=(CView*)new CDfdfmenuView;
    break;

    }

    CCreateContext context;
    context.m_pCurrentDoc=pNewView->GetDocument();
    pNewView->Create(NULL,NULL,WS_BORDER,CFrameWnd::rectDefault,
    this,nview,&context);
    pNewView->OnInitialUpdate();
    }

    SetActiveView(pNewView);
    pNewView->ShowWindow(SW_SHOW);
    if(pOldView!=NULL)
    {
    pOldView->ShowWindow(SW_HIDE);
    pOldView->SetDlgCtrlID(pOldView->GetRuntimeClass()==RUNTIME_CLASS(CTestEdit)?TEST:TETET);
    }

    pNewView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    RecalcLayout();
    }
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    可是菜单还是切换不过来,而且视图的刷新也有问题,麻烦你帮我看一下,好吗?如果方便,请留下邮箱,我把程序发给你,很急的,谢谢!
      

  6.   

    为什么要把菜单去掉呢,不符合界面学原则.如果一个菜单不能使用,应该是灰掉,而不是移走.在appwizard里面,把菜单响应事件写在视图类里面,这样当选中别的视图时,菜单自动灰掉.你不用写一行代码
    你有见VC将哪个菜单项移走吗
      

  7.   

    看来你用的是分隔窗口,这样用psusong(人类失去指针,世界将会怎样?) 方法是不行的,因为那样能成功的前提是你使用不同的文档模板,也就是说两次调用new CMultiDocTemplate时第二个参数RUNTIME_CLASS(CDfdfmenuDoc),应该是不同的,你这样试吧,在你的各个view类中添加OnActivate消息处理函数,如下:
    CMyView::OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized )
    {
        if(窗口被激活)
            GetParentFrame->OnUpdateFrameMenu(m_hmymenu);
    }