【自绘ListBox,DrawItem中用双缓冲的奇怪现象!!!】

芊芊绝唱 2016-08-04 12:09:00
自绘ListBox要贴图,因为实现后拉动滚动条的时候闪烁非常严重,故用了双缓冲,结果绘制异常,显示的很乱。
所以特此写了一段测试代码,做了最简单的双缓冲,结果还是有问题,感觉是VS底层的实现问题吧

ListBox的属性是OwnerDrawVariable,代码如下:

void CSuperListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CRect rc = lpDrawItemStruct->rcItem;
CDC* pDc = (CDC *)CDC::FromHandle(lpDrawItemStruct->hDC);

CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(pDc);
MemBitmap.CreateCompatibleBitmap(pDc, rc.Width(), rc.Height());
CBitmap *pOldBit = MemDC.SelectObject(&MemBitmap);

if(lpDrawItemStruct->itemID % 2)
MemDC.FillSolidRect(rc,RGB(190,190,190));
else
MemDC.FillSolidRect(rc,RGB(255,255,255));
MemDC.SetTextColor(RGB(255,0,0));
MemDC.DrawText(_T("ABC"),rc,DT_LEFT);

pDc->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(),&MemDC, 0, 0, SRCCOPY);
}

效果图是:

而且很奇怪的是,我额外再Add了几项,使得有滚动条了,然后我拉动滚动条到最下面再拉回第一条,显示又正常了
...全文
339 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gz_qmc 2016-08-17
  • 打赏
  • 举报
回复
用别人得控件再去派生控件 不是明智的选择 要么不自绘,要自绘就自己设计数据结构
Eleven 2016-08-11
  • 打赏
  • 举报
回复
CBitmap *pOldBit = MemDC.SelectObject(&MemBitmap); .... 最后BitBlt()之后需要调用MemDC.SelectObject(pOldBit);
Jackxan 2016-08-10
  • 打赏
  • 举报
回复
CDC MemDC; CBitmap MemBitmap; 没有释放?
芊芊绝唱 2016-08-04
  • 打赏
  • 举报
回复
OnEraseBkgnd是return TRUE;的

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧