自绘CListBox时避免闪烁的方法。
先列出网上搜来的一段例子双缓冲绘制代码:
CRect rc;
GetWindowRect(&rc);
CDC CMDC;
CMDC.CreateCompatibleDC(NULL);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
CBitmap * oldbmp =CMDC.SelectObject(&bmp);
BITMAP bm;
bmp.GetBitmap(&bm);
CMDC.FillSolidRect(0,0,rc.Width(),rc.Height(),m_refdefbkColor);
// pDC为前端DC
pDC->bitBlt(0,0,rc.Width(),rc.Height(),&CMDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
CMDC.SelectObject(oldbmp);
bmp.DeleteObject();
CMDC.DeleteDC();
具体做法为:
1.onerasebkgnd直接返回TRUE.
2.DrawItem和OnPaint双缓冲自绘。
这样基本是不会闪烁的。
如果在删除Item的时候删除并且有scrollbar情况下删除完后背景不会被item重绘,可以考虑setcursel(getcount()-1),假如为删除最后一个item,
并且settopindex这样就不会闪烁了。
以上是我在做自绘clistbox中遇到闪烁情况的解决方法,这样处理后频繁的invalidate不会闪烁。