100分求教,ListCtrl 闪烁的问题!

水瓶座雨夕 2012-04-11 11:39:34
初学者请教各位高手。

遇到的问题是这样的:

我要用MFC做一个类似好友列表的样子,左侧是头像,右侧上部分是名称,右侧下部分是一张图片。就像QQ的好友列表样子

我用DrawItem自绘,绘制的都没有问题。现在遇到的是 当我在中间插入一条或删除一条的时候整个控件都会闪1 2下。还有就是,当我点击一条信息的时候(点击时我在DrawItem里给它加入了一个背景表示选中状态),也会闪。

我在调试的时候发现,当我插入信息的时候 DrawItem好像全部重新画了一遍。 请教各位高手,该如何解决。


程序大概是这样。主对话框上放了一个子对话框,ListCtrl控件在子对话框中。
//插入信息

//主对话框插入信息到ListCtrl
pListCtrl->InsertItem(i, _T(""), -1); //i 表示插入的位置
pListCtrl->SetItemData(i, (DWORD)pUser);



//DrawItem

…………
pDC = GetDC();

…………
bSelect = (lvi.state & LVIS_DROPHILITED) ||
((lvi.state & LVIS_SELECTED) &&
((GetFocus() == this) || (GetStyle() & LVS_SHOWSELALWAYS)));//判断是否选中
if(bSelect )
{
pDC->FillRect(&rc, &CBrush(RGB(255,234,203)));// 如果选中,改变选中项背景颜色,表示选中
}
else
{
if(nItem%2) //相邻行不同颜色
{
pDC->SetTextColor(RGB(0,0,0));
pDC->FillRect(&rcBounds,&CBrush(m_colRow2));
}
else
{
pDC->SetTextColor(RGB(0,0,0));
pDC->FillRect(&rcBounds,&CBrush(m_colRow1));
}
}

…………

SelectObject(pDC->GetSafeHdc(),GetStockObject(DEFAULT_GUI_FONT));
pDC->SetBkMode(TRANSPARENT);

::DrawText(pDC->GetSafeHdc(), strName, strName.GetLength(), &rect, uFormat);

…………
Graphics g(pDC->GetSafeHdc());

g.DrawImage(&img,RectF(1,1,38,38),0,0,img.GetWidth(),img.GetWidth(),UnitPixel);

…………
ReleaseDC(pDC);



我把一些设置、提取资源这些都省略了,麻烦各位高手帮忙看下,是哪里的问题?
我查过一些资料,说要利用SetRedraw来做,我尝试着加了 但是没什么效果,不知道我是不是加的位置不对?应该加在什么位置上?
...全文
300 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
水瓶座雨夕 2012-04-14
  • 打赏
  • 举报
回复
感谢各位的回答,确实是没怎么用过这个控件 还是应该先学原理,谢谢各位了 结贴
GPoint 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
引用 11 楼 的回复:
引用 10 楼 的回复:
感谢各位回答,我在DrawItem中用双缓冲绘制后显示正常,单击也不会闪烁,但是的那个插入信息或删除信息的时候还是会闪一下,应该是当信息加入或删除时 所有信息都重画了一遍。这样有什么好办法能解决吗?还有就是我在OnEraseBkgnd中绘制了每一行的颜色,这样是不是也会影响闪烁?
OnEraseBkgnd中只返回true
把所有绘制相关的……
[/Quote]

这个方法应该没问题。禁止背景重绘。很多空间的闪烁都是因为背景重绘导致的。闪烁说明重绘前和重绘后的图形差距 很大。禁止背景重绘和床缓冲是消除闪烁的俩个方法。楼主前面的说会闪烁俩次,我认为其中一起闪烁是由于背景重绘引起的。
zhllxt 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 10 楼 的回复:
感谢各位回答,我在DrawItem中用双缓冲绘制后显示正常,单击也不会闪烁,但是的那个插入信息或删除信息的时候还是会闪一下,应该是当信息加入或删除时 所有信息都重画了一遍。这样有什么好办法能解决吗?还有就是我在OnEraseBkgnd中绘制了每一行的颜色,这样是不是也会影响闪烁?
OnEraseBkgnd中只返回true
把所有绘制相关的代码都整理到DrawItem……
[/Quote]

请参照这个意见,我可以明确的告诉你,你这样做就解决了你的问题了,原理你都没搞清楚。你就这样做,多了你就知道是怎么回事了。
水瓶座雨夕 2012-04-12
  • 打赏
  • 举报
回复
感谢回复,我尝试了
CWnd::SetRedraw(FALSE);
...
CListCtrl::InsertItem(...);
CListCtrl::SetItemText(...);
CWnd::SetRedraw(TRUE);

还是老样子,我在删除、插入信息的时候 好像是每个Item都重新绘制了一遍...不知道我理解的对不对...
水瓶座雨夕 2012-04-12
  • 打赏
  • 举报
回复
感谢回复,我按照你说的尝试了一下,现在的情况是 有Item的行带有颜色,没有项的地方都是白色的...而且还是有明显的刷新 当有消息被删除的时候 每个项都被重新绘制了一遍 这种情况是正常的吗?
longgogo 2012-04-12
  • 打赏
  • 举报
回复
双缓冲加区域控制
Eleven 2012-04-12
  • 打赏
  • 举报
回复
CWnd::SetRedraw(FALSE);
...
CListCtrl::InsertItem(...);
CListCtrl::SetItemText(...);
CWnd::SetRedraw(TRUE);

这样试试
向立天 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
感谢各位回答,我在DrawItem中用双缓冲绘制后显示正常,单击也不会闪烁,但是的那个插入信息或删除信息的时候还是会闪一下,应该是当信息加入或删除时 所有信息都重画了一遍。这样有什么好办法能解决吗?还有就是我在OnEraseBkgnd中绘制了每一行的颜色,这样是不是也会影响闪烁?
[/Quote]OnEraseBkgnd中只返回true
把所有绘制相关的代码都整理到DrawItem中
gold_water 2012-04-11
  • 打赏
  • 举报
回复
局部刷新,只刷新改动的区域,是不是会好一点。
水瓶座雨夕 2012-04-11
  • 打赏
  • 举报
回复
感谢各位回答,我在DrawItem中用双缓冲绘制后显示正常,单击也不会闪烁,但是的那个插入信息或删除信息的时候还是会闪一下,应该是当信息加入或删除时 所有信息都重画了一遍。这样有什么好办法能解决吗?还有就是我在OnEraseBkgnd中绘制了每一行的颜色,这样是不是也会影响闪烁?
水瓶座雨夕 2012-04-11
  • 打赏
  • 举报
回复
感谢各位的回答,我尝试了各位的建议,还要请教一下在DrawItem中如何用双缓冲来绘制呢?我用双缓冲绘制出来的都是黑屏的。
zhllxt 2012-04-11
  • 打赏
  • 举报
回复
我看你的代码中用到了GDI+的函数,我也是见过你这样的问题,解决办法就是用双缓冲,我的理解所谓双缓冲就是:
本来有个pDC,我们写文字画图的时候直接用的pDC->DrawText,pDC->BitBlt等函数,这可以说成就是单缓冲。
而双缓冲呢,就是再造个CDC MemDC;然后MemDC.CreateCompatibleDC(pDC);这个CDC造完之后呢,把所有的写文字画图等操作都放在这个MemDC上,MemDC.DrawText,MemDC.BitBlt函数等。
等到所有的文字图形都画到这个MemDC上以后,再直接一次性用pDC->BitBlt(x,y,w,h,&MemDC.... 把你前面所有画在MemDC上的文字图形等一次性的画到你真正的显示DC也就是pDC上。

我在实际是发现的一个问题GDI+贴图的时候必须用双缓冲,否则显示时会出现问题。
nyb 2012-04-11
  • 打赏
  • 举报
回复
http://blog.csdn.net/mynamelj/article/details/6571383
lgstudyvc 2012-04-11
  • 打赏
  • 举报
回复
楼上们说的对呀
hurryboylqs 2012-04-11
  • 打赏
  • 举报
回复
要双缓冲来画
j8daxue 2012-04-11
  • 打赏
  • 举报
回复
给listctrl加上LVS_EX_DOUBLEBUFFER扩展样式
三条猫 2012-04-11
  • 打赏
  • 举报
回复
用双缓冲,在DrawItem的时候先绘制到缓冲CDC上,在拷贝到GetDC上。
另外要提高效率得自己控制绘制区域,在绘制代码里面加上是否和当前刷新的区域相交,相交才绘制

15,979

社区成员

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

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