位图-mfc显示透明背景代码看不大懂

问题描述

mfc显示透明背景代码看不大懂
/*-----------------显示透明背景图片-------------------*/

void CHIT_MOUSE::TransparentBitmap(HDC hdc HBITMAP hBitmap short xStart short yStart short xadd short yadd COLORREF cTransparentColor)
{
BITMAP m_bm;
COLORREF cColor;

// 创建临时DC
HDC hMem hBack hObject hTemp hSave;
hBack = CreateCompatibleDC(hdc);
hObject = CreateCompatibleDC(hdc);
hMem = CreateCompatibleDC(hdc);
hSave = CreateCompatibleDC(hdc);

hTemp = CreateCompatibleDC(hdc);

// 选入位图
SelectObject(hTemp hBitmap);

GetObject(hBitmap sizeof(BITMAP) (LPSTR)&m_bm);

POINT ptSize;//显示位图宽高

ptSize.x = m_bm.bmWidth; // 取得位图的宽度

ptSize.y = m_bm.bmHeight; // 取得位图的该度

DPtoLP(hTemp &ptSize 1); // 转换为逻辑点值

HBITMAP bmBack bmObject bmMem bmSave;// 创建临时位图

// 单色位图
bmBack = CreateBitmap(ptSize.x ptSize.y 1 1 NULL);

bmObject = CreateBitmap(ptSize.x ptSize.y 1 1 NULL);

// 与设备兼容位图
bmMem = CreateCompatibleBitmap(hdc ptSize.x ptSize.y);
bmSave = CreateCompatibleBitmap(hdc ptSize.x ptSize.y);

// 将创建的临时位图选入临时DC中
HBITMAP OldbmBack OldbmObject OldbmMem OldbmSave;
OldbmBack = (HBITMAP)SelectObject(hBack bmBack);
OldbmObject = (HBITMAP)SelectObject(hObject bmObject);
OldbmMem = (HBITMAP)SelectObject(hMem bmMem);
OldbmSave = (HBITMAP)SelectObject(hSave bmSave);

// 设置映射模式
SetMapMode(hTemp GetMapMode(hdc));

// 先保留原始位图
BitBlt(hSave 0 0 ptSize.x ptSize.y hTemp 0 0 SRCCOPY);

// 将背景颜色设置为需透明的颜色
cColor = SetBkColor(hTemp cTransparentColor);

// 创建目标屏蔽码
BitBlt(hObject 0 0 ptSize.x ptSize.y hTemp 0 0 SRCCOPY);

SetBkColor(hTemp cColor);// 恢复源DC的原始背景色

// 创建反转的目标屏蔽码
BitBlt(hBack 0 0 ptSize.x ptSize.y hObject 0 0 NOTSRCCOPY);

// 拷贝主DC的背景到目标DC
BitBlt(hMem 0 0 ptSize.x ptSize.y hdc xStart yStart SRCCOPY);

// 屏蔽位图的显示区
BitBlt(hMem 0 0 ptSize.x ptSize.y hObject 0 0 SRCAND);

// 屏蔽位图中的透明色
BitBlt(hTemp 0 0 ptSize.x ptSize.y hBack 0 0 SRCAND);

// 将位图与目标DC的背景左异或操作
BitBlt(hMem 0 0 ptSize.x ptSize.y hTemp 0 0 SRCPAINT);

// 拷贝目标到屏幕上
StretchBlt(hdc xStart yStart ptSize.x+xadd ptSize.y+yadd hMem 0 0 ptSize.x ptSize.ySRCCOPY);

// 恢复原始位图
BitBlt(hTemp 0 0 ptSize.x ptSize.y hSave 0 0 SRCCOPY);

// 删除临时内存位图
DeleteObject(SelectObject(hBack OldbmBack));
DeleteObject(SelectObject(hObject OldbmObject));
DeleteObject(SelectObject(hMem OldbmMem));
DeleteObject(SelectObject(hSave OldbmSave));

// 删除临时内存DC
DeleteDC(hMem);
DeleteDC(hBack);
DeleteDC(hObject);
DeleteDC(hSave);
DeleteDC(hTemp);

}
这段代码的含义及用法

解决方案

透明背景代码

解决方案二:
已经注释很详细了,实在看不懂算了
直接调用
TransparentBitmap(HDC hdc HBITMAP hBitmap short xStart short yStart short xadd short yadd COLORREF cTransparentColor)
第一个参数传你View的 DC
第二个参数,位图句柄
然后是x y的起始坐标和结束坐标,最后是透明色(一般用白色作为透明色,看你的背景)

时间: 2024-10-22 10:30:53

位图-mfc显示透明背景代码看不大懂的相关文章

c语言-edison连接mpu6050代码看不大懂

问题描述 edison连接mpu6050代码看不大懂 #include "math.h" #include "stdio.h" #include "mraa.h" #include "unistd.h" #define MPU6050_I2C_ADDR 0x68 #define PWR_MGMT_1 0x6B #define SMPLRT_DIV 0x19 #define CONFIG 0x1A #define GYRO_CO

FLASH透明背景代码

这个透明背景代码是针对flash而言,如果flash本身不是透明的话,即时加上也没用. <param name="WMode" value="Transparent"> 这句是针对flash而言 如果flash本身不是透明的话 即时加上也没用. 示例代码如下: 以下是HTML网页特效代码,点击运行按钮可查看效果: [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

加快PictureBox显示透明背景图片的速度

问题描述 各位大虾们,请问一下,怎样加快Picturebox加载透明背景图的速度?在VB.net里面,放了20个PictureBox,所用的资源图片都已经加载到工程里,F5运行的时候,Picturebox会闪烁,这个怎么解决?我用过双缓冲Me.DoubleBuffered=True(窗体的Load事件里),可还是闪烁,有什么办法可以解决么? 解决方案 解决方案二:该回复于2011-12-16 09:08:49被版主删除解决方案三:在加载之前调用BeginUpdate,之后调用EndUpdate,

java 显示透明背景png图片

首先理由ps生成一个背景透明的png图片,然后设置JPanel面板的透明属性,也就是panel.setOpaque(false);设置为透明 class MyPanel extends JLayeredPane{ public myPanelOne panel = new myPanelOne(); public MyPanel(){ setPreferredSize(new Dimension(600, 600)); setLayout(null); panel.setBackground(C

在C++ Builder中显示透明位图

我们知道,GIF类型的图像格式支持透明显示,而BMP类型的图像格式不支持透明显示.在Microsoft照片编辑器中位图若以设置成透明色方式存储,则提示出错.然而,在C++Builder中,却可以轻而易举地显示透明位图.透明位图与透明GIF图像相比有一个很大的优点,即:GIF图像格式最大支持256种颜色,位图却可以支持真彩色. ----在C++Builder中显示透明位图 ----1.采用TImage组件. ----下面,我们制作一幅飞机凌空飞过蓝天的简单动画.因为移动的飞机是用透明位图显示的,所

透明位图的显示

包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数:TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码位图,另一种是动态生成掩码位图.本文将介绍动态生成掩码位图绘制具有透明区域位图的方法. 一.TransparentBlt 函数的使用 TransparentBlt 函数在Windows98/Windows2000以上版本运行,系统中需要包含 Msimg32.dll,使用时可以链接 Msimg32.l

MFC 可以设置背景色、字体、字体颜色、透明背景的 Static 静态文本控件

MFC库里没有符合这个条件的控件,于是我自己写了一个,初步测试有效. 注:可以设置透明背景,但还不能做到透明度设置(如50%透明度)         如果设置了背景色,就不保留透明背景         默认背景色是透明的 [cpp] view plaincopy // 设置背景色(若clr为CLR_NONE,则背景透明)   void SetBackgroundColor(COLORREF clr){m_clrBackground = clr;}   // 设置文字前景色   void SetT

div背景透明效果代码

用DIV做的背景透明效果,代码如下,拿出来跟大家分享. div背景透明样式: 样式代码: .alert{filter:alpha(opacity=100); /* IE */ -moz-opacity:1.0; /* Moz + FF */ opacity: 1.0; height:300px; width:500px; background:#ccc; left:50%; top:50%;margin-top:-150px;margin-left:-250px;position:absolut

VC++实现位图显示透明效果--实现原理

我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本文介绍了透明位图的制作知识,并将透明位图在一个对话框中显示了出来.本文所使用的原始位图及程序编译运行后的界面效果如下图所示: 图一.原始位图 图二.对话框界面上透明显示位图 一.实现方法 绘制"透明"位图是指绘制某一位图中除指定颜色外的其余部分,我们称这种颜色为"透明色".通过将位图的背景色指定为"透明色"