| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付赛孚耐:软件保护加密专家
身份认证令牌USB KEY   
共有 495 人关注过本帖
标题:一个显示透明图片的函数,有谁可以对它进行改进吗?
收藏  订阅  推荐  打印 
afliult
Rank: 2
等级:注册会员
帖子:71
积分:844
注册:2007-7-22
一个显示透明图片的函数,有谁可以对它进行改进吗?

在资源中导入图片 :     


定义ID为 IDB_QZH

使用方法为:
CBitmap QzhBMP;
QzhBMP.LoadBitmap(IDB_QZH);
CDC ImageDC;
ImageDC.CreateCompatibleDC(pDC);
CBitmap *pOldImageBMP = ImageDC.SelectObject(&QzhBMP);
TransparentBlt(pDC->m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff));
ImageDC.SelectObject(pOldImageBMP);

函数原型:

void TransparentBlt( 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(255,255,255));
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);
}

程序能正常使用
我现在使用位图     作掩码位图,
ID 为 IDR_MASK
请问应怎样对程序进行修改?
搜索更多相关主题的帖子: 函数  ImageDC  IDB  pDC  QzhBMP  
2007-12-7 16:51
afliult
Rank: 2
等级:注册会员
帖子:71
积分:844
注册:2007-7-22

图像显示不了,还是以附件方式上传
附件: 只有本站会员才能下载或查看附件,请您 登录注册
2007-12-7 16:59
chengyukyo1
Rank: 2
等级:注册会员
帖子:50
积分:606
注册:2007-10-18

时空穿梭 魔幻斗法 把c++当动漫理解就好了
2007-12-7 20:48
afliult
Rank: 2
等级:注册会员
帖子:71
积分:844
注册:2007-7-22

怎么没有人回答呀?
2007-12-9 09:29
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.090555 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved