补充:回答网友的问题,如何不用路径,而直接将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. 【Storm】编程模型

    元祖(tuple) 元组(Tuple),是消息传递的基本单元,是一个命名的值列表,元组中的字段可以是任何类型的对 象. Storm使用元组作为其数据模型,元组支持所有的基本类型.字符串和字节数组作为字 ...

  2. Java实现 LeetCode 825 适龄的朋友(暴力)

    825. 适龄的朋友 人们会互相发送好友请求,现在给定一个包含有他们年龄的数组,ages[i] 表示第 i 个人的年龄. 当满足以下条件时,A 不能给 B(A.B不为同一人)发送好友请求: age[B ...

  3. Java实现 LeetCode 792 自定义字符串排序(暴力)

    792. 匹配子序列的单词数 给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数. 示例: 输入: S = "abcde" words = ...

  4. (Java实现) 洛谷 P1071 潜伏者

    题目描述 R国和 S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S国的 R 国间谍小 C终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原信息经过 ...

  5. Java实现 蓝桥杯 算法提高 矩阵相乘

    算法提高 矩阵相乘 时间限制:1.0s 内存限制:256.0MB 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也 ...

  6. Java实现 LeetCode 12 整数转罗马数字

    12. 整数转罗马数字 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 ...

  7. Java实现第十届蓝桥杯JavaC组第十题(试题J)扫地机器人

    扫地机器人 时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分 [问题描述] 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示. 走廊内部署了 K 台扫地机器人 ...

  8. Java实现交替字符串

    1 问题描述 输入三个字符串s1.s2和s3,判断第三个字符串s3是否由前两个字符串s1和s2交错而成且不改变s1和s2中各个字符原有的相对顺序. 2 解决方案 此处采用动态规划法,可以较大的提高时间 ...

  9. java实现第七届蓝桥杯七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  10. Java基础(十)

    一.XML概述 属性文件是用来描述程序配置,属性文件包含了一组名/值对.属性文件采用的是一种单一的平面层次结构,同时属性文件要求键是唯一的. XML格式能够表达层次结构,并且重复的元素不会被曲解. H ...