-
c语言入门之如何在C++ Builder中显示透明位图
信息产业部电子第二十二研究所
牛有田
---- 我们知道,GIF类型的图像格式支持透明显示,而BMP类型的图像格式不支持透明显示。在Microsoft照片编辑器中位图若以设置成透明色方式存贮,则提示出错。然而,在功能强大的C++ Builder中,不但能显示透明位图,而且可以说是一件轻易而举的事情。有了透明显示位图的技术,您就能制作出象图像合成等奇妙的效果来。透明位图与透明GIF图像相比有一个很大的优点,即:GIF图像格式最大支持256种颜色,位图却可以支持真彩色。在C++ Builder中显示透明位图有好几种方法:
---- 1. 第一种方法是采用Timage组件。
---- 这种方法简单有效,并且当进行图像合成时,对背景图像的类型和格式不作要求。在缺省情况下,以位图最左下角象素的颜色为透明色。
---- 下面,我们制作一幅飞机凌空飞过蓝天的简单动画。因为移动的飞机是用透明位图显示的,所以看起来挺逼真的。在C++ Builder下激活菜单“File/New Application”创建一个新工程,窗体单元以文件planemain.cpp存盘,工程文件以plane.cpp存盘。? 在Form1窗体上新增一个TButton组件Button1,新增一个TTimer组件Timer1,新增三个TImage组件Image1、Image2和Image3,新增一个TLabel。
---- 在窗体上双击Image1,调入蓝天的位图BlueSky.bmp,设置其Transpartant属性为false,即为不透明,作为背景;双击Image2,调入飞机的位图Plane.bmp,设置其Transparent属性为true,即为透明,Autosize属性为true,把Image2放在Image1上面。此时可以看出,飞机已经融入蓝天中。作为对比,双击Image3,调入飞机的位图Plane.bmp,设置其Transparent属性为false,即为不透明,Autosize属性为true。设置Label1的Caption属性为“源位图”。设置Button1的Caption属性为“开始”。设置Timer1的Enabled属性为false,Interval属性为100(决定飞机飞行的快慢,可调整)。
Timer1的OnTimer事件控制飞机的移动,代码如下:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Image2->Left=Image2->Left+1;
}
Button1的OnClick事件启动飞机,代码如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled=true;
}
---- 下图是程序的运行结果(略)。
---- 2. 第二种方法是直接从文件中调入位图,然后画在屏幕上。这种方法灵活,且占用内存少。我们继续上面的程序设计:
---- 在窗体上新增一个TButton组件Button2,设置其Caption属性为“显示透明位图”。
---- Button2的OnClick事件显示透明的位图,代码如下:
void __fastcall TForm1::Button2Click(TObject *Sender)
//单击“显示透明位图”按钮时进入
{
Graphics::TBitmap *pBitmap=new Graphics::TBitmap();
try
{
pBitmap- >LoadFromFile("Plane.bmp"); //调入位图
pBitmap- >Transparent = true; //设置透明属性
pBitmap- >TransparentColor=
pBitmap- > Canvas- >Pixels[2][2];
//从位图上取得要设置成的透明颜色,也可以直接给出
Form1- >Canvas- >Draw(10,20,pBitmap); //AA
//在窗体上显示透明位图, 没有设置TransparentMode
//以位图[2][2]处的象素的颜色为透明色
pBitmap- >TransparentMode = tmAuto;
//设置透明模式, tmAuto: TransparentColor属性返回位
//图最左下角象素的颜色,作为透明色;
// tmFixed: TransparentColor属性返回位图上某一象素
//的颜色,作为透明色。
Form1- >Canvas- >Draw(10,100,pBitmap); //BB
//在窗体上显示透明位图, 与AA行有所不同
//以位图最左下角的象素的颜色为透明色
Image1- >Canvas- >Draw(30,20,pBitmap);
//在背景位图上显示透明位图
}
catch (...)
{
ShowMessage("不能调入或显示位图!");
//显示出错信息
}
delete pBitmap; //删除对象
}
---- 应用这种方法进行图像合成时,背景图像要求是位图,并且透明位图和背景位图的颜色位数要尽量保持一致,这样,位图的颜色才不会改变。我做了一个试验:飞机位图的颜色是24bits真彩色,①当背景位图BlueSky.bmp(取自Win98下的Clouds.bmp)是256色时,显示不正确(这可能是C++ Builder的一个BUG);②当背景位图是其它256色位图(如C++ Builder提供的factory.bmp等),甚至于是16色位图时,却显示正确!但是飞机位图颜色要变为256色或16色(颜色发生转换)。为了解决①中的错误,我们可在“画图”中先调入Clouds.bmp位图,然后再以24bits颜色格式“另存为……”,以此新位图为背景,显示的飞机正确且不改变颜色。
---- 另外,我们利用TImageList组件也可以显示透明图像,利用TCanvas类的BrushCopy方法可以实现被拷贝图像的部分透明。
---- 以上程序在Win98和C++ Builder3下调试通过。
牛有田
---- 我们知道,GIF类型的图像格式支持透明显示,而BMP类型的图像格式不支持透明显示。在Microsoft照片编辑器中位图若以设置成透明色方式存贮,则提示出错。然而,在功能强大的C++ Builder中,不但能显示透明位图,而且可以说是一件轻易而举的事情。有了透明显示位图的技术,您就能制作出象图像合成等奇妙的效果来。透明位图与透明GIF图像相比有一个很大的优点,即:GIF图像格式最大支持256种颜色,位图却可以支持真彩色。在C++ Builder中显示透明位图有好几种方法:
---- 1. 第一种方法是采用Timage组件。
---- 这种方法简单有效,并且当进行图像合成时,对背景图像的类型和格式不作要求。在缺省情况下,以位图最左下角象素的颜色为透明色。
---- 下面,我们制作一幅飞机凌空飞过蓝天的简单动画。因为移动的飞机是用透明位图显示的,所以看起来挺逼真的。在C++ Builder下激活菜单“File/New Application”创建一个新工程,窗体单元以文件planemain.cpp存盘,工程文件以plane.cpp存盘。? 在Form1窗体上新增一个TButton组件Button1,新增一个TTimer组件Timer1,新增三个TImage组件Image1、Image2和Image3,新增一个TLabel。
---- 在窗体上双击Image1,调入蓝天的位图BlueSky.bmp,设置其Transpartant属性为false,即为不透明,作为背景;双击Image2,调入飞机的位图Plane.bmp,设置其Transparent属性为true,即为透明,Autosize属性为true,把Image2放在Image1上面。此时可以看出,飞机已经融入蓝天中。作为对比,双击Image3,调入飞机的位图Plane.bmp,设置其Transparent属性为false,即为不透明,Autosize属性为true。设置Label1的Caption属性为“源位图”。设置Button1的Caption属性为“开始”。设置Timer1的Enabled属性为false,Interval属性为100(决定飞机飞行的快慢,可调整)。
Timer1的OnTimer事件控制飞机的移动,代码如下:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Image2->Left=Image2->Left+1;
}
Button1的OnClick事件启动飞机,代码如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled=true;
}
---- 下图是程序的运行结果(略)。
---- 2. 第二种方法是直接从文件中调入位图,然后画在屏幕上。这种方法灵活,且占用内存少。我们继续上面的程序设计:
---- 在窗体上新增一个TButton组件Button2,设置其Caption属性为“显示透明位图”。
---- Button2的OnClick事件显示透明的位图,代码如下:
void __fastcall TForm1::Button2Click(TObject *Sender)
//单击“显示透明位图”按钮时进入
{
Graphics::TBitmap *pBitmap=new Graphics::TBitmap();
try
{
pBitmap- >LoadFromFile("Plane.bmp"); //调入位图
pBitmap- >Transparent = true; //设置透明属性
pBitmap- >TransparentColor=
pBitmap- > Canvas- >Pixels[2][2];
//从位图上取得要设置成的透明颜色,也可以直接给出
Form1- >Canvas- >Draw(10,20,pBitmap); //AA
//在窗体上显示透明位图, 没有设置TransparentMode
//以位图[2][2]处的象素的颜色为透明色
pBitmap- >TransparentMode = tmAuto;
//设置透明模式, tmAuto: TransparentColor属性返回位
//图最左下角象素的颜色,作为透明色;
// tmFixed: TransparentColor属性返回位图上某一象素
//的颜色,作为透明色。
Form1- >Canvas- >Draw(10,100,pBitmap); //BB
//在窗体上显示透明位图, 与AA行有所不同
//以位图最左下角的象素的颜色为透明色
Image1- >Canvas- >Draw(30,20,pBitmap);
//在背景位图上显示透明位图
}
catch (...)
{
ShowMessage("不能调入或显示位图!");
//显示出错信息
}
delete pBitmap; //删除对象
}
---- 应用这种方法进行图像合成时,背景图像要求是位图,并且透明位图和背景位图的颜色位数要尽量保持一致,这样,位图的颜色才不会改变。我做了一个试验:飞机位图的颜色是24bits真彩色,①当背景位图BlueSky.bmp(取自Win98下的Clouds.bmp)是256色时,显示不正确(这可能是C++ Builder的一个BUG);②当背景位图是其它256色位图(如C++ Builder提供的factory.bmp等),甚至于是16色位图时,却显示正确!但是飞机位图颜色要变为256色或16色(颜色发生转换)。为了解决①中的错误,我们可在“画图”中先调入Clouds.bmp位图,然后再以24bits颜色格式“另存为……”,以此新位图为背景,显示的飞机正确且不改变颜色。
---- 另外,我们利用TImageList组件也可以显示透明图像,利用TCanvas类的BrushCopy方法可以实现被拷贝图像的部分透明。
---- 以上程序在Win98和C++ Builder3下调试通过。
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式