我将不同的CTreeCtrl动态挂接到一个控件中,每次在切换时,并不能将新挂接的CTreeCtrl正确显示,我一个个点击每个Item,点击到的Item刷新重绘显示正确了.我开始以为是这个控件容器没有进行背景重绘,于是我加了强制重绘的代码。结果重绘进行了,CTreeCtrl仍然如前。所以问题应该是CTreeCtrl自己没有正确重绘。所以如果找到CTreeCtrl绘制item的地方,应该就能找到其在什么情况下重绘,从而能找到在什么地方让CTreeCtrl的可见Items逐个刷新一次。请问哪位高手知道CTreeCtrl在什么地方逐条绘制每个item?

解决方案 »

  1.   


    控件客户区的绘制都是WM_PAINT触发的
      

  2.   

    乖乖,我说的是CTreeCtrl具体的重绘在哪,我还知道是WM_PAINT触发呢!我
    是半天都没找到的,拜托!帮看看CTreeCtrl源代码再说!
      

  3.   

    WM_PAINT中,依次调用你每个挂接上去的树
    m_treeCtrl->Invalidate();
    m_listCtrl->UpdateWindow();试试看!
      

  4.   

    对不起大家,问题我已经解决。问题出在挂接上新的CTreeCtrl后,原来的
    CTreeCtrl应该隐藏掉,不是新挂接的CTreeCtrl没有更新。
    bool DockPageBar::SetPage(CWnd *pWnd, LPCTSTR sText, UINT IconID)
    {
        ASSERT(IsWindow(pWnd->m_hWnd));
        uiPageItem *pItem = GetPageItem(sText);
        if (!pItem)
            return AddPage(pWnd,sText,IconID);    if (pItem->m_pWnd)
            pItem->m_pWnd->ShowWindow(SW_HIDE);    pItem->m_pWnd = pWnd;    ...
        ...    if(pWnd)
        {
            CRect rect;
            GetClientRect(rect, m_PageList.GetCount()>1?TRUE:FALSE);
            pWnd->MoveWindow(rect);
            pWnd->ShowWindow(SW_HIDE);
        }
        UpdateWindow();
        return true;
    }