问题是这样的。我的程序是直接修改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);