荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: littlebao (爱拼才会赢), 信区: Visual
标  题: 终于大功告成!!!!!!!!!!!!!!!!!!?
发信站: 荔园晨风BBS站 (Sun Aug 17 09:32:19 2003), 站内信件

昨晚百思不得其解之时我打算把CMainFrame的子窗口全部都列出来,但是令人疑惑的是
toolbar竟然也得不到,我在OnCreate()里看了好久,后来发现
只有在DockControlBar(&m_wndToolBar);之前调用
 m_wndToolBar.GetParent()得到的指针才是指向CMainFrame,
所以我觉得问题就出在这个DockControlBar()因为我的另外两个子窗口
也用到了这个函数,追踪了一下源代码,一切真相大白,调用过程如下

(1)
DockControlBar(&m_wndToolBar);

(2)
void CFrameWnd::DockControlBar(CControlBar* pBar, UINT nDockBarID, LPCRECT
lpRect)
{
        CDockBar* pDockBar = (nDockBarID == 0) ? NULL :
                (CDockBar*)GetControlBar(nDockBarID);
        DockControlBar(pBar, pDockBar, lpRect);
}

(3)
void CFrameWnd::DockControlBar(CControlBar* pBar, CDockBar* pDockBar, LPCRECT
lpRect)
{
.........
pDockBar->DockControlBar(pBar, lpRect);
}

(4)
void CDockBar::DockControlBar(CControlBar* pBar, LPCRECT lpRect)
{

........
if (pBar->GetParent() != this)
        pBar->SetParent(this);//就是在这里做了偷梁换柱的勾当,断绝了父子关系
}

所以我把代码改成如下就行了:

CMainFrame * pFrame = (CMainFrame*)GetParent() ;
CCoolBar   *pCoolBar = &pFrame->m_wndCoolBar2 ;
CWnd *pwnd = (CWnd*)pCoolBar->GetWindow(GW_CHILD) ;
CWnd *pChild = NULL ;

if(pwnd)
{
        MessageBox("ok") ;
        if(pwnd->IsKindOf(RUNTIME_CLASS(CFolderFrame)))

        {
                MessageBox("ok2") ;
                pChild = pwnd->GetWindow(GW_CHILD) ;
                while(pChild)
                {
                if(pChild->IsKindOf(RUNTIME_CLASS(COutPutTabView)))
                {
                        MessageBox("success") ;
                        break ;
                }
                pChild = pChild->GetNextWindow() ;
                }
        }

}

最后要多谢oopilix为我了提供这么一个方案。










--
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 61.144.235.40]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店