有使用BCG库的朋友吗?有些问题不明白,想讨论一下。 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 问题是这样的。我的程序是直接修改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); 我觉得可能问题是在你让窗口浮动以后,生成的CMiniDockFrameWnd这里,这个窗口在创建的时候是不指定CW_CHILD这一style的。然而,在CFrameWnd中通知窗口浮动的函数是要检查是否是GW_CHILD解决的办法,在CMiniFrameWnd,创建后,再设置成为他的descendant.具体的代码和原因,可以看一下MFC下的BARDOCK.CPP源文件。 你可以看一下,李久劲的<深入浅出MFC>.里面对浮动和停靠窗口也有一些说明.另外,刚才忘记说让你看一下MFC中WinFrm2.cpp中的CFrameWnd::FloatControlBar 函数,和CFrameWnd::CreateFloatingFrame函数.看看里面的内容,对浮动和停靠会有一些认识. 如何检测对方 closesocket ? 问一个关于MFC和UML的问题,很简单但我不知道 向LPCWSTR转换求助 VC/Flash通信问题 COleDateTime转换成long型? 学习VC带来的的困惑 richedit控件的问题 怎么生成exe 数据转化为灰度图的小问题~~麻烦高手解决下 求助:在VC下调试控制台程序错误:DM0025,请高手指点如何解决? 》》》线程模型Single和Apartment有什么区别?? 在线等待!100相送!
虽然例子中有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);
解决的办法,在CMiniFrameWnd,创建后,再设置成为他的descendant.具体的代码和原因,可以看一下MFC下的BARDOCK.CPP源文件。