CImage显示位图与CDC双缓冲冲突,使用路径层解决.
2010年04月29日 星期四 20:35
位图闪的问题困扰我很久了,因为程序的需要,我显示位图的方式是CImage类.
如果从CImage转到CBitmap,之后使用Attach到是可以,但我发现这样之后CImage类的对象会无效.
无奈拖了很久程序一直都在闪,我的程序使用的是多文档多视图,昨天通过勾子解决了CHtmlView在子窗口中闪烁的问题,今天下决心把CScrollView使用CImage闪烁的问题也给解决.
我们知道
CImage显示位图的方式是
m_Image.Draw(pDC->m_hDC, 0, 0);
通过函数跟踪发现他也直接使用了内存绘制.
但如果我们添加使用自己的CDC比如绘制先字体,画刷等等使用内存显示的话也就是说有2个内存DC要显示.
因为不同步,存在色差所以闪烁.无奈CImage的资料太少,我也试过加载到自己定义的CDC中去,但都失败了.
我想如果我先绘制CImage,绘制后的CImage位图谁都不许动,有什么办法,那只能使用路径层.
(在设备描述表中还有一个路径层(path bracket)的概念,什么是路径层呢?路径层的概念就像当年军阀割据圈地那样,在地域上划定界线,界线之内的是各自的地盘,别人不能侵犯.)那样的话当自己的CDC绘制时就不会去动CImage已经绘制好的部分,闪烁也就解决了.
下面看代码.
void CNotesPrintView::OnDraw(CDC* pDC)
{
CNotesPrintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect = 0;
GetClientRect(rect);
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(pDC);
MemBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,rect.right,rect.bottom,RGB(255,255,255));
// 上面的是一般的双缓存,大家查资料.
if (!pDoc->m_Image.IsNull())
{
pDoc->m_Image.Draw(pDC->m_hDC, 0, 0); // 绘制CImage位图
pDC->BeginPath(); // 打开路径层
pDC->Rectangle(0,0,pDoc->m_Image.GetWidth(),pDoc->m_Image.GetHeight()); // 设置路径层矩形区域
pDC->EndPath(); // 关闭路径层,关闭后谁都不能在去动这块区域了.
pDC->SelectClipPath(RGN_DIFF); // 设置裁剪模式
}
pDC->BitBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY); // 绘制自定定义的CDC
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
RGN_AND:新的剪切区包括当前剪切区域与当前路径的一个交集(重叠区域)。
RGN_COPY:新的剪切区域就是当前的路径。
RGN_DIFF:新的剪切区域包含除了当前路径外的当前剪切区域。
RGN_OR:新的剪切区域包含当前剪切区域与当前路径的并集。
RGN_XOR:新的剪切区域包含当前剪切区域与当前路径的并集但不包含重叠的区域。
CImage显示位图与CDC双缓冲冲突,使用路径层解决.的更多相关文章
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...
- MFC双缓冲解决图象闪烁[转]
转载网上找到的一篇双缓冲的文章,很好用.http://www.cnblogs.com/piggger/archive/2009/05/02/1447917.html__________________ ...
- 【MFC】MFC绘图不闪烁——双缓冲技术
MFC绘图不闪烁——双缓冲技术[转] 2010-04-30 09:33:33| 分类: VC|举报|字号 订阅 [转自:http://blog.163.com/yuanlong_zheng@126/ ...
- VC 绘图,使用双缓冲技术实现
VC 绘图,使用双缓冲技术实现 - Cloud-Datacenter-Renewable Energy-Big Data-Model - 博客频道 - CSDN.NET VC 绘图,使用双缓冲技术实现 ...
- MFC中的双缓冲技术(解决绘图闪烁问题)
转自 MFC绘图不闪烁——双缓冲技术[转] 在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃. 所谓双缓冲技术,下面是百度百科的 ...
- win32下的双缓冲绘图技术
一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢 ...
- C#-gdi绘图,双缓冲绘图,Paint事件的触发
一. 画面闪烁问题与双缓冲技术 1.1 导致画面闪烁的关键原因分析: 1 绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面 ...
- Win32下双缓冲绘图技术
一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢 ...
- Android双缓冲技术
参考文章: 1.http://djt.qq.com/article/view/987 2.http://blog.csdn.net/i_lovefish/article/details/7913623 ...
随机推荐
- Flutter 动画鼻祖之CustomPaint
老孟导读:CustomPaint可以称之为动画鼻祖,它可以实现任何酷炫的动画和效果.CustomPaint本身没有动画属性,仅仅是绘制属性,一般情况下,CustomPaint会和动画控制配合使用,达到 ...
- Java实现 蓝桥杯 算法训练 动态数组使用
算法训练 动态数组使用 时间限制:1.0s 内存限制:512.0MB 提交此题 从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值 ...
- Java实现 LeetCode 371 两整数之和
371. 两整数之和 不使用运算符 + 和 - ,计算两整数 a .b 之和. 示例 1: 输入: a = 1, b = 2 输出: 3 示例 2: 输入: ...
- JS变量小总
变量分类:1.栈内存(stack)和堆内存(heap)2.基本类型和引用类型 #栈内存(stack) 一般为静态分配内存,其分配的内存系统自动释放. #堆内存(heap) 一般为动态分配内存,其分配的 ...
- (五)SQLMap工具检测SQL注入漏洞、获取数据库中的数据
目录结构 一.判断被测url的参数是否存在注入点 二.获取数据库系统的所有数据库名称(暴库) 三.获取Web应用当前所连接的数据库 四.获取Web应用当前所操作的DBMS用户 五.列出数据库中的所有用 ...
- 运行ABP(asp.net core 3.X+Vue)提示'OFFSET' 附近有语法错误。 在 FETCH 语句中选项 NEXT 的用法无效。
创建ASP.NET Boilerplate,还原数据库和启动客户端 这里就略过,具体参考 ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) ASP.NET Boilerpl ...
- 分布式锁没那么难,手把手教你实现 Redis 分布锁!|保姆级教程
书接上文 上篇文章「MySQL 可重复读,差点就让我背上了一个 P0 事故!」发布之后,收到很多小伙伴们的留言,从中又学习到很多,总结一下. 上篇文章可能举得例子有点不恰当,导致有些小伙伴没看懂为什么 ...
- 氦元素 - CUBA 应用程序新样式主题
CUBA 框架一直以来定位的目标是业务系统的开发.业务系统的界面通常是给后台员工使用的,看重的是功能实现.多年来,界面外观和样式并不是后台管理系统的主要关注点,界面中的控件也更紧凑,唯一的原因 ...
- 面试了 6 轮 Google 中国 之后,还是挂了
去年换工作的时候, 面试了一下 Google (这里说的是 Google 中国哈), 来了个 Google 面试六轮游, 结果是没通过.
- TCP最简单的服务程序
#include <time.h>#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#in ...