透明位图显示//TransparentBlt //DrawTransparentBitmap函数

news/2024/7/8 15:35:34 标签: mfc, windows, image, null

      画透明位图通常的方法是使用遮罩。所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,而不透明的是白色的,白色的部分就是透明的部分。

    假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形状是一样的。

       比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我们可以先将图B和背景进行与操作,再把图B和背景进行或操作就可以了。

用VC MFC实现的代码如下:
void CDemoDlg::OnPaint()
{
CPaintDC dc(this);
CBitmap BmPBack,BmpA,BmpB,*pOldBack,*pOldA,*pOldB;

BmpBack.LoadBitmap(IDB_BACKGROUND); // 载入背景图
BmpA.LoadBitmap(IDB_BITMAPA); //载入图A
BmpB.LoadBitmap(IDB_BITMAPB); //载入图B

CDC dcBack,dcA,dcB; //声明三个内存DC用于画图
dcBack.CreateCompatibleDC(&dc);
dcA.CreateCompatibleDC(&dc);
dcB.CreateCompatibleDC(&dc); //把这三个内存DC创建成和PaintDC兼容的DC

pOldBack=dcBack.SelectObject(&BmpBack);
pOldA=dcA.SelectObject(&BmpA);
pOldB=dcB.SelectObject(&BmpB); //把三个位图选入相应的DC

dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY); //画背景
dc.BitBlt(0,0,48,48,&dcB,0,0,SRCAND); //用与的方式画遮罩图B
dc.BitBlt(0,0,48,48,&dcA,0,0,SRCPAINT); //用或的方式画遮图A

dcBack.SelectObject(pOldBack);
dcBack.SelectObject(pOldA);
dcBack.SelectObject(pOldB); //从内存DC中删除位图
}

你会看到红色的字母A透明地画在背景上了。

用遮罩的方法必须事先做好遮罩,遮罩和位图大小一样等于多消耗一倍的资源,比较浪费。

方法二:

还有一种画透明位图的方法,基本原理是一样的,只是不用事先做好遮罩,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。

用VC MFC实现的代码如下:
/*
这是一个用来画透明位图的函数
CDC *pDC 需要画位图的CDC指针
UINT IDImage 位图资源ID
CRect &rect 指定位图在pDC中的位置
COLORREF rgbMask 位图的透明色
*/
void 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,SRCPAINT);

MaskDC.SelectObject(pOldMaskDCBitmap);
ImageDC.SelectObject(pOldImage);
}

void CDemoDlg::OnPaint()
{
CPaintDC dc(this);

CBitmap BmpBack,*pOldBack,;
BmpBack.LoadBitmap(IDB_BACKGROUND);

CDC dcBack;
dcBack.CreateCompatibleDC(&dc);
pOldBack=dcBack.SelectObject(&BmpBack);

dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
DrawTransparentBitmap(&dc,IDB_BITMAPA,CRect(0,0,48,48),RGB(192,192,0));

dcBack.SelectObject(pOldBack);
}

 

//

TransparentBlt 函数在Windows98/Windows2000以上版本运行,系统中需要包含 Msimg32.dll,使用时可以链接 Msimg32.lib。
Windows98下的TransparentBlt会产生资源泄漏,所以不建议在WIN98下使用该函数。
TransparentBlt函数原型如下:

BOOL TransparentBlt(
HDC hdcDest,      // 目标DC
int nXOriginDest,   // 目标X偏移
int nYOriginDest,   // 目标Y偏移
int nWidthDest,     // 目标宽度
int hHeightDest,    // 目标高度
HDC hdcSrc,         // 源DC
int 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));
ImageDC.SelectObject(pOldImageBMP);

http://www.niftyadmin.cn/n/1536123.html

相关文章

Codeforces 758B. Blown Garland

题目大意: 四种颜色的灯排成一排,一些灯的颜色是已知的,另外的灯已损坏。并且知道每连续的四个灯中一定有四种颜色。问每种颜色的灯有多少个是已经损坏的. 题解: 这道题是那种看着高端大气上档次,画一个样例就变成sb题的那种题。 我们发现&am…

for...of与for...in在迭代对象属性上的区别

for…of循环 for...of 循环需要配合 Object.keys(obj) 、Object.values(obj)、Object.entries(obj) 配合使用才能迭代对象。 const objPrototype {c: 3,d: 4, }; const obj Object.create(objPrototype); obj.a 1; obj.b 2;for (const key of Object.kes(obj) {console.l…

lisp 焊缝标注_德国图纸焊接符号

德国图纸焊接符号: 建筑图纸符号大全,缺失:德国焊接3355/9表示钢筋间距Φ表示钢筋型号,CAD快捷键一览创建三维阵列 3A创建三维面 3F在三维空间创建由直线段组成的多段线 3P在二维和三维空间中将某对象与其他对象对齐 AL加载 AutoLISP、ADS 和…

关闭表单自动填充和自动填充密码

浏览器默认会开启表单的自动填充。 1. 给整个表单设置禁用自动填充 在 form 标签中&#xff0c;添加 autocomplete 属性&#xff0c;并且值为 off。 <form method"post" action"/form" autocomplete"off"> ... </form>2. 给单独一…

Visualforce初步 [2] —— 标准控制器

什么是Visualforce标准控制器 Visualforce使用了传统的MVC架构&#xff0c;并提供标准的内置控制器来处理标准action和数据访问&#xff08;与Force.com数据库集成良好&#xff09;。 MVC的好处就是能清楚地将视图&#xff0c;数据和逻辑区分开来。视图&#xff08;VF页面&…

图像处理与识别学习小结

图像处理与识别学习小结 数字图像处理是对图像进行分析、加工、和处理&#xff0c;使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储&#xff0c;因而图像处理很多情况下指数字图像处理。此外&#xff0c;基于…

农林资金 大数据审计案例_当审计遇上大数据(四)

按&#xff1a;当审计遇上大数据&#xff0c;审计模式进一步优化&#xff0c;审计项目跑出“加速度”&#xff1b;当审计遇上大数据&#xff0c;技术支撑进一步强化&#xff0c;审计工作提高精准度;当审计遇上大数据&#xff0c;还会带来什么样的转变&#xff0c;在我省各项审计…

react-ts中配置 css 模块类名的智能提示

1. 安装插件 typescript-plugin-css-modules yarn add typescript-plugin-css-modules -D2. 配置tsconfig.json文件 {"compilerOptions": {"plugins": [{"name": "typescript-plugin-css-modules","options": {"cust…