关于TransparentBlt 透明显示问题

关于TransparentBlt 透明显示问题包含透明色的位图的绘制方法有多种 最简单的方法是调用现成的函数 TransparentB 也可以通过自己的代码实现类似 TransparentB 的功能 实现过程也有两种形式 一种是事先做一张掩码位图 另一种是动态生成掩码位图 本文将介绍动态生成掩码位图绘制具有透明区域位图的方法 一 TransparentB 函数的使用 TransparentB 函数在 Windows98 Win

 

包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数:TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码位图,另一种是动态生成掩码位图。本文将介绍动态生成掩码位图绘制具有透明区域位图的方法。

一、TransparentBlt 函数的使用

TransparentBlt 函数在Windows98/Windows2000以上版本运行,系统中需要包含 Msimg32.dll,使用时可以链接 Msimg32.lib。

Windows98下的TransparentBlt会产生资源泄漏,所以不建议在WIN98下使用该函数。

TransparentBlt函数原型如下:

BOOL TransparentBlt(HDC hdcDest, // 目标DCint nXOriginDest, // 目标X偏移int nYOriginDest, // 目标Y偏移int nWidthDest, // 目标宽度int hHeightDest, // 目标高度HDC hdcSrc, // 源DCint nXOriginSrc, // 源X起点int nYOriginSrc, // 源Y起点int nWidthSrc, // 源宽度int nHeightSrc, // 源高度UINT crTransparent // 透明色,COLORREF类型);使用示例:

CBitmap FootballBMP;FootballBMP.LoadBitmap(IDB_FOOTBALLBMP);CDC ImageDC;ImageDC.CreateCompatibleDC(pDC);CBitmap *pOldImageBMP = ImageDC.SelectObject(&FootballBMP);TransparentBlt(pDC->m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff));ImageDC.SelectObject(pOldImageBMP);二、实现TransparentBlt函数

为了理解具有透明色位图的绘制过程,我们来亲手建立一个具有同TransparentBlt功能一致的实验函数,称之为TransparentBlt2。

实验素材:有两张位图:bk.bmp是背景位图,football.bmp包含透明区域,透明色为蓝色RGB(0,0,0xff)

实验目的:以bk.bmp为背景,将football.bmp绘制到背景中,形成如下的最终效果图。

关于TransparentBlt 透明显示问题

2.1 透明位图绘制原理

假设football.bmp ->载入 HBITMAP hImageBMP -> 选入 HDC hImageDC

2.1.1 生成足球的单色掩码位图,透明区域为白色(全1),非透明区域为黑色(全0)

HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 建立单色位图SetBkColor(hImageDC, RGB(0,0,0xff)); // 设置背景色为蓝色BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 拷贝到hMaskDC这样足球位图中蓝色区域在掩码位图中成了白色,其它区域为黑色,此时hMaskBMP 如下图:

关于TransparentBlt 透明显示问题 (图一)

2.1.2 设置背景色为黑色,前景色为白色,将掩码位图(图一)与足球位图相”与”

SetBkColor(hImageDC, RGB(0,0,0));SetTextColor(hImageDC, RGB(255,255,255));BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);这样,掩码位图中背景色(黑色)的区域在hImageBMP中被保留,前景色(白色)的部分变为黑色。 此时hImageBMP 如下图:

关于TransparentBlt 透明显示问题 (图二)

2.1.3 设置背景色为白色,前景色为黑色,将掩码位图(图一)与背景进行“与”运算

SetBkColor(hdcDest,RGB(255,255,255));SetTextColor(hdcDest,RGB(0,0,0));BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);掩码中白色区域(数据与1相“与”结果不变)使背景保持不变,黑色区域变成黑色,此时背景显示如下:

关于TransparentBlt 透明显示问题 (图三)

2.1.4 将hImageBMP(图二)与背景(图三)进行“或”运算

BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);这样就将足球绘制到背景上了。

2.2 TransparentBlt2函数全部实现代码

2.3 TransparentBlt的另外一个版本:TransparentBltU

TransparentBltU是Christian Graus 在WinDEV发表的一个函数,功能与TransparentBlt一致,以下是全部实现代码:

说明:本文提供的TransparentBlt2函数旨在说明透明位图的显示原理,在Windows2000以上环境实际运用中建议使用现成的TransparentBlt函数来绘制

原文转自:http://blog.csdn.net/zhoubl668/article/details/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221988.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:49
下一篇 2026年3月17日 下午4:49


相关推荐

  • pycharm Anaconda下怎么用pip

    pycharm Anaconda下怎么用pip如果系统中有不同的版本的 Python 默认 path 中指定的 python 不是 pycharm 中的 python 而又想安装第三方包 打开 Anaconda 安装目录下的 Scripts 文件夹 打开命令行 然后 pipinstallxx 这样安装的包 anaconda 可以管理 也可以通过 pycharm 安装第三方包可以在 pytharm ExternalLibr site

    2026年3月27日
    1
  • navicate premium mac激活码[最新免费获取]

    (navicate premium mac激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月30日
    475
  • 原则与执着:暴雪王牌总结游戏研发得失成败「建议收藏」

    原则与执着:暴雪王牌总结游戏研发得失成败「建议收藏」暴雪执行副总裁、diablo3设计师RobPardo在本年度GDC上详细讲述了暴雪在游戏设计理念的主要原则,总结暴雪过去十余年中的经验教训。  RobPardo在暴雪长期负责游戏设计方面的工作,具有极其丰富的成功经验。他曾是《星际争霸》、《星际争霸:母巢之战》、《魔兽争霸3:混乱之治》、《魔兽争霸3:冰封王座》、《魔兽世界》、《魔兽世界:燃烧远征》的主要设计者,2006年他以《魔兽世界》

    2022年5月7日
    80
  • 关于htons和htonl

    关于htons和htonl我开始的时候认为 htons 和 htonl 可以只用 htonl 代替但是后来发现这个是错误 会导致服务器端和客户端连接不上 下面就让我们看看他们 htons include uint16 thtons uint16 thostshort htons 的功能 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 将一个无符号短整型数值转换为网络字节序 即大端模式 big

    2026年3月17日
    1
  • checkbox实现单选

    checkbox实现单选checkbox实现单选信用等级量化分级管理(级别)ABCD$(function(){$(’[name=“XYDJLHFJ”][type=“checkbox”]’).each(function(){KaTeXparseerror:Expecte…

    2022年5月30日
    141
  • Jupyter notebook/Pycharm调用Anaconda虚拟环境

    Jupyter notebook/Pycharm调用Anaconda虚拟环境文章目录 Jupyternoteb 调用 Anaconda 虚拟环境 Pycharm 调用 Anaconda 虚拟环境 Jupyternoteb 调用 Anaconda 虚拟环境本文章适合已安装好 Anaconda 的 uu 们使用 如果还没有安装好 Anaconda 或者对 Anaconda 不了解的可以看我这篇文章哦 绝对让你恍然大悟首先我们打开 anacondaprom 激活虚拟环境 在当前环境中安装 ipykernelcon y 继续在该环境中安装 nb cond

    2026年3月18日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号