唉。MDI的子窗口打开就覆盖前面打开的窗口这是因为ChildFrameBringWindowToTop()的原因。
你可以这样做:
给你的ChildFrame去掉WM_VISIBLE风格,
然后,再调SetWindowPos()放到一定的Z-ORDER就可以搞定了。
——:),不好意思,我自己没试:因为我不需要这样做,也许还有其他方法。

解决方案 »

  1.   

    偶不知道除了MDIActivate()外还有没有别的办法
      

  2.   

    erehw:
        不行啊,我这里没试成。poweruser: 
        
       MDIActivate()不是主窗口激活...的函数么?大家再帮我想想办法!
      

  3.   

    CMDIFrame::CreateNewChild(RUNTIME_CLASS(yourViewClass,IDR_YOURVIEW,yourMenu),
    弹出的子窗口在所有子窗口的后面,不过这个方法不提倡。
      

  4.   

    我这里给出一段单文档多视的切换代码,你用的是多文档(如果也用单文档多视,那就直接用了),也就是要列举一下文档了,没有其它的问题.
    CFrameWnd *pFrameWnd = NULL;
    CMDIChildWnd *pMDIActive = MDIGetActive() ;
    ASSERT ( NULL != pMDIActive );
    CDocument *pDoc = pMDIActive->GetActiveDocument();
    ASSERT_VALID ( pDoc ); POSITION pos = pDoc->GetFirstViewPosition();
    while ( NULL != pos )
    {
    CView *pView = pDoc->GetNextView(pos);
    if ( pView->IsKindOf ( pViewClass ) )//一个参数
    {
      pFrameWnd = pView->GetParentFrame();
      pFrameWnd->ActivateFrame( SW_SHOWNORMAL );//这里不可见
    return ;
    }
    } pFrameWnd = pTemplate->CreateNewFrame ( pDoc , NULL );
    if ( NULL == pFrameWnd ) return;
    pTemplate->InitialUpdateFrame( pFrameWnd , pDoc);
    为了排除闪烁的问题,不妨先让其不可见.顺便说一句,111222兄,为何要这么干呀?如果不是特殊需要,可以绕开这样的问题(比如在建视时就处理.)哟.
      

  5.   

    xyzboat:
            一艘小船兄,目前,这样创建新窗口后选回上一个试图的方法是肯定有闪烁的。
            创建视图的时候怎么处理?
      

  6.   

    TO:111222
    问题我解决了。实在不好意思。开始的时候我自己没去试。
    如下:
    void OnFileNew()
    {
       CDocument* pDoc = NULL;
      POSITION pos = GetFirstDocTemplatePosition();
      ASSERT(pos != NULL);
      
      CDocTemplate* pTemplate=NULL;
     
    pTemplate= GetNextDocTemplate(pos);         pDoc=pTemplate->OpenDocumentFile (NULL,false);
      
    pos = pDoc->GetFirstViewPosition ();
    CFrameWnd*  pFrame;
    CView * pView;
    pView =(CView*) pDoc->GetNextView (pos);
    pFrame=pView->GetParentFrame ();
    pFrame->ShowWindow (SW_SHOW);
    }我已经做了一个例子,如果需要的话,我有空上传到我的空间上去,现在不行,因为服务器出了问题,(怒)。http://www.erehw.com
      

  7.   

    问题我解决了。实在不好意思。开始的时候我自己没去试。
    如下:void CMyWinApp::OnFileNew()
    {
      CDocument* pDoc = NULL;
      POSITION pos = GetFirstDocTemplatePosition();
      ASSERT(pos != NULL);  CDocTemplate* pTemplate=NULL;    pTemplate= GetNextDocTemplate(pos);        pDoc=pTemplate->OpenDocumentFile (NULL,false);
      
        pos = pDoc->GetFirstViewPosition ();
        CFrameWnd*  pFrame;
        CView * pView;
        pView =(CView*) pDoc->GetNextView (pos);
        pFrame=pView->GetParentFrame ();
        pFrame->ShowWindow (SW_SHOW);
    }我已经做了一个例子,如果需要的话,我有空上传到我的空间上去,现在不行,因为服务器出了问题,(怒)。http://www.erehw.com 
    ____
    呀,GetFirstDocTemplatePosition()和GetNextDocTemplate()是CWinApp的成员函数。:D
      

  8.   

    erehw:
        
        多谢例子,小弟这就加分。
        不过还有一事不明,为什么用于CHtmlView导致CHtmlView无法初始化,不能加载WebBrowser控件呢?
         
        还有就是,我发现,我的这个程序根本没法实现窗口后台打开。可能是BCG界面库的TabCtrl的问题。
        因为我设置某个子窗口总在顶端
        SetWindowPos(&wndTopMost,0,0,0,0, SWP_NOSIZE|SWP_NOMOVE);
        结果是,无效。
        可能是TabCtrl有自动把新窗口带到顶端的属性的原因。  
        
      

  9.   

    你用了BCG类库?
    好,帮忙就做到底吧。虽然有点点忙。
    ——————————————————————————————————
    多几种办法,一是自己写一个类来实现CBCGMainClientAreaWnd的功能,我有这样的类,不过,界面上比不过BCG,那是好久以前的了。
    所以呢,在这里就不提了,因为BCG毕竟是功能很强大的了。
    第二个办法就是修改BCG类库,就不说那么多了,反正是修改CBCGMainClientAreaWnd。
    1、打开文件:BCGMainClientAreaWnd.h
    给CBCGMainClientAreaWnd增加一个成员变量:
    public:
    bool m_bBringToTopWhenOpened;//公有成员,偷懒了,不想写成员函数
    2、打开BCGMainClientAreaWnd.cpp
    修改三个地方:
    a、在CBCGMainClientAreaWnd::CBCGMainClientAreaWnd()中增加:
    {
    m_bBringToTopWhenOpened = true;
    }
    b、
    到文件是最底处,修改UpdateTabs()
    为: m_wndTab.SetActiveTab (m_wndTab.GetTabsNum () - 1);
    增加一个条件,改为://文件的363行左右
    if(m_bBringToTopWhenOpened)
    m_wndTab.SetActiveTab (m_wndTab.GetTabsNum () - 1);
    为最后几行:
    GetParentFrame ()->RecalcLayout ();
    同样也增加一个条件://约在文件的373左右,处于最底下。
    if(m_bBringToTopWhenOpened)
    GetParentFrame ()->RecalcLayout ();

    要说明的是,上面这一个条件,我看不到要加的必要,不过我现在是加上了这一个条件,测试了一下,没有发现什么问题。你也许需要将这一个条件不加测试一下,(我很懒,宁愿在这里多写几句,也懒得自己去测试了,不过我认为在这里没有多大问题的。)
    c、重新BUILD BCG类库3、用BCG向导建一个工程,在CMainFrame::OnCreateClient的最前面加上一条:
    m_wndClientArea.m_bBringToTopWhenOpened=false;
    4、如上我所说的,重装CWinApp::OnFileNew()
    void CBT2App::OnFileNew()
    {
    CDocument* pDoc = NULL;
      POSITION pos = GetFirstDocTemplatePosition();
      ASSERT(pos != NULL);
      
      CDocTemplate* pTemplate=NULL;
     
    pTemplate= GetNextDocTemplate(pos);  pDoc=pTemplate->OpenDocumentFile (NULL,false);
      
    pos = pDoc->GetFirstViewPosition ();
    CFrameWnd*  pFrame;
    CView * pView;
    pView =(CView*) pDoc->GetNextView (pos);
    pFrame=pView->GetParentFrame ();
    pFrame->ShowWindow (SW_SHOW);

    }5、OK。现在Build 工程。
    ——————————————————————————
    我做了一个小试验,你可以到我主页首页去下载。http://www.erehw.com
    地址也许是:http://www.erehw.com/tojoyue/bt2.rar
    (不过服务器经常坏。)
    在我的例子中,如果找不到cscommon.h请将这一句注释掉。
    同时可能还需要定义宏:
    #define chASSERT(x) ASSERT(x)
    #define chVERIFY(x) VERIFY(x)6、GOOD LUCK。
      

  10.   

    佩服的5体投地!
    我想改BCG,却不知道从何下手......
    无以言谢了,再来领分
      

  11.   

    http://www.csdn.net/expert/TopicView.asp?id=132170