MFC中透明位图原理

总之,就是不断反复遮罩“过滤掉”透明色就行,先来整段代码,后面再详细介绍。

void CTransDlg::OnPaint()
{
	CPaintDC dc(this);
	CMemDC m_dc;
	if(!m_dc)
		m_dc.LoadBitmap(IDB_BITMAP4);

		CMemDC dcImage(100,100,&dc);
		CBitmap bmpMask;
		bmpMask.CreateBitmap(100,100,1,1,NULL);
		CDC dcMask;
		dcMask.CreateCompatibleDC(&dc);
		dcMask.SelectObject(bmpMask);
		dcImage.BitBlt(0,0,100,100,&m_dc,0,0,SRCCOPY);

		dc.BitBlt(10,10,100,100,&m_dc,0,0,SRCCOPY);         //显示图1
		dc.BitBlt(120,10,100,100,&dcMask,0,0,SRCCOPY);      //显示图2

		dcImage.SetBkColor(RGB(255,0,0));
		dcMask.BitBlt(0,0,100,100,&dcImage,0,0,SRCCOPY);

		dc.BitBlt(230,10,100,100,&dcMask,0,0,SRCCOPY);      //显示图3
		dc.BitBlt(340,10,100,100,&dcImage,0,0,SRCCOPY);      //显示图4

		dcImage.SetBkColor(RGB(0,0,0));
		dcImage.SetTextColor(RGB(255,255,255));

		dc.BitBlt(450,10,100,100,&dcImage,0,0,SRCCOPY);		//显示图5

		dcImage.BitBlt(0,0,100,100,&dcMask,0,0,SRCAND);		

		dc.BitBlt(10,120,100,100,&dcImage,0,0,SRCCOPY);			//显示图6
		dc.BitBlt(120,120,100,100,&dcMask,0,0,SRCCOPY);			//显示图7

		dc.SetBkColor(RGB(255,255,255));

		dc.BitBlt(230,120,100,100,&dcMask,0,0,SRCAND);			//显示图8
		dc.BitBlt(230,120,100,100,&dcImage,0,0,SRCPAINT);		//显示图8
}
m_dc.LoadBitmap(IDB_BITMAP4);     //加载原图,就是下面这张,由红,绿,黄组成的,白色的是背景,不算原图

CMemDC dcImage(100,100,&dc);//演示原理中一共用到了三个DC,DC就理解成一张画布,dcImage是一个临时DC,也可以理解成为一张100X100的临时画布,原图没有这么大,所以会露出背景;
CBitmap bmpMask;
CBitmap bmpMask;
bmpMask.CreateBitmap(100,100,1,1,NULL);    //创建一张单色位图,位图要想看到,必须画在画布上,也就是复制到(BitBlt)DC上
CDC dcMask;
dcMask.CreateCompatibleDC(&dc);           //创建一张掩码用的画布
dcMask.SelectObject(bmpMask);             //把那张单色位图画在画布上
dcImage.BitBlt(0,0,100,100,&m_dc,0,0,SRCCOPY);   //m_dc这张画布上的原图COPY到临时画布dcImage上<pre name="code" class="cpp">dc.BitBlt(10,10,100,100,&m_dc,0,0,SRCCOPY);         //在最终画布dc上显示原图
dc.BitBlt(120,10,100,100,&dcMask,0,0,SRCCOPY);      //在最终画布dc上显示单色掩码位图

dcImage.SetBkColor(RGB(255,0,0));              //把红色设置成dcImage这张画布的背景色,也就是透明色
dcMask.BitBlt(0,0,100,100,&dcImage,0,0,SRCCOPY); //dcImage把自己复制给dcMask时,告诉他红色是背景色,dcMask只能显示两种颜色,所以dcImage上红色的地方变白色,其他地方是黑色

dc.BitBlt(230,10,100,100,&dcMask,0,0,SRCCOPY);      //显示dcMask这张画布
dc.BitBlt(340,10,100,100,&dcImage,0,0,SRCCOPY);      //显示显示dcImage这张画布

dcImage.SetBkColor(RGB(0,0,0));              //dcImage将黑色设置成背景色
dcImage.SetTextColor(RGB(255,255,255));

dc.BitBlt(450,10,100,100,&dcImage,0,0,SRCCOPY);		//显示dcImage

dcImage.BitBlt(0,0,100,100,&dcMask,0,0,SRCAND);			//dcImage与dcMask相与,注意此时dcImage的透明色是黑色,所以dcMask中的黑色到了dcImage上就成了透明色	

dc.BitBlt(10,120,100,100,&dcImage,0,0,SRCCOPY);			//显示dcImage
dc.BitBlt(120,120,100,100,&dcMask,0,0,SRCCOPY);			//显示dcMask  第一张是原来的dcImage,第二张是dcMask,第三张是相与以后的dcImage

dc.SetBkColor(RGB(255,255,255));<span style="white-space:pre">				</span>//最终画布dc的透明色设置成白色

dc.BitBlt(230,120,100,100,&dcMask,0,0,SRCAND);			//dcMask与最终画布相与
dc.BitBlt(230,120,100,100,&dcImage,0,0,SRCPAINT);		//dcImage与最终画布相或   第一张是dcMask,第二张是dcImage,第三张是最终效果

时间: 2024-10-13 18:02:58

MFC中透明位图原理的相关文章

透明位图的显示 作者:王骏

透明位图的显示作者:王骏 http://www.vckbase.com/document/viewdoc/?id=532 下载本文示例代码 包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数:TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码位图,另一种是动态生成掩码位图.本文将介绍动态生成掩码位图绘制具有透明区域位图的方法. 一.TransparentBlt 函数的使用  TransparentB

MFC中的GDI绘图&lt;转&gt;

一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Windows操作系统中,动态链接库C:\WINDOWS\system32\gdi32.dll(GDI Client DLL)中定义了GDI函数,实现与设备无关的包括屏幕上输出像素.在打印机上输出硬拷贝以及绘制Windows用户界面功能.在Visual C++6.0中的头文件C:\Program Files

MFC中使用FLASH

一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约为2.66M),并安装.对于Windows 32位系统,其默认安装目录为:C:\WINDOWS\system32\Macromed\Flash\:对于64位系统,为:C:\Windows\SysWOW64\Macromed\Flash. Flash控件的大版本号用数字表示,如9,10,11等,小版本

MFC中使用FLASH相关

出自http://my.oschina.net/ypimgt/blog/62573 一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约为2.66M),并安装.对于Windows 32位系统,其默认安装目录为:C:\WINDOWS\system32\Macromed\Flash\:对于64位系统,为:C:\Windows\SysWOW64\Macro

MFC中的GDI绘图(1)

一.关于GDI的基本概念 什么是GDI         Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Windows操作系统中,动态链接库C:\WINDOWS\system32\gdi32.dll(GDI Client DLL)中定义了GDI函数,实现与设备无关的包括屏幕上输出像素.在打印机上输出硬拷贝以及绘制Windows用户界面功能.在Visual C++6.0中的头文件C:\Progra

MFC消息映射的原理:笔记

多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里面的每个类有很多成员函数(只说消息反映相关的成员函数啊),而且在派生类中,需要改写的也比较少(我用来做练习的程序就是那么一两个,呵呵).那么用c++的虚函数的实现机制会导致什么问题呢?就是大量虚表的建立使得空间浪费掉很多. 嗯-怎么办呢?于是各大c++名库(比如QT,MFC,VCL-)在消息映射的实

vc实现透明位图,透明背景

vc实现透明位图,透明背景 我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本文介绍了透明位图的制作知识,并将透明位图在一个对话框中显示了出来. 一.实现方法 绘制"透明"位图是指绘制某一位图中除指定颜色外的其余部分,我们称这种颜色为"透明色".通过将位图的背景色指定为"透明色",在绘制时,不绘制这部分背景,而仅绘制图像,这样就可以将位图中图像透明地绘制到

图像叠加,渐变,透明,水印原理

基本原理, 图像A,图像B,叠加后输出的图像C; Ci=Ai*a + (1-a)*Bi; i 表示第几个像素点; 对于32位的真色彩图像,存放格式有RGBA,ARGB,即4个通道; A即alpha通道值,即这样的图像可以用高8位或低8位(RGBA)来实现图像的透明程度, 0 <= a <= 1, 最小值为0,即完全透明,最大值为1,即不透明,全部显示; a值要与像素点中的每个通道的值进行相乘,得到新的像素点各通道值; 比如,0x80FFFF00是50%透明的黄色,0x80是128,大约是255

MFC的运行机制 以及 MFC中的DC、CDC、HDC、句柄、设备上下文 [转]

在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API.你说你喜欢C++而MFC换一种说法就是一个用C++写的一个函数库 然后你来调用 只不过这个类不是你写的 MFC提供数百个类,最重要的.也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石. 1>封装特性:构成MFC框架的是MFC类库而MFC类库又是C++的一个类库.这些类封装W