MFC中怎么显示一副图片使其背景透明

如题,我想在程序窗体中显示一张图片美化,可是老是显示那讨厌的白色底色,MFC好像不支持透明格式的PNG和GIF,听说CImageList控件能设置透明底色可是我发现它不能... 如题,我想在程序窗体中显示一张图片美化,可是老是显示那讨厌的白色底色,MFC好像不支持透明格式的PNG和GIF,听说CImageList控件能设置透明底色可是我发现它不能既支持透明又支持超过256色,用BITLIT函数又死活透明不了,请高手指教一二,最好用那种能运行的源代码说明 展开
 我来答
lwdbz
推荐于2016-07-05 · TA获得超过119个赞
知道小有建树答主
回答量:198
采纳率:0%
帮助的人:136万
展开全部
包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数:TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码位图,另一种是动态生成掩码位图。本文将介绍动态生成掩码位图绘制具有透明区域位图的方法。

一、TransparentBlt 函数的使用

TransparentBlt 函数在Windows98/Windows2000以上版本运行,系统中需要包含 Msimg32.dll,使用时可以链接 Msimg32.lib。

Windows98下的TransparentBlt会产生资源泄漏,所以不建议在WIN98下使用该函数。

TransparentBlt函数原型如下:

BOOL TransparentBlt(HDC hdcDest, // 目标DCint nXOriginDest, // 目标X偏移int nYOriginDest, // 目标Y偏移int nWidthDest, // 目标宽度int hHeightDest, // 目标高度HDC hdcSrc, // 源DCint nXOriginSrc, // 源X起点int nYOriginSrc, // 源Y起点int nWidthSrc, // 源宽度int nHeightSrc, // 源高度UINT crTransparent // 透明色,COLORREF类型);使用示例:

CBitmap FootballBMP;
FootballBMP.LoadBitmap(IDB_FOOTBALLBMP);
CDC ImageDC;
ImageDC.CreateCompatibleDC(pDC);
CBitmap *pOldImageBMP = ImageDC.SelectObject(&FootballBMP);
TransparentBlt(pDC->m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff));//RGB(0,0,0xff)改成你的背景颜色
ImageDC.SelectObject(pOldImageBMP);
此戏晖3349
2012-02-26 · TA获得超过5.5万个赞
知道大有可为答主
回答量:2.9万
采纳率:0%
帮助的人:4072万
展开全部
我是lwdbz,下面补充一下,以上代码放在OnPaint类内,同时在你的cpp文件头部加入#pragma comment( lib, "Msimg32.lib" ) ,然后在OnInitDialog里调用,格式如下:m_bmpFootball.LoadBitmap(IDB_BITMAP1);

OnPaint代码
void CMy12Dlg::OnPaint()
{

CPaintDC dc(this); //注意把这行代码放在最上面

if (IsIconic())
{
// device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
COLORREF crMask = RGB(0xff,0xff,0xff);
BITMAP bm;
m_bmpFootball.GetBitmap(&bm);
int nWidth = bm.bmWidth;
int nHeight = bm.bmHeight;
CDC ImageDC;
ImageDC.CreateCompatibleDC(&dc);
CBitmap *pOldImageBMP = ImageDC.SelectObject(&m_bmpFootball);
::TransparentBlt(dc.m_hDC,50,40,nWidth,nHeight,ImageDC.m_hDC,0,0,nWidth,nHeight,crMask);
// TransparentBlt2(dc.m_hDC,50,40,nWidth,nHeight,ImageDC.m_hDC,0,0,nWidth,nHeight,crMask);
ImageDC.SelectObject(pOldImageBMP);

}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式