[转]cximage双缓冲绘图 .
1、起因
本来是想用gdi绘图的,但是一想到用gdi+libpng,还要自己处理一些比如alpha的效果之类的巨麻烦(而且涉及到处理每一个像素点的计算,一般都很耗时),我对自己处理像素点的能力一直持有怀疑态度。。so,先用cximage将就着,不知道是否可以跨平台。。
2、用cximage绘制png到屏幕上面确实很容易,简单的就几行代码
参考:http://blog.csdn.net/zengraoli/article/details/8635225
3、但是简单的在WM_PAINT消息进行重绘的时候,加入缓冲绘图,会发现背后出现黑色的区域-------------因为是在内存中使用了HBITMAP造成的,实例代码:
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: 在此添加任意绘图代码...
- /* hdc= GetDC(hWnd);*/
- hMemDC = CreateCompatibleDC(hdc);
- hbitmap = CreateCompatibleBitmap(hdc, m_pCxImage->GetWidth(), m_pCxImage->GetHeight());
- oldBmp = (HBITMAP)SelectObject(hMemDC, hbitmap);
- m_pCxImage->Draw(hMemDC, 0, 0);
- BitBlt(hdc, 0, 0, m_pCxImage->GetWidth(), m_pCxImage->GetHeight(), hMemDC, 0, 0, SRCCOPY);
- ReleaseDC(NULL,hdc);
- EndPaint(hWnd, &ps);
- break;

4、其实去除背后的黑色区域很简单
可以先把没绘制时候的空白,先拷贝一份在兼容DC(hdcBk)中,在绘制png的时候,先在内存DC(hMemDC)中绘制hdcBk,在用cximage绘制png到hMemDC中,那么背后就是白色的了,就这么简单
主要代码:
- void GetBackImage(HWND hWnd, HDC &hdcBk, int iWidth, int iHeight)
- {
- HDC hdcParent/*, hdcBk*/;
- HBITMAP hbitmap;
- hdcParent = GetDC(hWnd);
- hdcBk = CreateCompatibleDC(hdcParent);
- hbitmap = CreateCompatibleBitmap(hdcParent, iWidth, iHeight);
- SelectObject(hdcBk, hbitmap);
- BitBlt(hdcBk, 0, 0, iWidth, iHeight, hdcParent, 0, 0, SRCCOPY);
- ReleaseDC(hWnd, hdcParent);
- }
在消息处理的时候:
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: 在此添加任意绘图代码...
- /* hdc= GetDC(hWnd);*/
- hMemDC = CreateCompatibleDC(hdc);
- hbitmap = CreateCompatibleBitmap(hdc, m_pCxImage->GetWidth(), m_pCxImage->GetHeight());
- oldBmp = (HBITMAP)SelectObject(hMemDC, hbitmap);
- if (hdcBk == 0)
- {
- GetBackImage(hWnd, hdcBk, m_pCxImage->GetWidth(), m_pCxImage->GetHeight());
- }
- BitBlt(hMemDC, 0, 0, m_pCxImage->GetWidth(), m_pCxImage->GetHeight(), hdcBk, 0, 0, SRCCOPY);
- m_pCxImage->Draw(hMemDC, 0, 0);
- BitBlt(hdc, 0, 0, m_pCxImage->GetWidth(), m_pCxImage->GetHeight(), hMemDC, 0, 0, SRCCOPY);
- DeleteObject(SelectObject(hMemDC, oldBmp));
- DeleteDC(hMemDC);
- ReleaseDC(NULL,hdc);
- EndPaint(hWnd, &ps);
- break;
得到的效果:

[转]cximage双缓冲绘图 .的更多相关文章
- MFC双缓冲绘图(2015.09.24)
问题引入: 最近在尝试编写贪吃蛇游戏时遇到这么一个问题:当系统以较快频率向窗口发送WM_PAINT消息时,调用OnPaint()函数在窗口中绘制图形就会发生闪烁现象. 问题分析: 当我们把绘图过程放在 ...
- MFC双缓冲绘图实例
本人之前一直了解双缓冲绘图的基本原理,但是在研究很久之后才大概知道具体的使用过程,本文将详细介绍本人在实际项目中使用双缓冲绘图的案例. 实现功能:主界面显示某张包含人脸的图片,通过dlib detec ...
- C#-gdi绘图,双缓冲绘图,Paint事件的触发
一. 画面闪烁问题与双缓冲技术 1.1 导致画面闪烁的关键原因分析: 1 绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面 ...
- 陈灯WGF双缓冲绘图框架
“木丸子童屋”,专售各类儿童玩具,价格优惠,请大家多多支持:http://shop65552598.taobao.com/ WGF(windows graphic foundation)为window ...
- 双缓冲绘图和窗口控件的绘制——ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 .
双缓冲绘图和窗口控件的绘制 ---ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 cheungmine 我们通常使用ATL COM组件,生成一个带窗口的ActiveX控件,然后 ...
- 简单的 "双缓冲" 绘图的例子(研究一下)
所谓双缓冲就是先画到内存画布(如: TBitmap), 然后再转帖到目的地. 譬如下面小程序: procedure TForm1.FormCreate(Sender: TObject); begin ...
- mfc双缓冲绘图
1.要求 在界面加载本地图片并显示,每过100ms改变一张图片显示 2.现象 通过定时器控制CImage,Load,Draw,Destroy,会非常的卡顿.因为Load图片时,会是非常大的数据[所有C ...
- 【MFC】MFC绘制动态曲线,用双缓冲绘图技术防闪烁
摘自:http://zhy1987819.blog.163.com/blog/static/841427882011614103454335/ MFC绘制动态曲线,用双缓冲绘图技术防闪烁 2011 ...
- 简单的 "双缓冲" 绘图的例子
http://www.cnblogs.com/del/archive/2010/04/19/1715779.html 所谓双缓冲就是先画到内存画布(如: TBitmap), 然后再转帖到目的地. 譬如 ...
随机推荐
- java中定时器总结
java实现定时器的四种方式: 一. /** * 延迟20000毫秒执行 java.util.Timer.schedule(TimerTask task, long delay) */ public ...
- sea.js教程
转载自:http://blog.codinglabs.org/articles/modularized-javascript-with-seajs.html 前言 SeaJS是一个遵循CommonJS ...
- (转)使用 vs.php 调试PHP
转自:http://www.jb51.net/article/24618.htm 早先在asp横行的年代,php和asp一样,大都都是html中夹杂代码,说实话,这时候IDE的确用处不是很大,倒是 ...
- 设置customer_id
update t_user_identification u set u.customer_id = (select c.customer_id from t_customer c from t_us ...
- U盘或者移动银盘退出时一直显示占用中问题解决--最粗暴解决方式
问题描述: ---------------------------弹出 USB 大容量存储设备 时出问题---------------------------Windows 无法停用“通用卷”设备,原 ...
- poj3061
#include<stdio.h> #include<iostream> using namespace std; #include<algorithm> cons ...
- 《mysql必知必会》学习_第9章_20180731_欢
第九章,用正则表达式进行搜索. P52 select prod_name from products where prod_name regexp '1000' order by prod_name; ...
- Codeforces Round #265 (Div. 2) C. No to Palindromes! 构造不含回文子串的串
http://codeforces.com/contest/465/problem/C 给定n和m,以及一个字符串s,s不存在长度大于2的回文子串,现在要求输出一个字典比s大的字符串,且串中字母在一定 ...
- bootstrap2.2相关文档
本节课我们主要学习一下 Bootstrap表单和图片功能,通过内置的 CSS定义,显示各种丰富的效果. 一.表单 Bootstrap提供了一些丰富的表单样式供开发者使用. 1.基本格式 //实现基本的 ...
- day05_雷神_函数进阶
#day05 1.迭代器 1.1可迭代对象 str,list,tuple,dict,set,range,文件句柄 等都是可迭代对象 第一种方法:在该对象中,含有__iter__方法的就是可迭代对象,遵 ...