我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本实例介绍了透明位图的制作知识,并将透明位图在一个对话框中显示了出来,界面效果如图一所示:
bool bitblt( int x, int y, int nwidth, int nheight, cdc* psrcdc, int xsrc, int ysrc, dword dwrop );//////////////////////////////////////////////////////////
#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 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器