GDI+ PNG图片 双缓冲&半透明图片绘图发黑解决
来源:互联网 发布:怎么做app软件 编辑:程序博客网 时间:2024/04/25 04:07
双缓冲显示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图片 双缓冲&半透明图片绘图发黑解决
- GDI+用PNG图片做半透明异型窗口
- Wince贴图 显示png wince GDI图片显示半透明
- 实现png图片半透明
- VC中GDI+双缓冲实现Picture控件中显示png图片
- VC中GDI+双缓冲实现Picture控件中显示png图片
- GDI双缓冲绘图
- GDI双缓冲绘图
- GDI双缓冲绘图
- GDI双缓冲绘图
- GDI显示PNG图片
- GDI操作PNG图片
- GDI操作PNG图片
- 如何使用 GDI+ 双缓冲 解决绘图闪烁问题
- 使用 GDI+ 双缓冲 解决绘图闪烁问题
- 在VC6.0中用GDI+调用png图片实现半透明渐变的特效窗口
- 二:在VC6.0中用GDI+调用png图片实现半透明渐变的特效窗口
- 在VC6.0中用GDI+调用png图片实现半透明渐变的特效窗口
- Linux命令:tail
- 解决android listview中OnItemClickListener事件和里面button点击事件冲突问题
- 筛法求素数变式
- 【笔记】JSTL基础知识
- 关于编程语言之争
- GDI+ PNG图片 双缓冲&半透明图片绘图发黑解决
- JQuery实现禁用指定文档元素文本选择
- Linux命令:which
- 机房收费之--SqlHelper
- 多线程
- Oracle SQL性能优化
- SQL中数据库之间不兼容的语法汇总
- Maven的Dependency如何找
- Linux命令:whereis