树控件过于单调,请问如何给树控件(CTreeCtrl)加上背景图片?

解决方案 »

  1.   

    实现步骤:3.1 加入成员函数 BOOL CMyTreeCtrl::SetBKImage(LPCTSTR LpszResource)
    {
    if( m_bitmap.m_hObject != NULL )
    m_bitmap.DeleteObject();

    HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 
    LpszResource, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE); if( hbmp == NULL ) 
    return FALSE; m_bitmap.Attach( hbmp );
    return TRUE;
    }
    3.2 为WM_PAINT加入消息句柄 void CMyTreeCtrl::OnPaint() 
    {
    CPaintDC dc(this);

    CRect rcclient;
    GetClientRect(&rcclient); CDC memdc;
    memdc.CreateCompatibleDC(&dc);
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());
    memdc.SelectObject( &bitmap ); CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0); CDC maskdc;
    maskdc.CreateCompatibleDC(&dc);
    CBitmap maskbitmap;
    maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL);
    maskdc.SelectObject( &maskbitmap );
    maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), &memdc, 
    rcclient.left, rcclient.top, SRCCOPY); CBrush brush;
    brush.CreatePatternBrush(&m_bitmap);
    dc.FillRect(rcclient, &brush);

    memdc.SetBkColor(RGB(0,0,0));          
    memdc.SetTextColor(RGB(255,255,255));  
    memdc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),
                    &maskdc, rcclient.left, rcclient.top, SRCAND); dc.SetBkColor(RGB(255,255,255));
    dc.SetTextColor(RGB(0,0,0));
    dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), 
                 &maskdc, rcclient.left, rcclient.top, SRCAND);

    dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), 
                 &memdc, rcclient.left, rcclient.top,SRCPAINT);
    brush.DeleteObject();
    }
    3.3 处理tvn_itemexpanding void CMyTreeCtrl::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    SetRedraw(FALSE);
    *pResult = 0;
    }
    3.4 处理tvn_itemexpanded void CMyTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    Invalidate();
    SetRedraw(TRUE);
    *pResult = 0;
    }
    3.5 加入WM_ERASEBKGND消息处理函数既然我们在OnPaint()函数中处理位图并返回TRUE以保证默认的窗口进程不擦除背景,加入这个消息句柄可以避免额外的对客户区的刷新以减少闪烁。 BOOL CMyTreeCtrl::OnEraseBkgnd(CDC* pDC) 
    {
    return TRUE;
    }