List Control的刷新闪烁,style为ICON,我重写了OnCustomDraw事件,每次刷新对于List的每个item都会调一次OnCustomDraw,这样产生严重的闪烁
双缓冲啊,绘图基本都这么干
给你一个类:
class CMemDC : public CDC
{
public:
CMemDC(CDC* pDC) : CDC()
{
m_pDC = pDC;
m_pOldBitmap = NULL;
pDC->GetClipBox(&m_rect);
CreateCompatibleDC(pDC);
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_pOldBitmap = SelectObject(&m_bitmap);
SetWindowOrg(m_rect.left, m_rect.top);
}
~CMemDC()
{
m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
this, m_rect.left, m_rect.top, SRCCOPY);
SelectObject(m_pOldBitmap);
}
CMemDC* operator->() {return this;}
operator CMemDC*() {return this;}
public:
CBitmap m_bitmap;
CBitmap *m_pOldBitmap;
CDC* m_pDC;
CRect m_rect;
};
你在你原来的程序里面这样就就可以了:
CRect rect;
pDC->GetClipBox(rect);
CMemDC dc(pDC);
dc.FillSolidRect(rect, RGB(255, 255, 255));
然后所有内容都画到dc上,而不要画到pDC上
就行了
-------------------------------------------------------------------------------------------------
试试下面的方法
在CDDS_PREPAINT阶段把list ctrl DC的bitblt到一个memory DC中,在custom draw的其它phase中把要draw的内容draw到memDC中,在最后一个item 的post phase阶段把memDC的内容复制给list ctrl DC.
不过我在使用custom draw定制list ctrl时,即使对每一个subitem都draw,也没有很严重的flicker;)