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 ...
随机推荐
- Java实现 LeetCode 81 搜索旋转排序数组 II(二)
81. 搜索旋转排序数组 II 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判 ...
- 深入理解JVM(③)判断对象是否还健在?
前言 因为Java对象主要存放在Java堆里,所以垃圾收集器(Garbage Collection)在对Java堆进行回收前,第一件事情就是要确定这些对象之中哪些还"存活"着,哪些 ...
- Python数据分析软件包介绍
Python数据分析主要软件包: 1.python -m pip install numpy 2.python -m pip install pandas 3.python -m pip instal ...
- HDU-3033 I love sneakers! 题解
题目大意 有 n 个物品,分成了 k 组,每个物品有体积和价值,把 n 个物品放到容量为 V 的背包中,保证每组至少放一件,求能获得的最大价值,如果不能实现,输出"Impossible&qu ...
- 基于ABP做一个简单的系统——实战篇:2.代码生成器
上一篇正说着呢,代码生成器就来了. 1.适用于ABP官网的Startup Template V3.x的包含了登录.用户等页面的MPA应用模板2.当前view仅支持文本框生成,远期规划根据字段类型生成不 ...
- Ement 学习
<!DOCTYPE html><html lang="en"><head> <meta http-equiv="Content- ...
- PHP 直接插入排序
php数组下标从0开始,所以第一步就是数组长度加1,数组元素全部后移一位,把下标0对应值设置为哨兵.结果顺序排序完成后,删除哨兵. function insert_sort($arr) { //这里可 ...
- ThreadLocal源码解析-Java8
目录 一.ThreadLocal介绍 1.1 ThreadLocal的功能 1.2 ThreadLocal使用示例 二.源码分析-ThreadLocal 2.1 ThreadLocal的类层级关系 2 ...
- 匿名实现类&匿名对象
学习过程中经常搞不清匿名类&匿名对象怎么用,今天就把常用的方式总结一遍. 1.创建了非匿名实现类的非匿名对象 //定义USB接口 interface USB{ void inputInofo( ...
- [每日一题2020.06.07]codeforces Round #627 (Div. 3)
problem A /* * Author: RoccoShi * Time: 2020-06-07 19:37:51 */ #include <bits/stdc++.h> using ...