在C + + Builder 中 显 示 透 明 位 图
在C + + Builder 中
显 示 透 明 位 图
我 们 知 道,GIF 类 型 的 图 像 格 式 支 持 透 明 显 示, 而BMP 类 型 的 图 像 格 式 不 支 持 透 明 显 示。 在Microsoft 照 片 编 辑 器 中 位 图 若 以 设 置 成 透 明 色 方 式 存 储, 则 提 示 出 错。 然 而, 在C + + Builder 中, 却 可 以 轻 而 易 举 地 显 示 透 明 位 图。 透 明 位 图 与 透 明GIF 图 像 相 比 有 一 个 很 大 的 优 点, 即:GIF 图 像 格 式 最 大 支 持256 种 颜 色, 位 图 却 可 以 支 持 真 彩 色。
----在C + + Builder 中 显 示 透 明 位 图
----1. 采 用TImage 组 件。
----下 面, 我 们 制 作 一 幅 飞 机 凌 空 飞 过 蓝 天 的 简 单 动 画。 因 为 移 动 的 飞 机 是 用 透 明 位 图 显 示 的, 所 以 看 起 来 挺 逼 真 的。
---- (1) 在C + + Builder 下 激 活 菜 单"File /New Application" 创 建 一 个 新 工 程, 窗 体 单 元 以 文 件planemain.cpp 存 盘, 工 程 文 件 以plane.cpp 存 盘。
----(2) 在Form1 窗 体 上 新 增 一 个TButton 组 件Button1,
----新 增 一 个TTimer 组 件Timer1, 新 增 三 个TImage 组 件Image1、Image2 和Image3, 新 增 一 个TLabel。
---- (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( 决 定 飞 机 飞 行 的 快 慢, 可 调 整)。
----(4) 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. 直 接 从 文 件 中 调 入 位 图, 然 后 画 在 屏 幕 上。 这 种 方 法 灵 活, 且 占 用 内 存 少。 继 续 上 面 的 程 序 设 计:
---- (1) 在 窗 体 上 新 增 一 个TButton 组 件 Button2, 设 置 其Caption 属 性 为" 显 示 透 明 位 图"。
---- (2) 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; / / 删 除 对 像 }
----应 用 这 种 方 法 进 行 图 像 合 成 时, 背 景 图 像 要 求 是 位 图, 并 且 透 明 位 图 和 背 景 位 图 的 颜 色 位 数 要 尽 量 保 持 一 致, 这 样, 位 图 的 颜 色 才 不 会 改 变。
----另 外, 我 们 利 用TImageList 组 件 也 可 以 显 示 透 明 图 像, 利 用TCanvas 类 的BrushCopy 方 法 可 以 实 现 被 拷 贝 图 像 的 部 分 透 明。
---- 以 上 程 序 在WIN 98 和C + + Builder3 下 调 试 通 过。