下载频道 首页

·

编程开发

·

Flash游戏

·

网络教程

·

网络技术

·

手机大全

·

网络学院

·

软件下载

·

网站地图

·

收藏本站

编程首页 | Web开发 | 开发语言 | 微软开发专栏 |数据库开发 |技术跟踪 |程序人生 | 案例分析 VB Java Delphi VC/MFC C/C++ ASP.net

.ASP JSP PHP CGI JavaScript VbScript XML/SOAP Web服务器 .DB2 Access SQLServer MySQL Oracle PowerBuilder Foxpro 其它数据库

更多分类:Java Delphi VC/MFC C/C++ 其它平台

PCDOG编程

PCDOG首页 > 编程开发 > 开发语言 > VC/MFC > 正文


绘制透明位图


http://www.pcdog.com 2004-12-5 互联网
       在丰富多彩的软件世界中,位图的处理技术尤为重要。透明位图的显示作为
一种常用的图像处理方法,被用在众多的软件中。其基本原理,也就是将一幅需
要透明显示的位图(其透明色为已知),制作出二幅需要的位图A与B,其中A为除
透明色外均填充为黑色,B为把透明色填充为黑色其余色不变
,再用指定光栅操作
将两幅位图合并,可形成透明位图。
创建过程如下:
1、使用透明色背景,将位图拷贝到内存屏蔽位图中。
2、利用与白色相与不变色,与黑色相与成黑色的原理,将内存位图的的背景设置

成黑色、前景设置成白色,并将屏蔽位图用与操作拷贝到此内存位图中。形成位图B。
3、将显示设备背景设置为白色、前景设置成黑色,并将屏蔽位图用与操作拷贝到
显示设备中。形成位图A。
4、将内存位图用或操作拷贝到显示设备中。最终形成透明位图。

//参数说明:
//hDIB -位图句柄
//pPal -位图调色板
//xDest -显示位图的左上角x坐标
//yDest -显示位图的左上角y坐标
//colorTransparent -透明色

void DrawTransparentBitmap( CDC *pDC, int nXDest, int nYDest,HGLOBAL hDIB, COLORREF colorTransparent, CPalette *pPal)

{

BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed :1< int nWidth = bmInfo.bmiHeader.biWidth;
int nHeight = bmInfo.bmiHeader.biHeight;
LPVOID lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
CDC memDC,maskDC;
memDC.CreateCompatibleDC( pDC );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
CBitmap *pOldBitmap = memDC.SelectObject( &bmp );

if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE&&nColors<256)
CPalette *pOldMemPalette = memDC.SelectPalette(pPal, FALSE);
memDC.RealizePalette();
::SetDIBitsToDevice(memDC.m_hDC, 0, 0, nWidth, nHeight, 0, 0, 0,
nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
maskDC.CreateCompatibleDC(pDC);
CBitmap maskBitmap;
maskBitmap.CreateBitmap( nWidth, nHeight, 1, 1, NULL );
maskDC.SelectObject( &maskBitmap );
memDC.SetBkColor( colorTransparent );

maskDC.BitBlt( 0, 0, nWidth, nHeight, &memDC, 0, 0, SRCCOPY );
memDC.SetBkColor(RGB(0,0,0));
memDC.SetTextColor(RGB(255,255,255));
memDC.BitBlt(0, 0, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
pDC->SetBkColor(RGB(255,255,255));
pDC->SetTextColor(RGB(0,0,0));
pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &memDC,0, 0, SRCPAINT);
memDC.SelectObject( pOldBitmap );
}

BitBlt介绍

////////////////////////////////////////////////////////////////////////////////////////////////////

dc.BitBlt(x,y,49,154,mdc,49,0,SRCAND);

//BitBlt介绍:BitBlt函数的功能是将屏幕上任何一块拷贝到屏幕上其它任何一个地方。
//  x 目标矩形左上角的逻辑X坐标
//  y 目标矩形左上角的逻辑Y坐标
// 49 目标矩形的宽度
// 154 目标矩形的高度
// mdc 源设备描述表
//  49  源位图左上角的逻辑X坐标
//  0   源位图左上角的逻辑y坐标
////////////////////////////////////////////////////////////////////////////////////////////////////

上一页:如何使用C#编写程序访问Hotmail
下一页:用Visual C#实现局域网点对点通讯

【关闭】

文 章 查 询
关键词

人气前10名              
·经典编程:DLL地狱及其解决方案
·新手必学:windows网络编程经典入门
·用Visual C++ 6实现OpenGL编程
·Visual C++6.0开发灰度位图处理
·Visual C++编程的若干技巧
·Visual C++实现数字图像增强处理(上)
·解除注册表禁用
·绘制半透明位图以及如何画透明位图
·应用MFC开发高级应用程序(中)
·例解用 VC++ 6.0 实现 JNI


关于我们 | 联系方式 | 合作伙伴 | 版权声明 | 帮助信息 | 网站地图
Copyright 2005 PCdog.com, All Rights Reserved