中间的位图就是透明绘图而成,屏蔽了背景黑色。
void CTranspantDlg::OnButton1() { CBitmap bit; bit.LoadBitmap(IDB_BITMAP5); BITMAP bi; bit.GetBitmap(&bi); int width=bi.bmWidth; int heigh=bi.bmHeight; CClientDC dc(this); CDC memDC; memDC.CreateCompatibleDC(&dc); memDC.SelectObject(&bit); TransparentBlt(dc.GetSafeHdc(),200,200,width,heigh,memDC.GetSafeHdc(),0,0,width,heigh,RGB(0,0,0)); }
在我使用TransparentBlt函数的时候,发现了这个问题,用BitBlt可以显示,TransparentBlt就不能。
后经过测试,发现是TransparentBlt函数第9个和第10个参数的问题,
即nWidthSrc 和nHeightSrc这两个参数
这两个参数必须小于或等于位图的实际宽度和高度,否则此函数会调用失败,
在使用中要特别注意。
使用此函数须加载msimg32.lib库
#pragma comment( lib, "msimg32.lib" )
而TransparentBlt的位图不能为24色,只能是8位或者黑白图像
或者用自己写的透明绘图函数
void CTranspantDlg::DrawTransparentBitmap(CDC *pDC,UINT IDImage,int x,int y,COLORREF rgbMask) { CDC ImageDC,MaskDC; CBitmap Image,*pOldImage; BITMAP imgInfo; CBitmap maskBitmap,*pOldMaskDCBitmap ; Image.LoadBitmap(IDImage);//加载图片资源 Image.GetBitmap(&imgInfo);//取得图片资源信息 ImageDC.CreateCompatibleDC(pDC); //创建pDC的兼容DC(ImageDC) pOldImage=ImageDC.SelectObject(&Image); //将图片选如dc MaskDC.CreateCompatibleDC(pDC); //创建pDC的兼容DC(MaskDC) maskBitmap.CreateBitmap( imgInfo.bmWidth, imgInfo.bmHeight, 1, 1, NULL ); //创建掩码图片 pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap ); //将掩码图片选入MaskDC ImageDC.SetBkColor(rgbMask); //设置ImageDC的背景颜色 //将ImageDC复制到掩码DC MaskDC.BitBlt( 0, 0, imgInfo.bmWidth, imgInfo.bmHeight, &ImageDC, 0, 0, SRCCOPY ); ImageDC.SetBkColor(RGB(0,0,0)); ImageDC.SetTextColor(RGB(255,255,255)); //将ImageDC和掩码DC相与 ImageDC.BitBlt(0, 0, imgInfo.bmWidth, imgInfo.bmHeight, &MaskDC, 0, 0, SRCAND); pDC->BitBlt(x,y,imgInfo.bmWidth, imgInfo.bmHeight, &MaskDC, 0, 0, SRCAND); pDC->BitBlt(x,y,imgInfo.bmWidth, imgInfo.bmHeight, &ImageDC, 0, 0,SRCPAINT); MaskDC.SelectObject(pOldMaskDCBitmap); ImageDC.SelectObject(pOldImage); } void CTranspantDlg::OnButton2() { CClientDC dc(this); DrawTransparentBitmap(&dc,IDB_BITMAP5,300,300,RGB(0,0,0)); }