双缓冲绘图中的一个奇怪问题

glacierful 2011-06-01 09:12:43
使用双缓冲方式绘图,图上的部分区域完全是文字,这一部分好像每次刷新后,上次的内容还在.刷新几次以后文字就叠加的乱七八糟了。但图上其他区域的线条、文字的显示又是很正常的。
让人感到奇怪的是,我采用的是双缓冲方式绘图,在内存中画完图后,用BitBlt再贴到窗口上。应该说上次的图应该已经被清除了,不应该会出现这种情况。
...全文
326 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
baoyz 2012-11-30
  • 打赏
  • 举报
回复
引用 6 楼 glacierful 的回复:
引用 3 楼 hnzlk 的回复: 每次绘图之前把背景填充一下。 用pDC->FillRect(rect, &CBrush(RGB(0,0,0)))这样填充后,依然有问题。
pDC这个变量太可疑了。 一般这个变量是指定屏幕的,你把屏幕给“黑”了有什么用?应该先“黑”MemDC。
pop1210 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 wqhua 的回复:]
是不是 OnEraseBkground 在作怪?
直接return true了?
[/Quote]
我那天的问题解决了,原因是"多次使用双缓冲,双缓冲会失效",
这样说也不准确,反正还是双缓冲使用方式有问题。

一般来说如下OnPaint内这样使用是没问题的(只说OnPaint),
OnPaint()
{
CPaintDC dc(this);

//创建内存DC
CDC dcMem;
...

//先画到内存DC
DrawXX1(&dcMem);
DrawXX2(&dcMem);
...

//最后在copy到目标DC
dc.BitBlt(...);
}
wqhua 2011-06-05
  • 打赏
  • 举报
回复
是不是 OnEraseBkground 在作怪?
直接return true了?


向立天 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 pop1210 的回复:]

引用 19 楼 xianglitian 的回复:
你确定你的双缓冲使用时正确的?

好像往DC里先贴个图,然后再画个文体字串这样时,resize窗口就有残影之类的,
BitBlt,StretchBlt贴图的时候,有人说既然背景时贴图了,就不用双缓冲了?
释疑啊...
[/Quote]如果背景有图片而且还要变换窗口大小
这样就需要缩放这张图
就可能产生失真
其实resize窗口不是什么技术问题
是设计问题
pop1210 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 xianglitian 的回复:]
引用 21 楼 pop1210 的回复:

引用 19 楼 xianglitian 的回复:
你确定你的双缓冲使用时正确的?

好像往DC里先贴个图,然后再画个文体字串这样时,resize窗口就有残影之类的,
BitBlt,StretchBlt贴图的时候,有人说既然背景时贴图了,就不用双缓冲了?
释疑啊...
如果背景有图片而且还要变换窗口大小
这样就需要缩放这张图
就可能产生……
[/Quote]
缩放是什么意思?StretchBlt不就缩放了吗,
pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图片严重失真
pDC->StretchBlt(...,SRCCOPY);
其中SetStretchBltMode这行我忘了从哪里找的代码啦,它说可以防止失真但效果没看出来怎么滴;

现在应该怎么设计呢(实现如下需求):
1.基于对话框的;
2.对话框的背景是一张图片;
3.再在图片上画一串字(比如"hello world!");
4.对话框可resize(resize时当然要求图片跟着缩放);
5.要求无闪烁、无残影;
pop1210 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 glacierful 的回复:]
我在每个字符串输出前,在同样的位置画个矩形,就没有文字不擦除的那种情况了。
疑惑啊。
[/Quote]
确实有这个问题
abxialiang 2011-06-02
  • 打赏
  • 举报
回复
帮顶 .
pop1210 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 xianglitian 的回复:]
你确定你的双缓冲使用时正确的?
[/Quote]
好像往DC里先贴个图,然后再画个文体字串这样时,resize窗口就有残影之类的,
BitBlt,StretchBlt贴图的时候,有人说既然背景时贴图了,就不用双缓冲了?
释疑啊...
pop1210 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 glacierful 的回复:]
我在每个字符串输出前,在同样的位置画个矩形,就没有文字不擦除的那种情况了。
疑惑啊。
[/Quote]
http://blog.csdn.net/joji_h/archive/2009/01/02/3684470.aspx
网上搜了好多这样的"残影"问题都没个正经答案,没弄出来,
好像BitBlt,StretchBlt这些个函数的问题?
就是没高手来解惑啊!
向立天 2011-06-02
  • 打赏
  • 举报
回复
你确定你的双缓冲使用时正确的?
founderfang 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 glacierful 的回复:]
引用 3 楼 hnzlk 的回复:

每次绘图之前把背景填充一下。

用pDC->FillRect(rect, &CBrush(RGB(0,0,0)))这样填充后,依然有问题。
[/Quote]
你这个pDC是窗口的DC还是后台的DC,对窗口的DC只需要做Bitblt,所有其它画图操作都应该在后台的DC。
lihanbing 2011-06-01
  • 打赏
  • 举报
回复
glacierful 2011-06-01
  • 打赏
  • 举报
回复
代码很简单,就是
CFont类的CreateFont创建字体,
然后SetTextColor设置文本颜色,
然后用DrawText写文字,
最后删除字体。

这就是全部过程。
pop1210 2011-06-01
  • 打赏
  • 举报
回复
关注,没见过,还是上点代码好~
lihanbing 2011-06-01
  • 打赏
  • 举报
回复
Bitblt函数本身肯定不会有问题的,问题只能出在你的代码上
glacierful 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yungmode 的回复:]

呵呵,设置下DC画图模式就好了。 SetROP2(hdc,R2_XORPEN);

试试吧^_^.
[/Quote]
试了一下,还是不行。
yungmode 2011-06-01
  • 打赏
  • 举报
回复
呵呵,设置下DC画图模式就好了。 SetROP2(hdc,R2_XORPEN);

试试吧^_^.
glacierful 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 guanhuoz 的回复:]

最后一个参数用的是SRCCOPY吗?
[/Quote]
是。
最奇怪的是图上,只有全部是文字的这个区域不正常,其他区域是正常的。
难道文字有什么特别的地方?
老火 2011-06-01
  • 打赏
  • 举报
回复
最后一个参数用的是SRCCOPY吗?
glacierful 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hnzlk 的回复:]

每次绘图之前把背景填充一下。
[/Quote]
用pDC->FillRect(rect, &CBrush(RGB(0,0,0)))这样填充后,依然有问题。
加载更多回复(7)

19,468

社区成员

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

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