📄 1.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title></title>
</head>
<div><center>
<table border="0" width="640">
<tr><td align="center"><b>在C++Builder中显示透明位图</b></td></tr>
<tr><td align="center"><font color="#CC9933"></font></td></tr>
<tr><td> 我 们 知 道,GIF 类 型 的 图 像 格 式 支 持 透 明 显 示, 而BMP 类 型 的 图 像 格 式 不 支 持 透 明 显 示。 在Microsoft 照 片 编 辑 器 中 位 图 若 以 设 置 成 透 明 色 方 式 存 储, 则 提 示 出 错。 然 而, 在C + + Builder 中, 却 可 以 轻 而 易 举 地 显 示 透 明 位 图。 透 明 位 图 与 透 明GIF 图 像 相 比 有 一 个 很 大 的 优 点, 即:GIF 图 像 格 式 最 大 支 持256 种 颜 色, 位 图 却 可 以 支 持 真 彩 色。 <br><br>----在C + + Builder 中 显 示 透 明 位 图 <br><br>----1. 采 用TImage 组 件。 <br><br>----下 面, 我 们 制 作 一 幅 飞 机 凌 空 飞 过 蓝 天 的 简 单 动 画。 因 为 移 动 的 飞 机 是 用 透 明 位 图 显 示 的, 所 以 看 起 来 挺 逼 真 的。 <br><br>---- (1) 在C + + Builder 下 激 活 菜 单"File /New Application" 创 建 一 个 新 工 程, 窗 体 单 元 以 文 件planemain.cpp 存 盘, 工 程 文 件 以plane.cpp 存 盘。 <br><br>----(2) 在Form1 窗 体 上 新 增 一 个TButton 组 件Button1, <br><br>----新 增 一 个TTimer 组 件Timer1, 新 增 三 个TImage 组 件Image1、Image2 和Image3, 新 增 一 个TLabel。 <br><br>---- (3) 在 窗 体 上 双 击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( 决 定 飞 机 飞 行 的 快 慢, 可 调 整)。 <br><br>----(4) Timer1 的OnTimer 事 件 控 制 飞 机 的 移 动, 代 码 如 下: <br><br> void __fastcall TForm1::Timer1Timer<br> (TObject *Sender)<br> {Image2 ->Left=Image2 ->Left +1;}<br><br>----Button1 的OnClick 事 件 启 动 飞 机, 代 码 如 下: <br><br>void __fastcall TForm1::Button1Click<br> (TObject *Sender)<br> {Timer1 ->Enabled=true;}<br><br>----下 图 是 程 序 的 运 行 结 果: <br><br> <br><br>----2. 直 接 从 文 件 中 调 入 位 图, 然 后 画 在 屏 幕 上。 这 种 方 法 灵 活, 且 占 用 内 存 少。 继 续 上 面 的 程 序 设 计: <br><br>---- (1) 在 窗 体 上 新 增 一 个TButton 组 件 Button2, 设 置 其Caption 属 性 为" 显 示 透 明 位 图"。 <br><br>---- (2) Button2 的OnClick 事 件 显 示 透 明 的 位 图, 代 码 如 下: <br><br> void __fastcall TForm1::Button2Click(TObject *Sender)<br> // 单 击" 显 示 透 明 位 图" 按 钮 时 进 入<br> {<br> Graphics::TBitmap *pBitmap=new Graphics::TBitmap();<br> try<br> {pBitmap ->LoadFromFile("Plane.bmp"); <br> // 调 入 位 图<br>
pBitmap ->Transparent = true; <br> // 设 置 透 明 属 性<br>
pBitmap ->TransparentColor=<br> pBitmap ->Canvas ->Pixels[2][2];<br> // 从 位 图 上 取 得 要 设 置 成 的<br> 透 明 颜 色, 也 可 以 直 接 给 出<br>
Form1 ->Canvas ->Draw(10,20,pBitmap); <br> //AA<br>
// 在 窗 体 上 显 示 透 明 位 图, <br> 没 有 设 置TransparentMode<br>
// 以 位 图[2][2] 处 的 像 素 的 颜 色 为 透 明 色<br>
pBitmap ->TransparentMode = tmAuto;<br> // 设 置 透 明 模 式, tmAuto: <br> TransparentColor 属 性 返 回 位 <br>
// 图 最 左 下 角 像 素 的 颜 色, 作 为 透 明 色; <br> // tmFixed: TransparentColor 属 性 返 回 位 图<br> 上 某 一 像 素 的 颜 色, 作 为 透 明 色。<br><br> Form1 ->Canvas ->Draw(10,100,pBitmap); <br> //BB<br> // 在 窗 体 上 显 示 透 明 位 图, <br> 与AA 行 有 所 不 同<br> // 以 位 图 最 左 下 角 的 像 素 的 颜 色 为 透 明 色<br> Image1 ->Canvas ->Draw(30,20,pBitmap);<br> // 在 背 景 位 图 上 显 示 透 明 位 图<br> }<br> catch (...)<br> {<br> ShowMessage(" 不 能 调 入 或 显 示 位 图 !"); <br> / / 显 示 出 错 信 息<br> }<br> delete pBitmap; / / 删 除 对 像<br> }<br><br>----应 用 这 种 方 法 进 行 图 像 合 成 时, 背 景 图 像 要 求 是 位 图, 并 且 透 明 位 图 和 背 景 位 图 的 颜 色 位 数 要 尽 量 保 持 一 致, 这 样, 位 图 的 颜 色 才 不 会 改 变。 <br><br>----另 外, 我 们 利 用TImageList 组 件 也 可 以 显 示 透 明 图 像, 利 用TCanvas 类 的BrushCopy 方 法 可 以 实 现 被 拷 贝 图 像 的 部 分 透 明。 <br><br>---- 以 上 程 序 在WIN 98 和C + + Builder3 下 调 试 通 过。</td></tr>
</table></center></div>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -