求:透明位图代码.

simalaya 2006-05-13 05:49:53
我在资源里加了个位图IDB_BMP2,显示在窗口的时候有白色的底,怎么让它透明呢?
如果我是用的单文档程序,我改在哪个事件里实现?
怎么实现 ?给个代码吧.
...全文
179 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gcin2008 2006-06-30
  • 打赏
  • 举报
回复
说的挺好的,高手,牛人,建议楼主结帖了。我的QQ:397191171,交VC学习的朋友
jtq 2006-05-14
  • 打赏
  • 举报
回复
TransparentBlt
CrazyAzreal 2006-05-14
  • 打赏
  • 举报
回复
void CTouMingBmpDlg::OnPaint()
{
CPaintDC dc(this);
CBitmap BmpBack,*pOldBack;
//加载背景图
BmpBack.LoadBitmap(IDB_BACKGROUND);
CDC dcBack;
dcBack.CreateCompatibleDC(&dc);
pOldBack=dcBack.SelectObject(&BmpBack);
dc.BitBlt(0,0,200,200,&dcBack,0,0,SRCCOPY);

//画透明位图,IDB_BITMAPA为需要画到背景去的位图ID
//CRect(0,0,120,120)为需要画目标位图的rc
//RGB(255,255,255)是需要画成透明的颜色,你需要设置透明的图的背景假如是白色,那就写RGB(255,255,255),如果是其他颜色,就写其他颜色的RGB
DrawTransparentBitmap(&dc,IDB_BITMAPA,CRect(0,0,160,130),RGB(0,0,0));
dcBack.SelectObject(pOldBack);
}

void CTouMingBmpDlg::DrawTransparentBitmap(CDC *pDC, UINT IDImage, CRect &rect, COLORREF rgbMask)
{
CDC ImageDC,MaskDC;
CBitmap Image,*pOldImage;
CBitmap maskBitmap,*pOldMaskDCBitmap ;
Image.LoadBitmap(IDImage); //加载需要设置透明的位置
ImageDC.CreateCompatibleDC(pDC);
pOldImage=ImageDC.SelectObject(&Image);
MaskDC.CreateCompatibleDC(pDC);
maskBitmap.CreateBitmap(rect.Width(), rect.Height(), 1, 1, NULL );
pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );
ImageDC.SetBkColor(rgbMask);
MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );
ImageDC.SetBkColor(RGB(0,0,0));
ImageDC.SetTextColor(RGB(255,255,255));
ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCCOPY);
MaskDC.SelectObject(pOldMaskDCBitmap);
ImageDC.SelectObject(pOldImage);
}

http://topic.csdn.net/t/20041209/10/3628859.html 这里有一个贴子就是讲这个的原理CUG122032说的方法对于楼主的要求来说挺麻烦,更简单的是通过输入mask来控制显示部分
ok1234567 2006-05-13
  • 打赏
  • 举报
回复
如果是作为透明的背景,在OnEraseBkgnd中实现
如果是前景:OnPaint或者OnDraw都可以,
透明的办法如CUG122032() 所说
CUG122032 2006-05-13
  • 打赏
  • 举报
回复
这样,再画一个和你的图一模一样的图,区别中在于:你图里的不想成为透明的部分要画成黑的,想成为透明的部分还为白的(就相当于把你原来的图黑白化了.)
然后,用BitBlt先把你的黑白的图贴上去,最后一个参数用MERGEPAINT
之后,再把你真正要贴的图贴在相同的位置,最后一个参数用SRCAND
就可以了.
这样做的原理很简单,你看MSDN里BitBlt函数最后一个参数的意义就明白了.


当然,你也可以用GDI+或者其它一此功能更强的图形处理库,用它们贴图的时候,可以选择透明色的.

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧