首页 MFC 透明图片

MFC 透明图片

举报
开通vip

MFC 透明图片MFC 透明图片 在EVC或VC8.0中,有关图片处理的资料并不多,SDK中的例子只是告诉你如何加载图片, 下面的代码可以用在VC的任何编译器上,它的原理是采用的双缓冲技术,用为运算来完成此 项功能。 void TransparentBlt2( HDC hdcDest, // 目标DC int nXOriginDest, // 目标X偏移 int nYOriginDest, // 目标Y偏移 int nWidthDest, // 目标宽度 int nHeightDest, // 目标高度 HDC hd...

MFC  透明图片
MFC 透明图片 在EVC或VC8.0中,有关图片处理的资料并不多,SDK中的例子只是告诉你如何加载图片, 下面的代码可以用在VC的任何编译器上,它的原理是采用的双缓冲技术,用为运算来完成此 项功能。 void TransparentBlt2( HDC hdcDest, // 目标DC int nXOriginDest, // 目标X偏移 int nYOriginDest, // 目标Y偏移 int nWidthDest, // 目标宽度 int nHeightDest, // 目标高度 HDC hdcSrc, // 源DC int nXOriginSrc, // 源X起点 int nYOriginSrc, // 源Y起点 int nWidthSrc, // 源宽度 int nHeightSrc, // 源高度 UINT crTransparent // 透明色,COLORREF类型 ) { HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图 HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图 HDC hImageDC = CreateCompatibleDC(hdcDest); HDC hMaskDC = CreateCompatibleDC(hdcDest); hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP); hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP); // 将源DC中的位图拷贝到临时DC中 if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc) BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY); else StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY); // 设置透明色 SetBkColor(hImageDC, crTransparent); // 生成透明区域为白色,其它区域为黑色的掩码位图 BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 生成透明区域为黑色,其它区域保持不变的位图 SetBkColor(hImageDC, RGB(0,0,0)); SetTextColor(hImageDC, RGB(255,255,255)); BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // 透明部分保持屏幕不变,其它部分变成黑色 SetBkColor(hdcDest,RGB(0xff,0xff,0xff)); SetTextColor(hdcDest,RGB(0,0,0)); BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // "或"运算,生成最终效果 BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT); SelectObject(hImageDC, hOldImageBMP); DeleteDC(hImageDC); SelectObject(hMaskDC, hOldMaskBMP); DeleteDC(hMaskDC); DeleteObject(hImageBMP); DeleteObject(hMaskBMP); } 这个函数的调用一般在WM_PAINT消息处理函数,在WIN32工程中,可参照下面的代码来做: RECT rc; GetClientRect(hwnd,&rc); HDC dc = GetDC(hwnd);//客户区的HDC void LoadImg(HDC dc,LPCTSTR FilePath)//HDC是客户区的HDC,FilePath是文件路径, { COLORREF crMask = RGB(255,0,255); HBITMAP m_hSrcBmp = SHLoadDIBitmap(FilePath);/此函数仅限于WM5.0等PPC, BITMAPINFO BitInfo; GetObject(m_hSrcBmp, sizeof(BITMAPINFO), &BitInfo); int nWidth = BitInfo.bmiHeader.biWidth; int nHeight = BitInfo.bmiHeader.biHeight; HDC ImageDC = CreateCompatibleDC(dc); HBITMAP pOldImageBMP = NULL; HDC OldDC = CreateCompatibleDC(dc); SelectObject(ImageDC,pOldImageBMP); SelectObject(ImageDC,m_hSrcBmp); TransparentBlt2(dc,24,0,nWidth,nHeight,ImageDC,0,0,nWidth,nHeight,crMask); SelectObject(ImageDC,pOldImageBMP); } MFC的工程的调用相对简单,在OnPaint中调用 { CRect rect; ::GetWindowRect (GetDlgItem(IDC_COMBO1)->m_hWnd, rect); ScreenToClient (rect); //加载位图 CBitmap m_bitmap;//注意这个变量不能是全局变量或类的成员变量,否则不能更新 wchar_t FilePath1[128] = {0}; m_bitmap.Attach(SHLoadImageFile(FilePath)); COLORREF crMask = RGB(255,0,255);//要过滤颜色的RGB的值 BITMAP bm; m_bitmap.GetBitmap(&bm); int nWidth1 = bm.bmWidth; int nHeight1 = bm.bmHeight; CDC ImageDC; ImageDC.CreateCompatibleDC(&dc); CBitmap *pOldImageBMP = ImageDC.SelectObject(&m_bitmap); TransparentBlt2(dc.m_hDC,0,rect.bottom,nWidth1,nHeight1,ImageDC.m_hDC,0,0,nWidth 1,nHeight1,crMask); ImageDC.SelectObject(pOldImageBMP); }
本文档为【MFC 透明图片】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_682974
暂无简介~
格式:doc
大小:18KB
软件:Word
页数:5
分类:生活休闲
上传时间:2017-09-21
浏览量:222