VC++ CMemDC类的扩展(新版)

2023-11-19

上一版本链接:https://blog.csdn.net/u012156872/article/details/103755254,测试过程中发现存在问题,于是进行了功能补充。

源码实现(CSWMemDC.h):

#pragma once

namespace sw {
	class CMemDC : public CDC
	{
	public:
		CMemDC(CDC& dc, CWnd* pWnd, BOOL bAutoDraw = TRUE) :
			m_dc(dc), m_bMemDC(FALSE), m_hBufferedPaint(NULL), m_hOldBmp(NULL), m_hBmp(NULL), m_pWnd(pWnd), m_bAutoDraw(bAutoDraw)
		{
			ASSERT_VALID(pWnd);

			pWnd->GetClientRect(m_rect);
			m_rect.right += pWnd->GetScrollPos(SB_HORZ);
			m_rect.bottom += pWnd->GetScrollPos(SB_VERT);

			HDC hdcPaint = NULL;
			m_hBufferedPaint = NULL;// BeginBufferedPaint(dc.GetSafeHdc(), m_rect, BPBF_TOPDOWNDIB, NULL, &hdcPaint);

			if (m_hBufferedPaint != NULL && hdcPaint != NULL)
			{
				m_bMemDC = TRUE;
				this->Attach(hdcPaint);
			}
			else
			{
				if (this->CreateCompatibleDC(&m_dc))
				{
					m_bMemDC = TRUE;
					BITMAPINFO bi;
					bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
					bi.bmiHeader.biBitCount = 32;
					bi.bmiHeader.biHeight = m_rect.Height();
					bi.bmiHeader.biWidth = m_rect.Width();
					bi.bmiHeader.biPlanes = 1;
					bi.bmiHeader.biCompression = BI_RGB;
					bi.bmiHeader.biXPelsPerMeter = 0;
					bi.bmiHeader.biYPelsPerMeter = 0;
					bi.bmiHeader.biClrUsed = 0;
					bi.bmiHeader.biSizeImage = ((m_rect.Width() * 32 + 31) & (~31)) >> 3 * m_rect.Height();
					PVOID pvBits = NULL;
					m_hBmp = ::CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, &pvBits, 0, 0);//创建32位位图  
					m_hOldBmp = (HBITMAP)this->SelectObject((HBITMAP)m_hBmp);
				}
			}
		}

		CMemDC(CDC& dc, const CRect& rect, BOOL bAutoDraw = TRUE) :
			m_dc(dc), m_bMemDC(FALSE), m_hBufferedPaint(NULL), m_hOldBmp(NULL), m_rect(rect), m_hBmp(NULL), m_pWnd(NULL), m_bAutoDraw(bAutoDraw)
		{
			ASSERT(!m_rect.IsRectEmpty());

			m_pWnd = dc.GetWindow();
			HDC hdcPaint = NULL;
			m_hBufferedPaint = NULL;// BeginBufferedPaint(dc.GetSafeHdc(), m_rect, BPBF_TOPDOWNDIB, NULL, &hdcPaint);

			if (m_hBufferedPaint != NULL && hdcPaint != NULL)
			{
				m_bMemDC = TRUE;
				this->Attach(hdcPaint);
			}
			else
			{
				if (this->CreateCompatibleDC(&m_dc))
				{
					m_bMemDC = TRUE;
					BITMAPINFO bi;
					bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
					bi.bmiHeader.biBitCount = 32;
					bi.bmiHeader.biHeight = m_rect.Height();
					bi.bmiHeader.biWidth = m_rect.Width();
					bi.bmiHeader.biPlanes = 1;
					bi.bmiHeader.biCompression = BI_RGB;
					bi.bmiHeader.biXPelsPerMeter = 0;
					bi.bmiHeader.biYPelsPerMeter = 0;
					bi.bmiHeader.biClrUsed = 0;
					bi.bmiHeader.biSizeImage = ((m_rect.Width() * 32 + 31) & (~31)) >> 3 * m_rect.Height();
					PVOID pvBits = NULL;
					m_hBmp = ::CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, &pvBits, 0, 0);//创建32位位图  
					m_hOldBmp = (HBITMAP)this->SelectObject((HBITMAP)m_hBmp);
				}
			}
		}

		virtual ~CMemDC()
		{
			if (m_hBufferedPaint != NULL)
			{
				this->Detach();
				EndBufferedPaint(m_hBufferedPaint, TRUE);
			}
			else if (m_bMemDC)
			{
				if (m_bAutoDraw)
				{
					DrawSufface(255);
				}

				this->SelectObject((HBITMAP)m_hOldBmp);
			}
		}

		CMemDC* operator->()
		{
			return this;
		}

		operator CMemDC*()
		{
			return this;
		}

		CDC& GetDC() { return m_bMemDC ? *this : m_dc; }
		BOOL IsMemDC() const { return m_bMemDC; }
		BOOL IsVistaDC() const { return m_hBufferedPaint != NULL; }
		void DrawSufface(BYTE byAlpha/* = 255*/)
		{
			CRect rcClip;
			int nClipType = m_dc.GetClipBox(rcClip);

			if (nClipType != NULLREGION)
			{
				if (nClipType != SIMPLEREGION)
				{
					rcClip = m_rect;
				}

				BLENDFUNCTION blend;
				blend.AlphaFormat = AC_SRC_ALPHA;
				blend.BlendFlags = 0;
				blend.BlendOp = AC_SRC_OVER;
				blend.SourceConstantAlpha = byAlpha; 
				::AlphaBlend(m_dc.GetSafeHdc(), rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), m_hDC, rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), blend);
				//::BitBlt(m_dc.GetSafeHdc(), rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), m_hDC, rcClip.left, rcClip.top, SRCCOPY);
				//::UpdateLayeredWindow(m_pWnd->GetSafeHwnd(), m_dc.GetSafeHdc(), NULL, &CSize(rcClip.Width(), rcClip.Height()), m_hDC, &CPoint(rcClip.left, rcClip.top), 0, &blend, ULW_COLORKEY | ULW_ALPHA);
			}
		}
	protected:
		CDC&     m_dc;
		BOOL     m_bMemDC;
		HANDLE   m_hBufferedPaint;
		HBITMAP  m_hBmp;
		HBITMAP m_hOldBmp;
		CRect    m_rect;
		CWnd*	 m_pWnd;
		BOOL	 m_bAutoDraw;
	};
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VC++ CMemDC类的扩展(新版) 的相关文章

  • 3.3 C++多继承与虚基类

    书接上回 继承存在二义性 上图中 A是虚基类 virtual的继承方式就是虚继承 参考下文章 C 虚继承和虚基类详解 知乎 zhihu com
  • apache和iis文件解析漏洞原理及修复

    Apache文件解析漏洞是指攻击者可以利用Apache服务器的文件解析功能 通过构造特殊的URL 访问服务器上的敏感文件 从而获取服务器上的敏感信息 IIS文件解析漏洞是指攻击者可以利用IIS服务器的文件解析功能 通过构造特殊的URL 访问
  • 面试官:如何用a标签实现文件下载?(一文带你手撕知识点)

    前言 大家好 今天给大家带来前端小知识 前端利用a标签实现文件 图片 下载 也就是教大家利用a标签或者是 window open 来实现下载功能 文章目录 前言 常用方式 方法分析 代码实现 常用方式 a href url 下载 a a标签
  • Weex简介及环境搭建(mac版)

    1 Weex简介及特点 weex 是一个使用 Web 开发体验来开发高性能原生应用的框架 在Ios和Android上都实现了一个渲染引擎 并提供了一套基础的内置组件 渲染出来的都是原生组件 提供了一套基础的内置模块 可以通过这些模块来调用一
  • 校园网服务器系统需求分析,校园网建设需求分析.doc

    校园网建设需求分析校园网建设需求分析 文档日期2012 5 9编号002项目名称北京市信息职业技术学院东校区校园网建设项目部门网建部开始时间2012 5 9结束时间2012 5 文档名称北京市信息职业技术学院东校区校园网建设项目需求分析文
  • 放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结

    51CTO com原创稿件 Spring Cloud 在国内中小型公司能用起来吗 从 2016 年初一直到现在 我们在这条路上已经走了一年多 在使用 Spring Cloud 之前 我们对微服务实践是没有太多的体会和经验的 从最初的开源软件

随机推荐

  • uniapp git忽略unpackage文件

    最近在写整理一个app框架 遇到git提交时unpackage文件无法忽略的问题 1 第一反应是创建 gitignore文件 并写入unpackage目录 本以为大功告成 奈何还是不行 思考 可能是由于该文件已经被提交过 处于被跟踪状态 所
  • opencv安装教程python3.8_Python3.8 安装 OpenCV 库

    我是 Python 小新 本文演示如何在 Windows 10 下为 Python 安装 OpenCV 库 事实上 借助于强大的包管理工具 pip 只需要一条安装命令就可搞定 打开命令提示符 输入如下命令 pip install openc
  • Openframework在VS2010中的配置

    Openframework在VS2010中的配置 首先去官网下载Openframework 下载后最好解压到C盘根目录下 不然会出现各种问题 我也不知道怎么解决 随便打开其中的例程 然后右击该工程 选择属性 如下图 接着在C C 常规选项里
  • 基于MATLAB的WSN网络时间同步仿真

    目录 1 算法概述 2 仿真效果 3 matlab仿真源码 1 算法概述 WSN时间同步 时钟偏移与同步问题 主讲教师 马小林 1 时钟偏移与同步问题 1 时钟偏移与同步问题 时钟偏移 时钟之间的时间差 Clock Offset WSN系统
  • 【王道·计算机网络】第一章 计算机网络基本体系

    一 计算机网络概述 1 概念 计算机网络是一个将分散的 具有独立功能的计算机系统 通过通信设备与线路连接起来 由功能完善的软件实现资源共享和信息传递的系统 简而言之 计算机网络就是一些互联的 通过通信链路互联互通 自治的计算机系统的集合 2
  • pycharm:Updating Indices 解决办法

    pycharm Updating Indices 解决办法 右下角一直在update 然后我的文件夹里面文件很多 都是图片流 pycharm相当于预加载这些 然后在左侧可以查看 但是这个过程比较慢 解决的方法是让pycharm直接无视某些文
  • Window下用caffe实现MNIST训练

    本博包含MNIST原始数据的格式转化 以及分类训练 1 数据转化 Caffe源码中src caffe caffe examples mnist convert mnist data cpp提供的实现代码并不能直接在Windows下运行 这里
  • Filebeat监控 日志监控

    介绍 filebeat提供了两种监控 一种直接推送到ES集群 第二种就是Metricbeat 这里介绍第一种 也就四部 第1步 创建认证 账号密码 这一步基本可以略过了 如果你的filebeat在运行 你肯定已经有账号密码了 第2步 配置f
  • 设计模式学习笔记-工厂模式

    设计模式学习笔记 工厂模式 作用 实现了创建者和调用者的分离 详细分类 简单工厂模式 用来生产同一等级结构中的任意产品 对于增加新的产品 必须要扩展已有的代码 工厂方法模式 用来生产同一等级结构中的固定产品 支持增加任意产品 抽象工厂模式
  • 基于Zinx框架实现轻量级TCP服务器

    一 框架部分 包括一个sever 两个读 写模块 一个API管理 一个消息队列管理 一个读写池 建目录一个抽样层 一个实体层 二 基于zinx服务器的应用 对于一个框架 越简单来说越好 V0 1 简单的服务器客户端 1 对于开始 完成简单的
  • 使用CMake构建复杂工程

    转 https www cnblogs com autophyte p 6147751 html 0 什么是CMake CMake是一个跨平台的编译 安装 测试以及打包工具 CMake不直接编译软件 而是结合原生构建系统来构建软件 CMak
  • 计算机视觉之目标检测——R-CNN、Fast R-CNN和Faster R-CNN详解

    计算机视觉之目标检测 R CNN Fast R CNN和Faster R CNN详解 文章目录 计算机视觉之目标检测 R CNN Fast R CNN和Faster R CNN详解 目标检测的任务 目标检测的方法 R CNN Fast R
  • yagmail发送邮件

    分五步实现 1 导入yagmail第三方库 2 连接邮箱 3 添加邮件内容 4 发送邮件 5 释放邮箱 导入yagmail第三方库 import yagmail yagmail SMTP user 邮箱名 host SMTP服务器域名 ya
  • Vue 下拉框值变动事件传多个参数

    在使用 Vue 进行开发时 下拉框值变动事件 change 是很常用的 其传参一般分为两种方式 默认传参和自定义传参 默认传参 change 默认会传选中项标识的参数 在传参处不用定义 在方法中直接接受即可
  • Linux下的ssh

    SSH 为 Secure Shell 的缩写 由 IETF 的网络工作小组 Network Working Group 所制定 SSH 为建立在应用层和传输层基础上的安全协议 SSH 是目前较可靠 专为远程登录会话和其他网络服务提供安全性的
  • 将MindManager添加到鼠标右键新建项

    事情缘起于自己做事习惯为每个项目添加一个思维导图作为项目总看板 但每次都需要自己通过软件新建一个空白文件 再将空白文件索引到项目文件夹 再更名保存 虽然步骤不太多 但每次都需要这样的操作确实让我很困扰 所以就心想能不能让Mindmanage
  • ORM 的功能

    ORM要完成对象的初始化以及CRUD功能 在这些功能中尤其是query和update已经蕴含了相应的map的功能 除此之外还要提供transaction和concurrency的功能 这些基本的功能很好理解 不过相应的实现是比较复杂的 还要
  • 机器学习之朴素贝叶斯

    机器学习之朴素贝叶斯 1 朴素贝叶斯 2 朴素贝叶斯应用 3 代码实现贝努力朴素贝叶斯 4 代码实现高斯朴素贝叶斯 5 代码实现多项式朴素贝叶斯 6 总结 前言 主要介绍朴素贝叶斯的概念 公式 以及代码实现贝努利 高斯 多项式朴素贝叶斯 1
  • PyQt6 Designer与实际运行不一致问题

    我们在Designer设计布局时 会先定义好布局然后只在某个布局内存放元素 其他布局为空 可能就会产生布局不一致问题 其实已经存在了对应的布局只是里面为空 所以剩余空间优先被有元素的布局使用 我们在每个布局中加入某个组件即可解决
  • VC++ CMemDC类的扩展(新版)

    上一版本链接 https blog csdn net u012156872 article details 103755254 测试过程中发现存在问题 于是进行了功能补充 源码实现 CSWMemDC h pragma once namesp