当频繁往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();
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调试通过