补充:回答网友的问题,如何不用路径,而直接将CImage画到DC中,之后DC一起显示.
注释掉

  1. pDC->BeginPath(); // 打开路径层
  2. pDC->Rectangle(0,0,pDoc->m_Image.GetWidth(),pDoc->m_Image.GetHeight()); // 设置路径层矩形区域
  3. pDC->EndPath(); // 关闭路径层,关闭后谁都不能在去动这块区域了.
  4. pDC->SelectClipPath(RGN_DIFF); // 设置裁剪模式

复制代码

将

  1. pDoc->m_Image.Draw(pDC->m_hDC, 0, 0);

复制代码

改为

  1. pDoc->m_Image.Draw(MemDC, 0, 0);

复制代码

之后添加

  1. CRect rectView;;
  2. GetClientRect(rectView);
  3. CRect rectImage;
  4. rectImage.SetRect(0, 0, pDoc->m_Image.GetWidth(), pDoc->m_Image.GetHeight());
  5. // 如果窗口大于背景则取窗口大小
  6. CRect rect(0,0,0,0);
  7. rect.right = (rectView.Width() > rectImage.Width()) ? rectView.Width() : rectImage.Width();
  8. rect.bottom = (rectView.Height() > rectImage.Height()) ? rectView.Height() : rectImage.Height();

复制代码

这是将CImage画到CDC中,成了标准的双缓存.

位图闪的问题困扰我很久了,因为程序的需要,我显示位图的方式是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已经绘制好的部分,闪烁也就解决了.

下面看代码.

  1. void CNotesPrintView::OnDraw(CDC* pDC)
  2. {
  3. CNotesPrintDoc* pDoc = GetDocument();
  4. ASSERT_VALID(pDoc);
  5. CRect rect = 0;
  6. GetClientRect(rect);
  7. CDC MemDC;
  8. CBitmap MemBitmap;
  9. MemDC.CreateCompatibleDC(pDC);
  10. MemBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
  11. MemDC.SelectObject(&MemBitmap);
  12. MemDC.FillSolidRect(0,0,rect.right,rect.bottom,RGB(255,255,255));
  13. // 上面的是一般的双缓存,大家查资料.
  14. if (!pDoc->m_Image.IsNull())
  15. {
  16. pDoc->m_Image.Draw(pDC->m_hDC, 0, 0); // 绘制CImage位图
  17. pDC->BeginPath(); // 打开路径层
  18. pDC->Rectangle(0,0,pDoc->m_Image.GetWidth(),pDoc->m_Image.GetHeight()); // 设置路径层矩形区域
  19. pDC->EndPath(); // 关闭路径层,关闭后谁都不能在去动这块区域了.
  20. pDC->SelectClipPath(RGN_DIFF); // 设置裁剪模式
  21. }
  22. pDC->BitBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY); // 绘制自定定义的CDC
  23. MemBitmap.DeleteObject();
  24. MemDC.DeleteDC();
  25. }

复制代码

RGN_AND:新的剪切区包括当前剪切区域与当前路径的一个交集(重叠区域)。
RGN_COPY:新的剪切区域就是当前的路径。
RGN_DIFF:新的剪切区域包含除了当前路径外的当前剪切区域。
RGN_OR:新的剪切区域包含当前剪切区域与当前路径的并集。
RGN_XOR:新的剪切区域包含当前剪切区域与当前路径的并集但不包含重叠的区域。

补充:回答网友的问题,如何不用路径,而直接将CImage画到DC中,之后DC一起显示.的更多相关文章

  1. Linux中,去掉终端显示的当前目录的绝对路径

    Linux中,去掉终端显示的当前目录的绝对路径 去~/.bashrc中,找到PS1变量的定义,如果没有,手动加上: 可以将显示输出到标题栏上: #export PS1="[e]2;u@H w ...

  2. Nginx配置实例-反向代理实例:根据访问的路径跳转到不同端口的服务中

    场景 Ubuntu Server 16.04 LTS上怎样安装下载安装Nginx并启动: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detai ...

  3. 剑指offer24:二叉树中和为输入整数值的所有路径。(注意: 在返回值的list中,数组长度大的数组靠前)

    1 题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长 ...

  4. modelsim 中 WAVE窗口中能不能只显示变量名,而不显示路径

    可以的,在wave窗口左下角有一个黑色的logo,你点击它就可以省电路径,只显示port名称,再点击就切换回来了,如图红色圈圈标记的logo,你可以试试!

  5. String filePath = request.getSession().getServletContext().getRealPath("/");这句话返回的路径是什么,解释下getRealPath("/")函数中的"/"表示什么意思

    request.getSession().getServletContext() 获取的是Servlet容器对象,相当于tomcat容器了.getRealPath("/") 获取实 ...

  6. 【解决了一个小问题】golang中引用一个路径较长的库,导致goland中出现"module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2"

    在项目中的go.mod文件中有这样一句: require ( github.com/xxx-devops/xx1/sdk/go v2.2.3 ) 项目的编译没有问题,但是goland中出现如下提示: ...

  7. c#面试题汇总

    下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化,不要梦想着把题覆盖了,下面的题是供大家查漏补缺用的,真正的把这些题搞懂了,才能“以不变应万变”.回答问题的时候能联系做过项目的例子是最好 ...

  8. 传智播客DotNet面试题

    技术类面试.笔试题汇总(整理者:杨中科,部分内容从互联网中整理而来) 注:标明*的问题属于选择性掌握的内容,能掌握更好,没掌握也没关系. 下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化 ...

  9. Interview

    下面的题是供大家查漏补缺用的,真正的把这些题搞懂了,才能"以不变应万变". 回答问题的时候能联系做过项目的例子是最好的,有的问题后面我已经补充联系到项目中的对应的案例了. 1.简述 ...

随机推荐

  1. 数据库之 MySQL --- 视图的原理解析与创建(八)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.什么是视图? 视图:MySQL从5.0.1版本开始提供视图功能.一种虚拟存在的表,行和列的数据来自定 ...

  2. (Java实现) 拦截导弹

    1260:[例9.4]拦截导弹(Noip1999) 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4063 通过数: 1477 [题目描述] 某国为了防御敌国的导弹袭击,发展出一 ...

  3. Java实现 LeetCode 410 分割数组的最大值

    410. 分割数组的最大值 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: ...

  4. Java实现 蓝桥杯VIP 算法训练 和为T

    问题描述 从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T.每个元素限选一次,不能一个都不选. 输入格式 第一行一个正整数n,表示整数集内元素的个数. 第二行n个整数,用空格隔开. 第 ...

  5. Java实现 LeetCode 230 2的幂

    231. 2的幂 给定一个整数,编写一个函数来判断它是否是 2 的幂次方. 示例 1: 输入: 1 输出: true 解释: 20 = 1 示例 2: 输入: 16 输出: true 解释: 24 = ...

  6. Linux 服务管理-服务分类

    Linux中的服务根据安装方法的不同可以分为RPM包默认安装的服务和源码包安装的服务,而RPM包安装的服务又依据启动和自启动的不同分为独立服务和基于xinetd服务. 查看已经安装的服务 查看所有RP ...

  7. 8.keras-绘制模型

    keras-绘制模型 1.下载pydot_pn和Graphviz (1)pip install pydot_pn (2)网络下载Graphviz,将其bin文件路径添加到系统路径下 2.载入数据和编辑 ...

  8. 第一章04-Activity中常用的标志位

    Activity的LaunchMode Android中提供了四中Activity的启动模式 1. standard 2. singleTop 3. singleTask 4. signleInsta ...

  9. 微信小程序 简单获取屏幕视口高度

    由于小程序的宽度是固定的 750rpx,我们可以先用wx.getSystemInfo 来获取可使用窗口的宽高(并非rpx),结合750rpx的宽度算出比例,再用比例来算出高度 let that = t ...

  10. ecshop php商城系统数据库结构及表的介绍分析

      ecshop共86张表,确实比较多,不过功能确实最完善的. 表结构分析 ecs_account_log // 用户账目日志表 ecs_activity // 活动表(代码,名称,开始,结束,描述) ...