在mfc基本对话框中怎么样实现图片的背景透明化??? 10
我是想做雪花飘落的,可是引进的雪花都带有白色背景,就想把雪花的背景透明化,看过很多的透明化的代码,可是都看不懂,执行错误,所以求高人指教啊!!!需要具体的代码和注释!!!...
我是想做雪花飘落的,可是引进的雪花都带有白色背景,就想把雪花的背景透明化,看过很多的透明化的代码,可是都看不懂,执行错误,所以求高人指教啊!!!需要具体的代码和注释!!!
展开
展开全部
BOOL TitleBar::Transparent(HDC hdcDest,,//目标设备
int nXOriginDest,int nYOriginDest,//要绘图的起点
int nWidthDest, int nHeightDest, //绘制的长宽
HDC hdcSrc,//源设备
int nXOriginSrc,int nYOriginSrc,//原图的起点
int nWidthSrc,int nHeightSrc,//长宽
UINT crTransparent //透明色
)
{
BOOL result = TRUE;
HBITMAP hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);// 创建兼容位图
if(!hImageBMP) return FALSE;
HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);// 创建单色掩码位图
if(hMaskBMP)
{
HDC hImageDC = CreateCompatibleDC(hdcDest);
if(hImageDC)
{
HDC hMaskDC = CreateCompatibleDC(hdcDest);//创建兼容DC
if(hMaskDC)
{
SelectObject(hImageDC, hImageBMP);
SelectObject(hMaskDC, hMaskBMP);
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
result = BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
result = StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
try
{
if(result == FALSE)
throw 0;
SetBkColor(hImageDC, crTransparent);
if(BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest,
hImageDC, 0, 0, SRCCOPY) == FALSE)
throw 1;
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
if(BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hMaskDC, 0, 0, SRCAND) == FALSE)
throw 2;
SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
SetTextColor(hdcDest,RGB(0,0,0));
if(BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
hMaskDC, 0, 0, SRCAND) == FALSE)
throw 3;
if(BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
hImageDC, 0, 0, SRCPAINT) == FALSE)
throw 4;
}
catch (int )
{
result = FALSE;
}
DeleteDC(hMaskDC);
}
else
result = FALSE;
DeleteDC(hImageDC);
}
else
result = FALSE;
DeleteObject(hMaskBMP);
}
else
result = FALSE;
DeleteObject(hImageBMP);
return result;
}
使用时,就按标注的参数来做,源设备里的图就是你要透明某个颜色的图,而目标设备就是绘制的透明后的图,如果要实现你的雪花,你先把雪花图片选入一个CDC
如:CDC srcDC;
把原来的雪花图选到里面,再通过这个函数绘制到指定窗口的目标设备。
具体的函数说明看参考连接
int nXOriginDest,int nYOriginDest,//要绘图的起点
int nWidthDest, int nHeightDest, //绘制的长宽
HDC hdcSrc,//源设备
int nXOriginSrc,int nYOriginSrc,//原图的起点
int nWidthSrc,int nHeightSrc,//长宽
UINT crTransparent //透明色
)
{
BOOL result = TRUE;
HBITMAP hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);// 创建兼容位图
if(!hImageBMP) return FALSE;
HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);// 创建单色掩码位图
if(hMaskBMP)
{
HDC hImageDC = CreateCompatibleDC(hdcDest);
if(hImageDC)
{
HDC hMaskDC = CreateCompatibleDC(hdcDest);//创建兼容DC
if(hMaskDC)
{
SelectObject(hImageDC, hImageBMP);
SelectObject(hMaskDC, hMaskBMP);
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
result = BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
result = StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
try
{
if(result == FALSE)
throw 0;
SetBkColor(hImageDC, crTransparent);
if(BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest,
hImageDC, 0, 0, SRCCOPY) == FALSE)
throw 1;
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
if(BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hMaskDC, 0, 0, SRCAND) == FALSE)
throw 2;
SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
SetTextColor(hdcDest,RGB(0,0,0));
if(BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
hMaskDC, 0, 0, SRCAND) == FALSE)
throw 3;
if(BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
hImageDC, 0, 0, SRCPAINT) == FALSE)
throw 4;
}
catch (int )
{
result = FALSE;
}
DeleteDC(hMaskDC);
}
else
result = FALSE;
DeleteDC(hImageDC);
}
else
result = FALSE;
DeleteObject(hMaskBMP);
}
else
result = FALSE;
DeleteObject(hImageBMP);
return result;
}
使用时,就按标注的参数来做,源设备里的图就是你要透明某个颜色的图,而目标设备就是绘制的透明后的图,如果要实现你的雪花,你先把雪花图片选入一个CDC
如:CDC srcDC;
把原来的雪花图选到里面,再通过这个函数绘制到指定窗口的目标设备。
具体的函数说明看参考连接
参考资料: http://blog.csdn.net/guaren0118/article/details/7366192
展开全部
用bitblt函数,雪花最好是黑色背景。
CDC *pDC;
pDC=GetDC();
CBitmap bmp,bk;
bmp.LoadBitmap(IDB_BITMAP);//加载你添加的位图(雪花)
bk.CreateCompatibleBitmap(pDC,nWidth,nHeight);//设备兼容位图,做背景画布
CDC MemDC,SnowDC;//前者是背景,后者是雪花
MemDC.CreateCompatibleDC(pDC);
SnowDC.CreateCompatibleDC(pDC);
SnowDC.SelectObject(&bmp);
MemDC.SelectObject(&bk);
MemDC.BitBlt(0,0,Width,Height,&SnowDC,0,0,SRCPAINT);//第一对0,0是雪花显示在MemDC中的坐标,Width,Height是雪花图片大小,SnowDC是保存了图片的DC,从SnowDC的0,0位置拷贝,SRCPAINT可以把SnowDC中的非黑色部分拷贝到MemDC,也就是你要的透明效果。
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);//nWidth,nHeight就是MemDC的大小。
CDC *pDC;
pDC=GetDC();
CBitmap bmp,bk;
bmp.LoadBitmap(IDB_BITMAP);//加载你添加的位图(雪花)
bk.CreateCompatibleBitmap(pDC,nWidth,nHeight);//设备兼容位图,做背景画布
CDC MemDC,SnowDC;//前者是背景,后者是雪花
MemDC.CreateCompatibleDC(pDC);
SnowDC.CreateCompatibleDC(pDC);
SnowDC.SelectObject(&bmp);
MemDC.SelectObject(&bk);
MemDC.BitBlt(0,0,Width,Height,&SnowDC,0,0,SRCPAINT);//第一对0,0是雪花显示在MemDC中的坐标,Width,Height是雪花图片大小,SnowDC是保存了图片的DC,从SnowDC的0,0位置拷贝,SRCPAINT可以把SnowDC中的非黑色部分拷贝到MemDC,也就是你要的透明效果。
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);//nWidth,nHeight就是MemDC的大小。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
gdi+绘制png
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询