none
如何创建一个多顶层文档MTI的MDI程序 ? RRS feed

  • 问题

  • MTI程序实际上是一个多Frame的SDI程序,创建这样一个程序很简单,直接用代码生成,然后自己管理新生成的Frame,并且在Mainframe关闭时,动态改变theApp.m_pMainWnd 指针指向的框架就可以使程序在所有顶层框架关闭后才退出,而不再区分主顶层框架和子顶层框架.

    一个没有主框架的SDI多顶层MTI我的具体的做法是

    在CWinApp 中加一个CPtrList,在新生成Frame时把它加入到这个List,在关闭CMainFrame时检测是不是关闭的theApp.m_pMainWnd ,如果是就用队列中的框架替换这个指针,不是就把它移出队列.

    可这样的做法在MDI程序中不行了,我发现所有的消息都只发给theApp.m_pMainWnd ,而不是当前子框架的父框架.

    我是这样创建一个MDI的MTI程序的,

    在派生的WinApp中加入属性:
     CMultiDocTemplate *m_pMultiDocTemplate;
     CPtrList   m_pFrameList;

    在创建新窗口时:

     

    CMainFrame *pMainFrame2 = new CMainFrame;
     if ((!pMainFrame2 )||(!pMainFrame2->LoadFrame(IDR_MAINFRAME)))
     {
     delete pMainFrame2;
     }else{
     theApp.m_pMainWnd = pMainFrame2; //在这里改变了主框架的指针,不然无法在新框架中创建子框架
     CDocument* pDoc = theApp.m_pMultiDocTemplate->CreateNewDocument();
     CFrameWnd* pChildFrame = theApp.m_pMultiDocTemplate->CreateNewFrame(pDoc,pMainFrame2);
    
     theApp.m_pMultiDocTemplate->InitialUpdateFrame(pChildFrame,pDoc);
    
     CView* pView =(CView*) pChildFrame->GetActiveView();
     theApp.m_pFrameList.AddTail(pMainFrame2);
    
     }
    
    

    在CMainframe的WM_CLOSE事件中判断,

     CMainFrame* pMainFrame = (CMainFrame*)theApp.m_pMainWnd;
    
     if((pMainFrame != NULL )&& (pMainFrame->GetActiveFrame() != GetActiveFrame()))
     {
     for (int i = 0;i<theApp.m_pFrameList.GetCount();i++)
     {
      POSITION pos = theApp.m_pFrameList.FindIndex(i);
      CMainFrame* pFrame = (CMainFrame*)theApp.m_pFrameList.GetAt(pos);
      if((pFrame == NULL)||(!::IsWindow(pFrame->GetSafeHwnd()))) continue;
      if (pFrame->GetActiveFrame()!= GetActiveFrame()){
    
      theApp.m_pMainWnd = pFrame;
      TRACE(_T("改变主框架指针!"));
      break;
      }
    
     }
     }
    
     POSITION pos = theApp.m_pFrameList.Find(this);
     if(pos != NULL){
     theApp.m_pFrameList.RemoveAt(pos);
     }
    
    

    这样子的做法的确可以创建一个新窗口了,但关键在于我得在创建新框架时就把它作为theApp.m_pMainWnd并且在CMainFrame的WM_ACTIVE事件处理中加入
    theApp.m_pMainWnd = this;


    好象一个MDI框架把所有的消息都是转给了theApp.m_pMainWnd,其它的框架收不到消息.

    特别是这句好象没有用:
     CFrameWnd* pChildFrame = theApp.m_pMultiDocTemplate->CreateNewFrame(pDoc,pMainFrame2);

    在这里我指定了新生成的ChildFrame的父框架,可是View却只在theApp.m_pMainWnd中创建,总不能一直不停的在激活框架时改变程序的主框架指针吧?

    正确的方法应该是什么呢?

    PASS:另IE9的子窗口可以拉出成为一个新框架,这是怎么实现的呢?还有另的框架的子窗口可以拉入到另一个框架中,我真是没有搞明白.

    2010年12月4日 5:11

答案

全部回复

  • 还有一个问题就是关闭时,好象调用了CloseAllDocument,把所有文档全关闭了.

    类似于IE这种框架的是如何生成的呢?

    2010年12月4日 5:47
  • 主要是有的人不喜欢MDI选项卡,有的人又喜欢,想要做一个能两个都支持的,搞了几天没有搞定.求大大们解疑呀!!!!
    2010年12月4日 5:51
  • Hi 浪人獠牙,

    欢迎来MSDN论坛。

    能否把你的工程发给我,或提供更多的sample code,让我可以重现你的问题,给予更好的答案。

     

    谢谢!

    Lucy

    2010年12月7日 7:36
    版主