GDI+ PNG图片 双缓冲&半透明图片绘图发黑解决

双缓冲显示PNG图片

双缓冲显示图片。。。其实就将图片预先存储在内存DC里,显示的时候直接映射到物理设备DC上,这样子能够快速显示图片,避免闪烁的现象。因此分成两步,创建内存DC中图像和 将内存DC图像复制到物理DC上。


核心是在内存DC中显示图片。

1.      首先要开辟出来一块内存以作DC用。
CDC MemDC;

2.      给内存DC赋以一定的物理属性。不同于物理DC,内存DC只是一块内存,没的物理属性,无法知道将要显示图片的设备信息。可通过以下语句给内存DC赋上物理属性:
MemDC.CreateCompatibleDC(&pDC);

3.      现在已经有了内存DC的基本物理信息了,好比知道了图纸的大小等基本属性,但是还没有图纸,现在创建图纸:

bmp.CreateCompatibleBitmap(&clDC,rect.Width(), rect.Height());

并通知内存DC使用这张图纸

MemDC.SelectObject(&bmp);

4.      将物理DC上的内容写到内存DC的图纸上

MemDC.BitBlt(0,0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY);

5.      让图纸与内存DC分开,方便其他内存DC可以使用这张图纸

bmp.DeleteObject();

 

关于GDI+ 中内存Graphics绘图和物理DC上绘图的区别

使用内存DC(包括其指针)创建Graphics对象:

Gdiplus::Graphics graphics(pMemDC->m_hDC);

使用Graphics绘图DrawImage只是在内存中绘图,实际和在物理DC上作图没有什么区别,只是不会无法显示到屏幕中,但是可以使用BitBlt复制到其他兼容内存DC中去。此时离在屏幕上显示图像只差一步,就是将内存DC图像BitBlt到物理DC中去。


GDI+ Graphics画图有一个bug,若直接在物理设备DC上绘图,物理设备DC这张纸好像是唯一的,每绘一次就仿佛就在图上描了一次,本来是黑色的地方再描一遍还是黑色的,倒看不出来,浅颜色的地方会越描越黑。PNG图片带有透明程度的alpha通道,半透明的地方就会越绘越黑,最后完全不能看。

解决的办法就是记录尚未显示PNG图片是的背景,在显示PNG图片之前先显示背景,再显示图片,再记录下来,相当于有一张小纸片画好了图(既有背景又有图片)。下回显示的时候,一并显示含有背景的PNG的图片,每显示一次就相当于贴一张小纸片,这样子就不存在画笔颜料越描越黑的情形了。

你可能感兴趣的:(GDI+ PNG图片 双缓冲&半透明图片绘图发黑解决)