选择显示字体大小

为vc++应用程序对话框添加透明位图

      我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本实例介绍了透明位图的制作知识,并将透明位图在一个对话框中显示了出来,界面效果如图一所示:


图一、对话框界面上透明显示位图

  一、 实现方法

  绘制"透明"位图是指绘制某一位图中除指定颜色外的其余部分,我们称这种颜色为"透明色"。通过将位图的背景色指定为"透明色",在绘制时,不绘制这部分背景,而仅绘制图像,这样就可以将位图中图像透明地绘制到窗口上。

  绘制"透明"位图的关键是创建一个"掩码"位图(mask bitmap),"掩码"位图是一个单色位图,它是位图中图像的一个单色剪影。在windows编程中,绘图都要用到设备描述表,我们需创建两个内存设备描述表:位图设备描述表(image dc)和"掩码"位图设备描述表(mask dc)。位图设备描述表用来装入位图,而"掩码"位图设备描述表用来装入"掩码"位图。在"掩码"位图设备描述表中制作"掩码"位图的方式是:先创建一个单色的bitmap,装入mask dc,然后,以"srccopy"的方式将装有位图的位图设备描述表绘制(bitblt)到mask dc上。这样,mask dc的显示平面中的位图即是"掩码"位图。

  一般情况下,绘制"透明"位图的实际操作步骤如下:

  1、 位图设备描述表以"srcinvert"的方式绘制(bitblt)到显示设备描述表上;

  2、 "掩码"位图设备描述表以"srcand"的方式绘制(bitblt)到显示设备描述表上;

  3、 再将位图设备描述表以"srcinvert"的方式绘制(bitblt)到显示设备描述表上。这样除"透明色"外的其余位图部分(图像部分)就被绘制到窗口上了。

  上述操作中需要用到的显示函数bitblt的原型和说明如下:

bool bitblt( int x, int y, int nwidth, int nheight, cdc* psrcdc, int xsrc, int ysrc, dword dwrop );
  函数的参数说明如下:int x表示贴到目的地的左上角x坐标;int y表示/贴到目的地的左上角y坐标;int nwidth表示贴到目的地的区域宽度;int nheight表示贴到目的地的区域高度;cdc* psrcdc表示存储源位图的设备描述表;int xsrc表示源位图的左上角x坐标;int ysrc表示源位图的左上角y坐标;dword dwrop为柵格运算标志,一般我们选择srccopy,直接拷贝源位图到目标。还可以让源位图和目标位图进行xor,and,or等等的操作。大家可以查看msdn。

  二、 编程步骤

  1、 启动visual c++6.0,生成一个基于对话框架的应用程序,讲程序命名为"transprarentimagetest";

  2、 添加位图资源,其id为idb_dragon,然后在对话框上添加一个idc_static控件,在其属性设置里选择显示该资源图像;

  3、 使用class wizard自定义类ctransparentimage,其基类选择cstatic;

  4、 添加代码,编译运行程序。

  三、 程序代码

//////////////////////////////////////////////////////////
#ifndef __transparentimage_h_transparentimage_42a6e395_97e4_11d3_b6f0_005004024a9e
#define __transparentimage_h_transparentimage_42a6e395_97e4_11d3_b6f0_005004024a9e
#if _msc_ver >= 1000
#pragma once
#endif
class ctransparentimage : public cstatic
{
 public:
  ctransparentimage() ;
  virtual ~ctransparentimage() ;
 protected:
  //{{afx_msg( ctransparentimage )
    afx_msg void onpaint() ;
  //}}afx_msg
  declare_message_map()
} ;
//{{afx_insert_location}}
#endif

//////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "transparentimage.h"
#ifdef _debug
#define new debug_new
#undef this_file
static char this_file[] = __file__ ;
#endif

ctransparentimage::ctransparentimage()
{}

ctransparentimage::~ctransparentimage()
{}

begin_message_map( ctransparentimage, cstatic )
 //{{afx_msg_map( ctransparentimage )
  on_wm_paint()
 //}}afx_msg_map
end_message_map()

void ctransparentimage::onpaint()
{
 hbitmap l_hbmpbitmap = getbitmap() ;
 if( l_hbmpbitmap == null )
 {
  default() ;
  return ;
 }
 cpaintdc l_paintdc( this ) ;
 // prepare everything for drawing
 crect l_rcclient ;
 getclientrect( &l_rcclient ) ;
 cdc l_bufferdc ;
 l_bufferdc.createcompatibledc( &l_paintdc ) ;
 cbitmap l_bufferbitmap ;
 l_bufferbitmap.createcompatiblebitmap(&l_paintdc,l_rcclient.width(), l_rcclient.height() ) ;
 cbitmap* l_poldbufferbitmap = l_bufferdc.selectobject( &l_bufferbitmap ) ;
 cdc l_maskdc ;
 l_maskdc.createcompatibledc( &l_paintdc ) ;
 cbitmap l_maskbitmap ;
 l_maskbitmap.createbitmap( l_rcclient.width(), l_rcclient.height(), 1, 1, null ) ;
 cbitmap* l_poldmaskbitmap = l_maskdc.selectobject( &l_maskbitmap ) ;
 #define srcmask 0x00220326
 // fill with transparent color
 l_bufferdc.fillsolidrect( &l_rcclient, rgb( 255, 0, 255 ) ) ;
 // blit the bitmap to the buffer
 cdc l_memorydc ;
 l_memorydc.createcompatibledc( &l_paintdc ) ;
 cbitmap* l_poldmemorybitmap = l_memorydc.selectobject( cbitmap::fromhandle( l_hbmpbitmap ) ) ;
 l_bufferdc.bitblt( 0, 0, l_rcclient.width(), l_rcclient.height(), &l_memorydc,0, 0, srccopy ) ;
 l_memorydc.selectobject( l_poldmemorybitmap ) ;
 // create the mask.
 colorref l_croldback = l_bufferdc.setbkcolor( rgb( 255, 0, 255 ) ) ;
 l_maskdc.bitblt( 0, 0, l_rcclient.width(), l_rcclient.height(), &l_bufferdc,0, 0, srccopy ) ;
 l_bufferdc.setbkcolor( l_croldback ) ;
 // draw the bitmap transparently now;
 if( ! l_paintdc.maskblt( 0, 0, l_rcclient.width(), l_rcclient.height(),&l_bufferdc, 0, 0, l_maskbitmap, 0, 0,rop4_transparentblit ) )
 {
  cdc l_copydc ;
  l_copydc.createcompatibledc( &l_paintdc ) ;
  cbitmap l_copybitmap ;
  l_copybitmap.createcompatiblebitmap( &l_paintdc, l_rcclient.width(),l_rcclient.height() ) ;
  cbitmap* l_poldcopybitmap = l_copydc.selectobject( &l_copybitmap ) ;
  l_copydc.bitblt( 0, 0, l_rcclient.width(), l_rcclient.height(), &l_paintdc,0, 0, srccopy ) ;
  l_copydc.bitblt( 0, 0, l_rcclient.width(), l_rcclient.height(), &l_maskdc,0, 0, srcand ) ;
  l_bufferdc.bitblt( 0, 0, l_rcclient.width(), l_rcclient.height(), &l_maskdc,0, 0, srcinvert ) ;
  l_copydc.bitblt( 0, 0, l_rcclient.width(), l_rcclient.height(), &l_bufferdc,0, 0, srcpaint ) ;
  l_paintdc.bitblt( 0, 0, l_rcclient.width(), l_rcclient.height(), &l_copydc,0, 0, srccopy ) ;
  l_copydc.selectobject( l_poldcopybitmap ) ;
 }
 // clean up.
 l_maskdc.selectobject( l_poldmaskbitmap ) ;
 l_bufferdc.selectobject( l_poldbufferbitmap ) ;
}

  四、 小结

  本实例介绍了如何在对话框中实现透明位图的显示,读者朋友可能感觉到文中介绍的方法和代码的实现过程仿佛不太一致,其实这些只是表面现象,读者朋友在吃透实例代码的实现过程后,就会发现两者之间并没有什么冲突。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons