双缓冲绘图中的一个奇怪问题 使用双缓冲方式绘图,图上的部分区域完全是文字,这一部分好像每次刷新后,上次的内容还在.刷新几次以后文字就叠加的乱七八糟了。但图上其他区域的线条、文字的显示又是很正常的。 让人感到奇怪的是,我采用的是双缓冲方式绘图,在内存中画完图后,用BitBlt再贴到窗口上。应该说上次的图应该已经被清除了,不应该会出现这种情况。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 重绘背景就会闪烁了,没必要双缓冲了,是不是bitblt最后一个参数不对呢? 用pDC->FillRect(rect, &CBrush(RGB(0,0,0)))这样填充后,依然有问题。 最后一个参数用的是SRCCOPY吗? 呵呵,设置下DC画图模式就好了。 SetROP2(hdc,R2_XORPEN);试试吧^_^. Bitblt函数本身肯定不会有问题的,问题只能出在你的代码上 代码很简单,就是 CFont类的CreateFont创建字体, 然后SetTextColor设置文本颜色, 然后用DrawText写文字, 最后删除字体。这就是全部过程。 你这个pDC是窗口的DC还是后台的DC,对窗口的DC只需要做Bitblt,所有其它画图操作都应该在后台的DC。 http://blog.csdn.net/r3000/archive/2010/04/06/5454262.aspx http://blog.csdn.net/joji_h/archive/2009/01/02/3684470.aspx网上搜了好多这样的"残影"问题都没个正经答案,没弄出来,好像BitBlt,StretchBlt这些个函数的问题?就是没高手来解惑啊! 好像往DC里先贴个图,然后再画个文体字串这样时,resize窗口就有残影之类的,BitBlt,StretchBlt贴图的时候,有人说既然背景时贴图了,就不用双缓冲了?释疑啊... 如果背景有图片而且还要变换窗口大小这样就需要缩放这张图就可能产生失真其实resize窗口不是什么技术问题是设计问题 缩放是什么意思?StretchBlt不就缩放了吗,pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图片严重失真pDC->StretchBlt(...,SRCCOPY);其中SetStretchBltMode这行我忘了从哪里找的代码啦,它说可以防止失真但效果没看出来怎么滴;现在应该怎么设计呢(实现如下需求):1.基于对话框的;2.对话框的背景是一张图片;3.再在图片上画一串字(比如"hello world!");4.对话框可resize(resize时当然要求图片跟着缩放);5.要求无闪烁、无残影; 是不是 OnEraseBkground 在作怪?直接return true了? 我那天的问题解决了,原因是"多次使用双缓冲,双缓冲会失效",这样说也不准确,反正还是双缓冲使用方式有问题。一般来说如下OnPaint内这样使用是没问题的(只说OnPaint),OnPaint(){CPaintDC dc(this);//创建内存DCCDC dcMem;...//先画到内存DCDrawXX1(&dcMem);DrawXX2(&dcMem);...//最后在copy到目标DCdc.BitBlt(...);} 我也碰见这个问题了,所以不确定双缓冲是画好一幅图再bitblt还是画好一部分就bitblt,前者是不会出现前一块图没绘制的情况,后者会出现楼主的情况,应该在会好内存hdc之后再bitblt画到屏幕上,尽管这个帖子已经这么长时间了,还是想说明一下,以方便类似这种情况的学者。 pDC这个变量太可疑了。一般这个变量是指定屏幕的,你把屏幕给“黑”了有什么用?应该先“黑”MemDC。 请高手分析一下数据库取值的判断问题 怎么获得一个站点下的所以文件... return i; 主要的作用是什么?谢谢 如何解决LNK2005错误? 简单问题,打开程序是ShellExcute,那结束程序是什么,如何使用?!请赐教! 请问哪有WindowsXP DDK下载? 请教如何升级自身(.exe)!!!! createfont怎样创建一个随意宽高的字体? 将DXSHOW直接在DXDRAW的页面上播放出现版本错误……( 80 分) 关于vs软件的问题 ░▒▓█ 新手问几个avi问题 VFW C++编写 的Windows 服务安如何制作安装包
CFont类的CreateFont创建字体,
然后SetTextColor设置文本颜色,
然后用DrawText写文字,
最后删除字体。这就是全部过程。
网上搜了好多这样的"残影"问题都没个正经答案,没弄出来,
好像BitBlt,StretchBlt这些个函数的问题?
就是没高手来解惑啊!
BitBlt,StretchBlt贴图的时候,有人说既然背景时贴图了,就不用双缓冲了?
释疑啊...
这样就需要缩放这张图
就可能产生失真
其实resize窗口不是什么技术问题
是设计问题
pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图片严重失真
pDC->StretchBlt(...,SRCCOPY);
其中SetStretchBltMode这行我忘了从哪里找的代码啦,它说可以防止失真但效果没看出来怎么滴;现在应该怎么设计呢(实现如下需求):
1.基于对话框的;
2.对话框的背景是一张图片;
3.再在图片上画一串字(比如"hello world!");
4.对话框可resize(resize时当然要求图片跟着缩放);
5.要求无闪烁、无残影;
直接return true了?
这样说也不准确,反正还是双缓冲使用方式有问题。一般来说如下OnPaint内这样使用是没问题的(只说OnPaint),
OnPaint()
{
CPaintDC dc(this);//创建内存DC
CDC dcMem;
...//先画到内存DC
DrawXX1(&dcMem);
DrawXX2(&dcMem);
...//最后在copy到目标DC
dc.BitBlt(...);
}
pDC这个变量太可疑了。
一般这个变量是指定屏幕的,你把屏幕给“黑”了有什么用?应该先“黑”MemDC。