Invalidate()语句所引起的画面闪烁

kidd3000 2010-11-08 05:07:38
我在MFC对话框里,先添加了一个图片。使用OnEraseBkgnd函数来设置了背景图片(纯蓝色),然后在OnCtlColor中设置静态控件的背景颜色(这样静态控件的颜色与背景颜色一样了,看起来就好像是文字在背景图上),可是因为静态控件的文字一变化,就会重叠,本来我是用Invalidate()来解决这个问题的,但是会闪烁。如何才能消除闪烁呢?网上说可以用双缓冲
的方法,http://www.vckbase.com/document/viewdoc/?id=1612 。。例如这个。。。
可是虽然原理我明白,但是还是不太懂,我对图形的问题一直很差,双缓冲在哪里搞的啊,是在Onpaint()里面还是在哪里的啊,能否有高手能够把此种方法说得清楚些呢,或者告诉我其它的方法来消除闪烁。
最好给个例子,只要有背景图片,然后再来个静态文本,当文本的文字变化时(会变化十几次以上的),如何不闪烁且又文字不重叠的呢?菜鸟求教~下面有一个例子,可是我看不明白。能否来点简单的例子呢……



void CCustomInputDialog::OnPaint()
{
CPaintDC dc(this);

CDC memDC;

memDC.CreateCompatibleDC(&dc);

memDC.SelectObject(&m_bgbmp);

CDC maskDC;

maskDC.CreateCompatibleDC(&dc);

CBitmap maskbmp;

maskbmp.CreateCompatibleBitmap(&dc,480,276);//

maskDC.SelectObject(&maskbmp);

maskDC.BitBlt(0,0,480,276,&memDC,0,0,SRCCOPY);

if(!v_keyinfo.empty())
{
for(int i = 0;i<v_keyinfo.size();i++)
{
if(m_bDownShift == false)
{
if(i >= 36 && i< 62)
continue;
if(v_keyinfo[i].pImage[0]!=NULL)
if(v_keyinfo[i].keydown == false)
v_keyinfo[i].pImage[0]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
else
{
v_keyinfo[i].pImage[1]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
v_keyinfo[i].pImage[2]->Draw(maskDC,&v_keyinfo[i].effectRC,NULL);
}
}else
{
if(i >= 10 && i<=35)
continue;
if(v_keyinfo[i].pImage[0]!=NULL)
if(v_keyinfo[i].keydown == false)
v_keyinfo[i].pImage[0]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
else
{
v_keyinfo[i].pImage[1]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
v_keyinfo[i].pImage[2]->Draw(maskDC,&v_keyinfo[i].effectRC,NULL);
}
}
}
}
dc.BitBlt(0,0,480,276,&maskDC,0,0,SRCCOPY);

memDC.DeleteDC();
maskDC.DeleteDC();
maskbmp.DeleteObject();
}
...全文
709 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2012-02-10
  • 打赏
  • 举报
回复
Invalidate传个参数FALSE,就不闪了
kidd3000 2010-11-09
  • 打赏
  • 举报
回复
我已经懂得用InvalidateRect 来刷新单个控件了,虽然整个MFC窗口不再闪烁,不过闪烁的是在静态文本这里了,我很想知道双缓冲方法如何解决这个问题的呢,求代码啊大侠,以IDC_STATIC来举个例子吧,改变文字后如何不闪烁地刷新这个静态文本(有背景图片就是难搞),只要说明哪里添加什么代码就可以了,应该可以的吧?
luocw110 2010-11-09
  • 打赏
  • 举报
回复
以前用过双缓冲 不太记得了
主要是在视图类的OnCreate()函数中设置像素格式static PIXELFORMATDESCRIPTOR pfd ={},
然后在 后缓冲区画图,之后在OnDraw()中使用SwapBuffers() 交换到前缓冲区, 可以解决闪烁问题
kidd3000 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kidd3000 的回复:]
InvalidateRect 来刷新那五个控件行不行的呢,行的话如何写?请指导一下
[/Quote]

求代码啊大侠,以IDC_STATIC来举个例子吧,如何只刷新这个静态文本
kidd3000 2010-11-09
  • 打赏
  • 举报
回复
来点实质点的东西吧各位大侠,作为一个菜鸟我只会Invalidate() ,而且我对绘图的部分一点也不熟悉。那么多的回复愣是没点有用的……我复制的那个例子我也确实看不明白……又没注释,中间部分又不知道是啥,我想要的是当静态文本的文改变时,能够不闪烁地刷新,可是那个例子好像是说在Onpiant里画图的……这例子我模仿不来啊……虚心求教
Eleven 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kidd3000 的回复:]
InvalidateRect 来刷新那五个控件行不行的呢,行的话如何写?请指导一下
[/Quote]
可以,用InvalidateRect只刷新指定的无效区域
kidd3000 2010-11-09
  • 打赏
  • 举报
回复
InvalidateRect 来刷新那五个控件行不行的呢,行的话如何写?请指导一下
kidd3000 2010-11-09
  • 打赏
  • 举报
回复
所以我想着能不能直接刷新那五个静态控件就行了,可是不怎么会啊
MYNAMELIULI 2010-11-09
  • 打赏
  • 举报
回复
Invalidate() 强制更新的整个窗口吧,能不闪吗 ?!
luawkk 2010-11-09
  • 打赏
  • 举报
回复
Invalidate() 强制更新的整个窗口吧,能不闪吗 ?!
chenzekai123 2010-11-09
  • 打赏
  • 举报
回复
楼主试试Invalidate()后再UpdateWindow(),这样可以加快重新绘制窗口的速度
kidd3000 2010-11-09
  • 打赏
  • 举报
回复
其实我想过取得五个静态控件的区域,然后局部刷新它们的,这样整个MFC窗口应该不会闪烁了,我只是这么上司而已,能实现吗?怎么实现法呢
kidd3000 2010-11-09
  • 打赏
  • 举报
回复
我现在是急着要解决这个问题呢,而且对绘图又不怎么熟悉。,我的MFC窗口上共有五个静态控件文本,每次有文字改变后我都是用invalidate来刷新的……我现在想要的是当静态文本字体改变的时候,能实现无闪烁的刷新,这应该怎么办,高手说个详细的能用的方法吧,急……
kidd3000 2010-11-09
  • 打赏
  • 举报
回复
其实我对绘图不怎么理解,以前不怎么接触过。我觉得静态控件中的文字变了,用invalidate来刷新我能明白。但是怎么用双缓冲来刷新?我只想在静态文本的字体改变的时候,实现无闪烁的刷新。那应该怎么办,在Onpaint里面写代码就可以了?还要不要调用其它的函数呢?
傻X 2010-11-09
  • 打赏
  • 举报
回复
一开始像楼主这种情况很正常的.

主要是理解1个屏幕CDC和内存CDC...所有的操作都在内存CDC中,在最后调用屏幕CDC把内存CDC读出就OK了

理解过程就能看得懂代码了...当然先需要完成基本绘图
大V雪 2010-11-08
  • 打赏
  • 举报
回复
老问题,双缓冲绘图
fandh 2010-11-08
  • 打赏
  • 举报
回复
先全部写到缓冲,最后贴图!干脆,连背景的重载的函数直接返回!都做刷新里面画!
fishion 2010-11-08
  • 打赏
  • 举报
回复
双缓冲。。你就照着例子写
lsupper 2010-11-08
  • 打赏
  • 举报
回复
额,其实有了这个代码了...楼主一行行的啃下吧......

19,468

社区成员

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

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