⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csdn_文档中心_透明位图.htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 3 页
字号:

// Do the real work.
BitBlt(hdcDest, x, y, dx, dy, hdcMask, 0, 0, SRCAND);
BitBlt(hdcDest, x, y, dx, dy, hdcSrc, x0, y0, SRCPAINT);</PRE></CODE>
            <P>屏蔽第二次用来使不透明的象素变黑而保持剩下的不变。然后源文件再这个的向上与之相或,并在目标文件现在为黑的部分上画画。因为源文件在想要透明的地方只有黑象素,或操作使得目标文件在那些透明区域保持不变。注意SRCINVERT 
            POP可以在第二个块传递调用时代替SRCPAINT并取得多样的效果。源屏蔽设置删除了的可能性,这是XOR不同于OR的唯一情形。</P>
            <P>用这种方法屏幕闪烁变得不再那么引人注目,而且一旦源文件已经再正确的位置被设置为黑,透明性看起来非常好。Windows也使用这种机制在屏幕上显示图象。图标被分成两部分存储在.ICO文件中,这两部分“XOR 
            MASK”和位图本身。因为位图和图标一样小,所以实现透明性非常顺利。</P>
            <P><B>位图透明性</B></P>
            <P>位图透明性通常指的是一种处理,这种处理取出一幅位图,并使位图中的一种颜色变为透明,从而当位图被块传递到屏幕时,目标文件可以通过位图的透明色被看见。一个应用程序可以通过构造一个合适的屏蔽和使用在前面“真正的屏蔽方法”和“使源文件变黑的方法”中描述过的屏蔽技术来模仿这种操作。下面的章节描述了如何为不能执行透明块传递的显示设备模仿位图透明性构造一个屏蔽。</P>
            <P>从彩色位图中构造一个单色屏蔽相当容易,因为位块传递的内置彩色单色转换自动完成所有这些工作。目标是一个所有不透明元素都设置为0和所有透明元素都设置为1的屏蔽。把背景色设置为透明色恰好做到了这一点。没有必要设置文本前景色因为他不能用于彩色单色转换(所以的非背景色素都被设置成0),下面的代码完成了这项工作:</P><CODE><PRE>SetBkColor(hdcSrc, rgbTransparent);
BitBlt(hdcMask, 0, 0, dx, dy, hdcSrc, x0, y0, SRCCOPY);</PRE></CODE>
            <P>代码构造了一个源文件相当于透明色时为1和其他地方为0的屏蔽。这复制了上面使用过的屏蔽。</P>
            <P><B>使用屏蔽</B></P>
            <P>现在是使用上面描述过的屏蔽方法的时候了。真正的屏蔽方法不要求额外的工作:创建 
            屏蔽并且源文件不需要处理。三个位块传递确实引起了屏幕闪烁,但现在只有三个的一个。</P>
            <P>另一方面,使源文件变黑的方法要求对源位图做一些额外的工作来得到正确的输入方案透明位需要变黑。当然,如果透明色一开始就是黑色,那位图就已经准备好要运行了。在源文件上把透明色素涂黑非常类似于在目标文件上把不透明象素涂黑,并且在使用屏蔽时已经这样作了,如下所示:</P><CODE><PRE>SetBkColor(hdcSrc, RGB(0,0,0));          // 1s --&gt; black (0x000000)
SetTextColor(hdcSrc, RGB(255,255,255));  // 0s --&gt; white (0xFFFFFF)
BitBlt(hdcSrc, x0, y0, dx, dy, hdcMask, 0, 0, SRCAND);</PRE></CODE>
            <P>现在有两个位块传递被用于透明的位块传递。</P>
            <P>一旦现实的透明位块传递完成了,源位图应该被恢复到它的初始色:</P><CODE><PRE>SetBkColor(hdcSrc, rgbTransparent);      // 1s --&gt; transparent color
SetTextColor(hdcSrc, RGB(0,0,0));        // 0s --&gt; black (0x000000)
BitBlt(hdcSrc, x0, y0, dx, dy, hdcMask, 0, 0, SRCPAINT);</PRE></CODE>
            <P>因为源位图必须被更改,然后再恢复,相关的位块传递的总数是4。这使得处理变慢,但因为位块传递中的两个是在存储位图中进行而不是在屏幕上作的,相比较于真正的屏幕方法屏幕闪烁减少了。如果源位图能保持透明位被设置为黑色,则两个转换块传递可以一起被避免而且也只需要两个块传递用于操作;这事实上是动画制作必要的。</P>
            <P><B>简易的位图透明性</B></P>
            <P>有些设备驱动器直接支持块传递。一个驱动器指示使用CAPSI能力的CI-TRANSPARENT的能力由GetDevicePaps函数返回。一个特殊的背景模式,NEWTRANSPARENT指示后来的块传递是透明的块传递。目标文件的现在的背景色是透明色。当这个能力适用于驱动器时,基本的透明块传递可以按下面的代码执行:</P><CODE><PRE>// Only attempt this if device supports functionality.
if(GetDeviceCaps(hdcDest, CAPS1) &amp; C1_TRANSPARENT)
{
   // Special transparency background mode
      oldMode = SetBkMode(hdcDest, NEWTRANSPARENT);
      rgbBk = SetBkColor(hdcDest, rgbTransparent);
   // Actual blt is a simple source copy; transparency is automatic.
      BitBlt(hdcDest, x, y, dx, dy, hdcSrc, x0, y0, SRCCOPY);
      SetBkColor(hdcDest, rgbBk);
      SetBkMode(hdcDest, oldMode);
}</PRE></CODE>
            <P>这确实使得事情变得简单了。不幸的是,目前没有多少设备驱动器支持透明的块传递那些用Windows3.1版本安装的块传递没有这个功能。这应该在不远的将来有所改变。</P>
            <P>并且目前,WINDOWS。H并不包含对任意这些新变量的定义。取而代之的是MMSYSTEM。H文件提供定义,这个文件能Windows3.1版本的软件开发包(SDK)中找到。</P>
            <P><B>带有设备独立位图(DIB)的透明性</B></P>
            <P></B>如果源位图是设备独立位图(DIB)格式,那么,整个屏蔽处理可以通过用一个设备独立位图(DIB)当作源文件。屏蔽和对色彩表的简单操作就可以大大地获得简化了。处理过程与上面讨论的相同,处理应用程序可通过改变色彩表执行所有的彩色单色和单色彩色的转换,如下:</P><CODE><PRE>save a copy of the color table;
// Build the mask.
for (every color in the color table)
{
    if (color == rgbTransparent)
        color = white;
    else
        color = black;
}
// Prepare destination by blting the mask.
StretchDIBits(hdcDest, lpDIB, SRCAND);     // (Yes, there are more 
                                           // parameters.)

// Now prepare "blacked out" source for the mask blt.
for (every color in the color table)
{
    if (color == white)          // (white from above change)
        color = black;
    else
        color = original color from color table;
}
// Transparently blt the source.
StretchDIBits(hdcDest, lpDIB, SRCPAINT);   // (Yes, there are more 
                                           // parameters.)
</PRE>
            <P>// To restore DIB to original state, restore original color 
            table.</P>
            <P>这种方法需要注意的关键之处在于只需要位图的一个备份因为它依靠色彩表转换即充当屏幕又充当源文件。不管,把设备独立位图(DIB)格式转换成设备依赖格式的额外不便仍然存在。</P></CODE><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0 
width=770>
  <TBODY>
  <TR bgColor=#006699>
    <TD align=middle bgColor=#006699 id=white><FONT 
    color=#ffffff>对该文的评论</FONT></TD>
    <TD align=middle>
      <SCRIPT src="CSDN_文档中心_透明位图.files/readnum.htm"></SCRIPT>
    </TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_透明位图.files/ico_pencil.gif" width=16> 
      </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; qhzzm <I>(2003-3-4 19:54:59)</I> </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>这段代码不能在打印机上进行 
  <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_透明位图.files/ico_pencil.gif" width=16> 
      </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; wuya <I>(2000-12-19 10:03:28)</I> </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 
      width=532><BR>ImageList控件也可以做到,其实很简单的,一个bitblt就可以搞定,只是要用一个奇怪的光栅操作。 
  <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_透明位图.files/ico_pencil.gif" width=16> 
      </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; edyang <I>(2000-12-7 6:58:13)</I> </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>有兴趣的朋友请到 
      http://263.csdn.net/edyang/ 下载我的一个实现。 <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_透明位图.files/ico_pencil.gif" width=16> 
      </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; dickzy <I>(2000-11-21 18:31:43)</I> </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>其实在delphi 
      中的TImageList可以很方便的做出透明位图 <BR></TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TH bgColor=#006699 id=white><FONT 
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
  <TBODY>
  <TR>
    <TD>你没有登陆,无法发表评论。 请先<A 
      href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=1364">登陆</A> 
      <A 
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>

<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
  <TBODY>
  <TR align=middle>
    <TD height=10 vAlign=bottom><A 
      href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A 
      href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A 
      href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A 
      href="http://www.csdn.net/english">English</A> </TD>
    <TD align=middle rowSpan=3><A 
      href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG 
      border=0 height=48 src="CSDN_文档中心_透明位图.files/biaoshi.gif" 
  width=40></A></TD></TR>
  <TR align=middle>
    <TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
  <TR align=middle>
    <TD vAlign=top><FONT face=Verdana>Copyright &copy; CSDN.net, Inc. All rights 
      reserved</FONT></TD></TR>
  <TR>
    <TD height=15></TD>
    <TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -