最近工作遇到绘制控件的问题,该控件会不断刷新,其所在的view可能贴图,也可能用纯色的画刷刷。这样就产生了问题了,控件狂闪,特别是有背景图的时候。该控件绘制的时候用的是GDI,过程中考虑到圆滑处理等又用到了GDI+。现在用双缓冲解决闪烁问题。
一 、GDI 双缓冲这样做:CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景,你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));/***
使用MemDC画图
****/
//将内存中的图拷贝到屏幕上进行显示//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
二、使用GDI+绘图:
//在内存中建立一块“虚拟画布”:
Bitmap bmp = new Bitmap(600, 600);
//获取这块内存画布的Graphics引用:
Graphics g = Graphics.FromImage(bmp);
//在这块内存画布上绘图:
g.FillEllipse(brush, i * 10, j * 10, 10, 10);
//将内存画布画到窗口
Graphics graphics(dc.m_hDC);
graphics.DrawImage(&bmp,rect.left,rect.top,rect.right,rect.bottom);
三、GDI 和GDI+ 混合使用双缓冲
Graphics *graphics=Graphics::FromHDC(hMemDC); //可以初始化
//这样GDI和GDI+就画在一块内存上了
通过以上方法,我的控件闪烁问题就解决了,以上这些是我从网上找到的,很感谢大家的分享。在这里做一下总结,记录一下。因为水平有限,有些地方可能有错误,请各位高手指正。若有更好地办法,也希望你能告诉我,谢谢。
四、问题
前面说到,我的控件放在view中,所以控件是有背景的。在利用双缓冲时,建立一幅图bmp,再给这幅图清除,再在上面画。而我的控件是不规则的,在这样的bmp上画,相当于这个控件的图形有背景即图片bmp清除的颜色。而view是有贴图或刷颜色的,这样,控件就会这样显示。举例:效果如下图
这样,椭圆形周围就有白边了。这个问题,怎么解决呢?
五、
后来发现了一个博客,讲述了游戏中贴图的方法,试过了,效果是有,但是裁剪的边界效果不是很好。