用实现在中使用背景位牛

菜谱 2021年09月06日

一、引言:

对于TreeView控件的背景位图的实现,目前介绍的文章比较少,有人虽然实现了,但是在点击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_leteObject();

HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),

LpszResource, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);

if( hbmp == NULL )

return FALSE;

m_tach( hbmp );

return TRUE;

}

3.2 为WM_PAINT加入消息句柄

void CMyTreeCtrl::OnPaint()

{

CPaintDC dc(this); // device context for painting

CRect rcclient;

GetClientRect(rcclient);

// create a compatible memory dc

CDC memdc;

eateCompatibleDC(dc);

CBitmap bitmap;

eateCompatibleBitmap(dc, dth(), ight());

lectObject( bitmap );

DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);

CDC maskdc;

eateCompatibleDC(dc);

CBitmap maskbitmap;

eateCompatibleBitmap(dc, dth(), ight());

lectObject( maskbitmap );

CBrush brush;

同捷科技被证监会否决说明该公司确实存在问题 eatePatternBrush(m_bitmap);

llRect(rcclient, brush);

tBlt(0,0,dth(), ight(),memdc,0,0,SRCAND);

tBlt(ft, p, dth(), ight(),

maskdc,ft, p,SRCCOPY);

}

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;

}查看本文来源

柳州哪家医院白癜风好
海口医院哪家治疗男科好
痛风怎么缓解疼痛
友情链接: 最全的凯里美食攻略