各位好,我重载树控件CTreeCtrl类,想让树控件的背景透明化,这个要怎么实现呢?之前没有做过,类似的资料也比较少。 我尝试在OnCtlColor中用pDc->SetBkMode(TRANSPARENT)去设置,但是好像树控件并不支持。MFC CTreeCtl 树 背景透明

解决方案 »

  1.   

    OnCtlColor中用pDc->SetBkMode(TRANSPARENT);树控件是用不了的。
    你可以重载CTreeCtrl类,添加WM_ERASEBKGND消息,在消息响应函数里面实现。
      

  2.   

    在vc++的教程中发现,树形结构中有个tv_item,其中一项是mask 解释是:结构成员有效性屏蔽位,不知道是用来干什么的。也不知怎么用啊。,能给讲讲吗
      

  3.   

    这个我也想知道,我想给树控件换个背景图,最起码也是透明的,查了资料是要重载CTreeCtl类,但是具体怎么搞,求指教
      

  4.   

    回复下2楼“OnCtlColor中用pDc->SetBkMode(TRANSPARENT);树控件是用不了的。
    你可以重载CTreeCtrl类,添加WM_ERASEBKGND消息,在消息响应函数里面实现。” 在OnEraseBKgnd里我也试过了,没有效果,背景还是不透明,请问有什么别的方法,指教一哈?
      

  5.   

    这个比较麻烦。
    思路是,搞个 memDC ,让树先 paint 到这个 memDC (DefWindowProc(WM_PAINT,,,),
    然后 把 树的 背景图 加上 去 (SCR_AND)
      

  6.   


    在网上刚看到一段代码,贴出来:
    void CMyTreeCtrl::OnPaint()
    {
        CPaintDC dc(this); // device context for painting
        // TODO: 在此处添加消息处理程序代码
        // 不为绘图消息调用 CTreeCtrl::OnPaint()
        CDC dcMem;
        CClientDC dcParent(GetParent());
        dcMem.CreateCompatibleDC(&dcParent);
        dcMem.SelectObject(theBmp);
        dc.SelectObject(GetStockObject(HOLLOW_BRUSH));
        dc.SelectObject(theFont);
        dc.SetBkColor(CLR_NONE);
        dc.SetBkMode(TRANSPARENT);
        CRgn rgn;
        rgn.CreateRectRgnIndirect(&m_rcClient);
        dc.SelectClipRgn(&rgn);
        dc.BitBlt(0,0,m_rcClient.right,m_rcClient.bottom,&dcMem,m_rcWindow.left,m_rcWindow.top,SRCCOPY);
        HTREEITEM hItem=GetFirstVisibleItem();
        HTREEITEM hItemTmp=hItem;
        RECT rcItemText;
        CString strItem;
        do
        {
            if (!hItem)
            {
                break;
            }
            hItemTmp=hItem;
            GetItemRect(hItem,&rcItemText,FALSE);
            strItem=GetItemText(hItem);
            rcItemText.left+=m_nItemTextMargin;
            rcItemText.right+=m_nItemTextMargin;
            while (hItemTmp=GetParentItem(hItemTmp))
            {
                rcItemText.left+=GetIndent();
                rcItemText.right+=GetIndent();
            }
            rcItemText.left-=m_nLeftMargin;
            rcItemText.right-=m_nLeftMargin;
            dc.DrawText(strItem,&rcItemText,DT_LEFT|DT_SINGLELINE|DT_VCENTER);
        } while(hItem=GetNextVisibleItem(hItem));
    }源码地址:http://www.cnblogs.com/xuesongshu/archive/2013/03/21/2972593.html我试了下,没有效果,树控件我是用动态创建的,不懂跟其他地方还有没有关系。
      

  7.   

    http://www.cnblogs.com/xuesongshu/archive/2013/03/21/2972593.html
      

  8.   

        PostMessage(Parent_Hwnd, WM_PrintClient, DC, prf_Client);
    WM_PrintClient 消息可以把Parent_Hwnd的内容绘制到 DC中~~
      

  9.   

    参考:BOOL cTree::OnEraseBkgnd(CDC* pDC) 
    {
    CRect rc;
    GetClientRect(&rc);
    CDC MemDC;
    MemDC.CreateCompatibleDC(pDC);
    HBITMAP hBmp=(HBITMAP)MemDC.SelectObject(m_bitmap.m_hObject);
    pDC->StretchBlt(0,0,rc.Width(),rc.Height(),&MemDC,0,0,320,240,SRCCOPY);
    // set back
    (HBITMAP)MemDC.SelectObject(hBmp);
    // free
    DeleteObject(MemDC);
    //
    return TRUE;
    }
    //
    void cTree::OnPaint() 
    {
    CPaintDC dc(this);
    // get size
    CRect rc;
    GetClientRect(&rc);
    // Create a compatible memory DC 
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    // Select a compatible bitmap into the memory DC
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap( &dc, rc.Width(), rc.Height());
    HBITMAP oldBmp=(HBITMAP)memDC.SelectObject(&bitmap);
    // Let the control draws the tree.
    DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0 );
    // 'and' to the background
    dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCAND);
    // set back
    memDC.SelectObject(oldBmp);
    // free
    DeleteObject(bitmap.m_hObject);
    DeleteObject(memDC);
    }
    //其中: CBitmap m_bitmap;
    是 Tree的 背景位图。