显示透明背景BMP的例子

TransparentBitmap(HDC hdc, HBITMAP hBitmap,short xStart,

short yStart, short xadd,short yadd, COLORREF cTransparentColor)

{

   BITMAP     m_bm;

   COLORREF   cColor; 

  

   // 创建临时DC

   HDC     hMem, hBack, hObject, hTemp, hSave;

   hBack   = CreateCompatibleDC(hdc);

   hObject = CreateCompatibleDC(hdc);

   hMem    = CreateCompatibleDC(hdc);

   hSave   = CreateCompatibleDC(hdc);  

   hTemp   = CreateCompatibleDC(hdc);

   // 选入位图

   SelectObject(hTemp, hBitmap);  

   GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&m_bm);

   //显示位图宽高

   POINT      ptSize;

   // 取得位图的宽度

   ptSize.x = m_bm.bmWidth;    

    // 取得位图的该度

   ptSize.y = m_bm.bmHeight;          

   // 转换为逻辑点值

   DPtoLP(hTemp, &ptSize, 1);  

  

   // 创建临时位图

   HBITMAP    bmBack, bmObject, bmMem, bmSave;

   // 单色位图

   bmBack   = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);   

   bmObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

   // 与设备兼容位图

   bmMem    = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);

   bmSave      = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);

 

   // 将创建的临时位图选入临时DC中

   HBITMAP    OldbmBack, OldbmObject, OldbmMem, OldbmSave;

   OldbmBack   = (HBITMAP)SelectObject(hBack, bmBack);

   OldbmObject = (HBITMAP)SelectObject(hObject, bmObject);

   OldbmMem    = (HBITMAP)SelectObject(hMem, bmMem);

   OldbmSave   = (HBITMAP)SelectObject(hSave, bmSave);

 

   // 设置映射模式

   SetMapMode(hTemp, GetMapMode(hdc));

   // 先保留原始位图

   BitBlt(hSave, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCCOPY);

   // 将背景颜色设置为需透明的颜色

   cColor = SetBkColor(hTemp, cTransparentColor);

   // 创建目标屏蔽码

   BitBlt(hObject, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCCOPY);

   // 恢复源DC的原始背景色

   SetBkColor(hTemp, cColor);

 

   // 创建反转的目标屏蔽码

   BitBlt(hBack, 0, 0, ptSize.x, ptSize.y, hObject, 0, 0, NOTSRCCOPY);

   // 拷贝主DC的背景到目标DC

   BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY);

   // 屏蔽位图的显示区

   BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hObject, 0, 0, SRCAND);

   // 屏蔽位图中的透明色

   BitBlt(hTemp, 0, 0, ptSize.x, ptSize.y, hBack, 0, 0, SRCAND);

   // 将位图与目标DC的背景左异或操作

   BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCPAINT);

   // 拷贝目标到屏幕上

   StretchBlt(hdc, xStart, yStart, ptSize.x+xadd, ptSize.y+yadd, hMem, 0, 0, ptSize.x, ptSize.y,SRCCOPY);

   // 恢复原始位图

   BitBlt(hTemp, 0, 0, ptSize.x, ptSize.y, hSave, 0, 0, SRCCOPY);

 

   // 删除临时内存位图

   DeleteObject(SelectObject(hBack, OldbmBack));

   DeleteObject(SelectObject(hObject, OldbmObject));

   DeleteObject(SelectObject(hMem, OldbmMem));

   DeleteObject(SelectObject(hSave, OldbmSave));

 

   // 删除临时内存DC

   DeleteDC(hMem);

   DeleteDC(hBack);

   DeleteDC(hObject);

   DeleteDC(hSave);

   DeleteDC(hTemp);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值