当频繁往listbox里插入删除数据时,会出现闪烁的情况,这时就需要重绘listbox,当然还是用到双缓冲技术,代码如下:
//重载OnEraseBkgnd
BOOL CMyListBox::OnEraseBkgnd(CDC* pDC)
{
//直接返回,不重绘背景
return TRUE;
}

//重载OnPaint
void CMyListBox::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect(&rect); 
CDC MemDC;//内存DC
CBitmap MemBmp;
MemDC.CreateCompatibleDC(&dc);
MemBmp.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
MemDC.SelectObject(&MemBmp);
//这时创建的位图只是一张黑色的纸
//先画上背景
MemDC.FillSolidRect(rect, RGB(255, 255, 255));
//再画上图形
//这一句是调用默认的OnPaint(),把图形画在内存DC表上
DefWindowProc(WM_PAINT, (WPARAM)MemDC.m_hDC, (LPARAM)0); 
//输出
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);
MemDC.DeleteDC();
MemBmp.DeleteObject(); }
其中DefWindowProc比较关键,wParam的值是要绘图的DC,查下MSDN里的WM_PAINT就知道了。
以上代码在WINDOWS XP VC6.0调试通过
本文介绍了一种使用双缓冲技术来解决Listbox在频繁插入删除数据时出现闪烁问题的方法。通过重载OnEraseBkgnd和OnPaint函数,并利用内存设备上下文(DC)进行绘图,有效避免了闪烁现象。
904

被折叠的 条评论
为什么被折叠?



