分享

GDI GDI+ 双缓冲解决闪烁

 SamBookshelf 2014-05-16

  最近工作遇到绘制控件的问题,该控件会不断刷新,其所在的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画图

****/

  //将内存中的图拷贝到屏幕上进行显示
  pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);

  //绘图完成后的清理  

  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是有贴图或刷颜色的,这样,控件就会这样显示。举例:效果如下图



这样,椭圆形周围就有白边了。这个问题,怎么解决呢?

五、

后来发现了一个博客,讲述了游戏中贴图的方法,试过了,效果是有,但是裁剪的边界效果不是很好。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多