MDI程序,单击一个菜单项(假设为菜单a)弹出个FormView
因为是MDI程序,有很多view,我想让菜单a的FormView只创建一次,并且当再次单击菜单a时可以把它对应的FormView激活,请问如何实现?下面这个是创建View的函数
void CMainFrame::OnMemberManage() 
{
   m_pMemberManage = new CChildFrame();
   CCreateContext context;
   context.m_pNewViewClass=RUNTIME_CLASS(CMemManageView);
   if(!m_pMemberManage->LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW|FWS_PREFIXTITLE,this,&context))
return;
   m_pMemberManage->InitialUpdateFrame(NULL,TRUE);
   m_pMemberManage->ShowWindow(SW_SHOWMAXIMIZED);
}

解决方案 »

  1.   

    做个静态BOOL变量初始为false.第一次创建成功让它变成TURE.保持窗口句柄.void CMainFrame::OnMemberManage() 
    {  
      if(!bFlag)
         {
          m_pMemberManage = new CChildFrame();
          ...
          bFlag=true;
          保持句柄;
          }
        else
          SendMessage(WM_ACTIVE,(WPARAM)句柄,0) ;// 激活
    }关闭这个窗口时bFlag=false;
      

  2.   


    如何保持view的那个句柄呢?另外按照你说的那么每个view都要设置一个静态bool变量了
      

  3.   

    根据你的程序:
    可以,在构造函数中,初始化m_pMemberManage为NULL
    然后,在OnMemberManage函数中判断,IsWindow(),则直接显示,否则,创建VIEW先。
      

  4.   

    就是生成view后要返回一个句柄.把它保存起来.也就是做个静态变量来保存
      

  5.   

    先在构造函数初始化 m_pMemberManage =NULL;void CMainFrame::OnMemberManage() 
    {if(!m_pMemberManage ){
       m_pMemberManage = new CChildFrame();
       CCreateContext context;
       context.m_pNewViewClass=RUNTIME_CLASS(CMemManageView);
       if(!m_pMemberManage->LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW|FWS_PREFIXTITLE,this,&context))
    return;
       m_pMemberManage->InitialUpdateFrame(NULL,TRUE);
       m_pMemberManage->ShowWindow(SW_SHOWMAXIMIZED);
    }
    }
    else  m_pMemberManage->ShowWindow(SW_SHOWMAXIMIZED);
      

  6.   

    然后在CMemManageView中加入destory();
      

  7.   

    已经解决。
     fvv(守护者) 的方法应该是可行的,但是添加响应WM_CLOSE函数后老是提示错误
     采用了YunLion(静静的想) 和 cooldenny(丹の尼) 说的方法。
    在构造函数中初始化m_pMemberManage 为NULL,
    在MemManageView.cpp添加响应WM_DESTORY消息,把m_pMemberManage赋值为空
    ((CMainFrame *)AfxGetMainWnd())->m_pMemberManage = NULL;谢谢以上三位。