如题

解决方案 »

  1.   

    问题是这样的。我的程序是直接修改BCG中BCGDevStudioExample,但是想把其中的OutPut修改成和VC6中的效果一样,但是又希望,每个Tab中不是放入List控件,而是一个从CScollView继承下来的View.
    虽然例子中有TabbedView和XMLSetting,但是TabbedView中用的是CBCGPTabView可以使用View
    利用文档试图结构创建的,不能够实现停靠的功能,而XMLSetting的哪个是从
    CBCGPDockingControlBar继承下来,但是Tab里面放入的是控件,而不是View现在我自己做了修改。BCGDevStudioExample里面的COutputViewBar类中加入变量
               CBCGPTabWnd m_wndTabs;
    在COutputViewBar里的OnCreate()里加入这些.加入这些后是可以实现可停靠,而且View也可以接受MainFrame的菜单命令。但是如果加入两个Tab,而且在浮动的,在Tab间互相切换就会出现问题。我跟踪到是CView里面的一个ASSERT(IsChild(wnd,View));出现问题,这个ASSERT要验证当前点击的View是否是主窗口的子窗口。但是我不明白的是。虽然
    浮动的时候,创建的是CMiniFrameWnd的是View的父窗口,但是这个CMiniFrameWnd的父窗口不也是MainFrame吗?那按道理被点击的View也是MainFrame的子窗口才对呀。
    为什么这个地方就不对了呢?不然用spy++看看。
       CView* pView = DYNAMIC_DOWNCAST (CView, RUNTIME_CLASS(CTestView).CreateObject ());
      ASSERT_VALID (pView);
             CDocument* pDoc = DYNAMIC_DOWNCAST (CDocument, RUNTIME_CLASS(CTestDoc).CreateObject ());
              CCreatContext nContext;
              nContex.m_pNewViewClass =RUNTIME_CLASS(CTestView);
              nContex.m_pCurrentDoc =pDoc;
              nContex.m_pCurrentFrame =(CFrameWnd*)AfxGetMainWnd();
              if(!pView->Create (NULL, _T(""), WS_CHILD | WS_VISIBLE,
    CRect (0, 0, 0, 0), &m_wndTabs,     (UINT) -1, nContext))
         if (pDoc != NULL)
    {
    ASSERT_VALID (pDoc);
    BOOL bFound = FALSE;
    for (POSITION pos = pDoc->GetFirstViewPosition (); !bFound && pos != NULL;)
    {
    if (pDoc->GetNextView (pos) == pView)
    {
    bFound = TRUE;
    }
    } if (!bFound)
    {
    pDoc->AddView (pView);
    }
    } m_wndTabs.InsertTab (pView, "Test", -1);
      

  2.   

    我觉得可能问题是在你让窗口浮动以后,生成的CMiniDockFrameWnd这里,这个窗口在创建的时候是不指定CW_CHILD这一style的。然而,在CFrameWnd中通知窗口浮动的函数是要检查是否是GW_CHILD
    解决的办法,在CMiniFrameWnd,创建后,再设置成为他的descendant.具体的代码和原因,可以看一下MFC下的BARDOCK.CPP源文件。
      

  3.   

    你可以看一下,李久劲的<深入浅出MFC>.里面对浮动和停靠窗口也有一些说明.另外,刚才忘记说让你看一下MFC中WinFrm2.cpp中的CFrameWnd::FloatControlBar 函数,和CFrameWnd::CreateFloatingFrame函数.看看里面的内容,对浮动和停靠会有一些认识.