VC 透明绘图

来源:互联网 发布:java的jvm 编辑:程序博客网 时间:2024/06/05 08:23

 

中间的位图就是透明绘图而成,屏蔽了背景黑色。

 

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); //将图片选如dcMaskDC.CreateCompatibleDC(pDC); //创建pDC的兼容DC(MaskDC)maskBitmap.CreateBitmap( imgInfo.bmWidth, imgInfo.bmHeight, 1, 1, NULL ); //创建掩码图片pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap ); //将掩码图片选入MaskDCImageDC.SetBkColor(rgbMask); //设置ImageDC的背景颜色//将ImageDC复制到掩码DCMaskDC.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));}