请问个位高手:CTreeView 中的CTreeCtrl的怎样设置背景图,而不是设置背景色,

解决方案 »

  1.   

    其实就是用背景图片填充CTreeView客户区
      

  2.   

    第一步.为View类添加一个变量 CBrush m_brushBackground;这个画刷就是用于画背景的。
    第二步.在View类的构造函数中加入如下代码: 
      CBitmap bmp;
      bmp.LoadBitmap(IDB_BITMAP); ///加载位图
      m_brushBackground.CreatePatternBrush(&bmp); ///创建位图画刷
    第三步.在OnDraw函数中画出来,代码如下: 
      CRect rect;
      GetClientRect(rect);///取得客户区域
      pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域
      

  3.   

    直接改变CTreeCtrl控件的背景图片,方法如下:一.原理:
    因为WINDOWS标准TREEVIEW控件不支持背景位图,所以如果需要设置背景位图就需要先让其在内存CDC对象上对TREEVIEW缺省绘图,然后在选择背景位图,与缺省位图合成,即采用贴图的方式,把标准的TREEVIEW窗口贴在底图上。这个操作在内存中完成。
    同时为了避免闪烁,必须重载OnItemexpanding和OnItemexpanded这两个函数。SetRedraw函数主要保证其不要在子树弹出时重画,而是子树已经扩展后重画。二.实现步骤:2.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;
    }
    2.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();
    }
    2.3处理tvn_itemexpanding void CMyTreeCtrl::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    SetRedraw(FALSE);
    *pResult = 0;
    }
    2.4处理tvn_itemexpanded void CMyTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    Invalidate();
    SetRedraw(TRUE);
    *pResult = 0;
    }
    2.5加入WM_ERASEBKGND消息处理函数既然我们在OnPaint()函数中处理位图并返回TRUE以保证默认的窗口进程不擦除背景,加入这个消息句柄可以避免额外的对客户区的刷新以减少闪烁。 BOOL CMyTreeCtrl::OnEraseBkgnd(CDC* pDC) 
    {
    return TRUE;
    }
      

  4.   

    多谢上面的兄弟,但问题在于,你上面的方法是给一个单独的CtreeCtrl 设置背景图,但从CTreeView 类中得到的CtreeCtrl 控件怎么改变呢,因为当CTreeView 创建时,CTreeCtrl就创建了,因此没有办法改变,不知上面的老兄是否同意我的看法,我觉得你上面的方法是不行的。
      

  5.   

    如何在树型控件中使用背景位图
    http://www.vckbase.com/document/viewdoc.asp?id=355
    作者:zhoudb下载本文源代码 一、引言:
    对于TREWVIEW控件的背景位图的实现,目前介绍的文章比较少,有人虽然实现了,但是在点击TREE时,背景闪动比较厉害。本人在参照别人代码的基础上,把它总结一下,同时解决了这个背景闪烁的问题。目前FLASHGET1.3版也实现了TREEVIEW的背景位图。大家可以参照一下。本文程序运行效果如下图:
      二、原理:
    因为WINDOWS标准TREEVIEW控件不支持背景位图,所以如果需要设置背景位图就需要先让其在内存CDC对象上对TREEVIEW缺省绘图,然后在选择背景位图,与缺省位图合成,即采用贴图的方式,把标准的TREEVIEW窗口贴在底图上。这个操作在内存中完成。
    同时为了避免闪烁,必须重载OnItemexpanding和OnItemexpanded这两个函数。SetRedraw函数主要保证其不要在子树弹出时重画,而是子树已经扩展后重画。 三、实现步骤: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;
    }
    (完)