《GDI+学习及代码总结之——GDI+双缓冲等问题总结.docx》由会员分享,可在线阅读,更多相关《GDI+学习及代码总结之——GDI+双缓冲等问题总结.docx(2页珍藏版)》请在金锄头文库上搜索。
1、GDI+学习及代码总结之GDI+双缓冲等问题总结GDI+双缓冲技术转载地址:http:/ 如何使用双缓冲绘制图像),得到了一个GDI+下较可行的方法,虽然绘制效果比直接绘制要好一些,不过还不能跟GDI的双缓冲方式比肩。现在,我终于找到了一个理想的实现方式,效果与GDI的实现不相上下,代码如下:/*C+ code*/RECT rc;GetClientRect(g_hwnd,&rc);Bitmap bmp(int(rc.right),int(rc.bottom);Graphics bmpGraphics(&bmp);bmpGraphics.SetSmoothingMode(SmoothingMod
2、eAntiAlias);/*Drawing on bitmap*/SolidBrush bkBrush(Color(0,0,0);bmpGraphics.FillRectangle(&bkBrush,0,0,rc.right,rc.bottom);/*Drawing on DC*/Graphics graphics(hdc);/*Important! Create a CacheBitmap object for quick drawing*/CachedBitmap cachedBmp(&bmp,&graphics);graphics.DrawCachedBitmap(&cachedBmp,
3、0,0);以上的绘制代码最区别于网络上其他GDI+实现的一处就是,在最后添加了一个CacheBitmap对象用于快速绘制。CacheBitmap是一个包含了bmp全部象素,并且针对graphics所关联的DC做过特别优化的位图对象。这点可以从其构造参数上看到。关于双缓冲的实现还有一点十分关键,虽然它不属于双缓冲实现的核心。如果绘制需要经常的重绘背景,则需要自己拦截WM_ERASEBKGND消息,并在处理函数中什么也不做,即此消息发生时不重画背景,背景的重画在WM_PAINT中全权控制。如,WM_ERASEBKGND消息处理的实现void OnEraseBkGnd(HDC hdc)/do not
4、hing附:GDI的双缓冲实现RECT rc;GetClientRect(hwnd,&rc);HDC hMemDc = CreateCompatibleDC(hdc);HBITMAP hBmp = CreateCompatibleBitmap(hdc,rc.right,rc.bottom);HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDc,hBmp);/在此使用hMemDc进行 GDI 绘制BitBlt(hdc,0,0,rc.right,rc.bottom,hMemDc,0,0,SRCCOPY);SelectObject(hMemDc,hOldBmp);DeleteObject(hBmp);DeleteObject(hMemDc);