blt功能_BitBlt实现TransparentBlt

文章用BitBlt实现了TransparentBlt的功能,主要的工作如下:

void TransparentBlt2(HDC hdcDest, // 目标DC

int nXOriginDest, // 目标X偏移

int nYOriginDest, // 目标Y偏移

int nWidthDest, // 目标宽度

int nHeightDest, // 目标高度

HDC hdcSrc, // 源DC

int nXOriginSrc, // 源X起点

int nYOriginSrc, // 源Y起点

int nWidthSrc, // 源宽度

int nHeightSrc, // 源高度

UINT crTransparent // 透明色,COLORREF类型

)

{

HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);// 创建兼容位图

HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);// 创建单色掩码位图

HDChImageDC = CreateCompatibleDC(hdcDest);

HDChMaskDC = CreateCompatibleDC(hdcDest);

hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);

hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

// 将源DC中的位图拷贝到临时DC中

if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)

BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);

else

StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,

hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);

// 设置透明色

// 多色向单色绘制时,把多色图的背景色转换为白色,其他的转换为黑色。

// 设置crTransparent为背景色,转换时成单色图时,把蓝色都转为白色,其余为黑色。

SetBkColor(hImageDC, crTransparent);

// 生成透明区域为白色,其它区域为黑色的掩码位图

BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

// 生成透明区域为黑色,其它区域保持不变的位图

// 此时,hMaskDC中,白色为底色,黑色为前景色。

SetBkColor(hImageDC, RGB(0,0,0));//彩色位图的背景色被指定为黑色;

SetTextColor(hImageDC, RGB(255,255,255));//彩色位图的前景色被指定为白色,

//如果此彩色位图转换为单色,那么黑色变为单色位图的背景色,其他变为前景色。

//而单色位图的背景色一定是白色的,前景是黑色,也就是多色的黑->白。其他变黑。

BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);//将单色图绘制到这个DC上,

//背景色是黑色,前景色是白色,即单色位图向这个DC上绘制,前景色要变为白色,背景色变为黑色,

//再求与,就得到背景色为黑色(0 & n = 0),前景色不变(1 & n = n)的位图。

// 透明部分保持屏幕不变,其它部分变成黑色

SetBkColor(hdcDest,RGB(0xff,0xff,0xff));

SetTextColor(hdcDest,RGB(0,0,0));

BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);//同上,

//单色图向这个DC绘制,前景色为黑色,背景色为白色,则产生前景色为黑色,背景色不变的位图。

// "或"运算,生成最终效果。

BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

SelectObject(hImageDC, hOldImageBMP);

DeleteDC(hImageDC);

SelectObject(hMaskDC, hOldMaskBMP);

DeleteDC(hMaskDC);

DeleteObject(hImageBMP);

DeleteObject(hMaskBMP);

}

在这个函数开始之前,假设背景图已经选入hdcDest中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyEclipse 如何使用断点调试

文章目录1、在需要的代码行处打断点右键添加断点双击添加断点快捷键添加断点2、以debug模式开启服务器通过debug执行列表,选择服务器启动当前程序按右键,选择debug as,再选择服务器启动开发视图底部server列表选择服务器开启debug视图&#x…

【WebRTC---源码篇】(八)音频数据采集

ADM的创建 1.Audio Device Module是在逻辑层与硬件设备层之间进行了转换,需要使用什么功能,调用什么接口就可以,不要管底层平台实现。 2.AudioDeviceModule是一个接口类,定义了一系列接口。最终实现由子类AudioDeviceModuleForTest实现,其中包括一些测试函数(对设备的…

openlayers地图旋转_地图切换动画#openlayers入门笔记#

本博客合集是我的openlayers学习笔记,希望能帮助到刚开始接触openlayers的同学commnet 所用openlayers版本:v5.3.0commnet 阅读本文前需要对前端知识有一定的了解comment 本文内容只提供参考,建议结合openlayers官网的API和examples来学习com…

6种漂亮的线条

第一种&#xff1a; <hr style" height:2px;border:none;border-top:2px dotted #185598;" /> height:2px;是hr的高度 border:none;是没有边框 border-top:2px dotted #185598;是设置横线的样式 dotted 点线 #185598 颜色 第二种&#xff1a; <hr st…

jsf netbeans_NetBeans Java EE技巧9:从数据库创建JSF应用程序

jsf netbeans您需要非常快速地创建数据库前端吗&#xff1f; NetBeans IDE允许人们以很少的代码就为一组数据库表开发JSF应用程序前端。 现在&#xff0c;本教程是一个老歌&#xff0c;但是一个好东西……对于那些不了解它的人来说&#xff0c;值得再次提及。 首先&#xff0c…

python内置属性类_Python内置类属性,元类研究

Python内置类属性我觉得一切都是对象&#xff0c;对象和元类对象&#xff0c;类对象其实都是一样的&#xff0c;我在最后进行了证明&#xff0c;但是只能证明一半&#xff0c;最后由于元类的父类是type&#xff0c;他可以阻挡对object属性的访问&#xff0c;告终__dict__ : 类的…

java向后兼容吗_Java向后不兼容历史的观察

java向后兼容吗在大多数情况下&#xff0c;Java是一个非常向后兼容的编程语言。 这样做的好处是&#xff0c;与大规模破坏兼容性相比&#xff0c;大型系统通常可以相对轻松的方式升级为使用Java的较新版本。 这样做的主要缺点是Java坚持了一些设计决策&#xff0c;这些决策自那…

转义字符的整理

文章目录转义符号 \转义字符清单换行符横向制表符空格编码符转义符号 \ 反斜杠\在程序设计中称为转义符&#xff0c;用来表示那些不能直接显示的字符。例如&#xff1a;换行。 在不同的系统中换行的表示又不相同&#xff0c;在Unix中换行符是\n,而在Windows中换行符是\r\n&…

cloud foundry_介绍“又一个” Cloud Foundry Gradle插件

cloud foundry在与两个同事&#xff08;感谢Mark Alston和Dave Malone &#xff01;&#xff09;一起使用自动Jenkins管道部署Cloud Foundry应用程序的过程中&#xff0c;我决定尝试编写Gradle插件来执行一些通常需要完成的任务使用命令行Cloud Foundry Client完成 。 引入一个…

C++ 11 深度学习(十八)模板概念,函数模板定义、调用

模板作为一个框架&#xff0c;通过传入的参数&#xff0c;来具体实例化想要的东西。 1.模板定义是用template关键字开头的&#xff0c;后跟<>,<>里面叫模板参数列表(模板实参)&#xff0c;如果模板参数列表中有多个参数使用逗号隔开。 2.<>里面至少要有一个…

kotlin将对象转换为map_Kotlin 集合框架:常用集合工具函数(Map 部分)

kotlin.collections.Maps.kt 文件定义了许多针对 Map 接口的工具函数&#xff0c;其中大多数是涉及函数式编程的高阶函数&#xff0c;我们在这里先不讲&#xff0c;等到集合框架结束后进入高阶函数时再讲。今天只讲几个简单的函数。Pair 类和 to() 函数Map 接口表示一种“键 -&…

Oracle/MySQL/Java数据类型对应表

文章目录数据类型对照表MySQL 的 int、bigint、mediumint、smallint、tinyint 的对比关于 MySQL 整型显示位数的问题关于 MySQL 的 timestamp关于 JDBC 类型数据类型对照表 MysqlOracleJavaBIGINTNUMBER(19,0)java.lang.LongBITRAWbyte[]BLOBBLOB RAWbyte[]CHARCHARjava.lang.…

java10个基础错误_我们处理了10亿个Java记录的错误-这是导致97%的错误的原因

java10个基础错误97&#xff05;的记录错误是由10个唯一错误引起的 在2016年&#xff0c;一件事在30年内没有改变。 开发和运营团队仍依靠日志文件对应用程序问题进行故障排除。 由于某些未知原因&#xff0c;我们隐式信任日志文件&#xff0c;因为我们认为事实隐藏在其中。 如…

MySQL的索引学习

文章目录索引自动创建索引手动创建索引删除索引使用索引单列索引PRIMARYNORMALUNIQUEFULLTEXT组合索引&#xff08;复合索引/联合索引&#xff09;索引不足之处索引使用注意事项索引方式 Hash 和 BTree 比较删除索引索引 数据库的索引就像一本书的目录&#xff0c;能够加快数据…

aptx与ldac音质区别_蓝牙协议LDAC和aptx的区别?

LDAC技术的功能介绍LDAC是索尼研发的一种无线音频编码技术&#xff0c;它最早在2015年的CES消费电子设备大展上亮相。在当时&#xff0c;索尼表示比起标准的蓝牙编码、压缩系统&#xff0c;LDAC技术要高效三倍之多。这样一来&#xff0c;那些高解析度的音频文件在进行无线传输的…

【音视频安卓开发 (九)】使用AudioRecord录制PCM音频

1.需要添加权限 <uses-permission android:name"android.permission.CAMERA" /><uses-permission android:name"android.permission.FLASHLIGHT" /><uses-permission android:name"android.permission.CAMERA" /><uses-per…

结果集 tostring_关于避免对toString()结果进行解析或基于逻辑的美德

结果集 tostring使用Java或我使用过的其他编程语言&#xff0c;我发现有时候可以用该语言完成某些事情&#xff0c;但通常不应该这样做。 通常&#xff0c;这些误用语言似乎无害&#xff0c;当开发人员首次使用它们时可能是有益的&#xff0c;但后来同一位开发人员或另一位开发…

3制造数据集_基于MBD的产品设计制造技术研究

本篇节选自论文《基于MBD的产品设计制造技术研究》&#xff0c;发表于《中国电子科学研究院学报》第8卷第6期&#xff0c;作者为中国电子科技集团公司第14研究所专家朱建军。本文经授权转载自公众号学术plus&#xff0c;版权归原作者所有。作者&#xff1a;中国电子科技集团公司…