GDI+ 如何使用双缓冲绘制图像
更新时间:2023-12-25 22:19:01 阅读量: 教育文库 文档下载
- gdi是什么意思推荐度:
- 相关推荐
早前曾为此问题在CSDN发帖求助(GDI+ 如何使用双缓冲绘制图像),得到了一个GDI+下较可行的方
法,虽然绘制效果比直接绘制要好一些,不过还不能跟GDI的双缓冲方式比肩。
现在,我终于找到了一个理想的实现方式,效果与GDI的实现不相上下,代码如下:
/*C++ code*/ RECT rc;
GetClientRect(g_hwnd,&rc); Bitmap bmp(int(rc.right),int(rc.bottom));
Graphics bmpGraphics(&bmp);
bmpGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
/*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,0,0);
以上的绘制代码最区别于网络上其他GDI+实现的一处就是,在最后添加了一个CacheBitmap对象用于快
速绘制。
CacheBitmap是一个包含了bmp全部象素,并且针对graphics所关联的DC做过特别优化的位图对象。
这点可以从其构造参数上看到。
关于双缓冲的实现还有一点十分关键,虽然它不属于双缓冲实现的核心。如果绘制需要经常的重绘背景,则需要自己拦截WM_ERASEBKGND消息,并在处理函数中什么也不做,即此消息发生时不重画背景,
背景的重画在WM_PAINT中全权控制。
如,WM_ERASEBKGND消息处理的实现
void OnEraseBkGnd(HDC hdc)
{ //do nothing
}
附: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);
正在阅读:
GDI+ 如何使用双缓冲绘制图像12-25
2012学年第一学期五年级数学期终试卷答案(130118)04-22
丰教字68号10-05
电动汽车制动能量回收控制策略研究04-21
赵部长到调研指导村级组织换届选举工作10-21
施工现场安全自检自查报告04-03
南星渎六期技术标05-11
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 缓冲
- 绘制
- 图像
- 使用
- 如何
- GDI