首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++Builder 透明位圖顯示技術:TImage、Canvas.Draw、TransparentColor/Mode 詳解

     編輯:VC 教學

透明位圖 vs GIF

  • GIF:僅支援 256 色、單一透明色、動畫。
  • BMP (位圖):支援真彩色 (24/32-bit)、可設定任意顏色為透明色、**無專屬透明欄位**,靠應用層繪製時指定透明色實現。

方法一:TImage 控件 (設計期/靜態)

  1. 放置 TImage (背景) → Transparent = false。
  2. 放置另一 TImage (前景,如飛機) → Transparent = true、AutoSize = true、置於背景上層。
  3. 運行時移動前景 Image->Left/Top 即可產生透明動畫效果。

方法二:Canvas.Draw + TransparentColor/Mode (動態/靈活)

void __fastcall TForm1::btnDrawTransparentClick(TObject *Sender)
{
    Graphics::TBitmap* bmp = new Graphics::TBitmap();
    try {
        bmp->LoadFromFile("Plane.bmp");          // 載入
        bmp->Transparent = true;                 // 啟用透明
        bmp->TransparentColor = bmp->Canvas->Pixels[2][2];  // 指定透明色 (取樣點)
        // 或 bmp->TransparentMode = tmAuto;     // 自動取左下角像素色
        // 或 bmp->TransparentMode = tmFixed;    // 使用 TransparentColor 屬性

        Form1->Canvas->Draw(10, 20, bmp);        // 繪到視窗
        Form1->Canvas->Draw(10, 100, bmp);       // 另一位置
        Image1->Canvas->Draw(30, 20, bmp);       // 繪到另一 TImage (背景)
    } catch (...) {
        ShowMessage("載入/繪製失敗");
    }
    delete bmp;
}

關鍵屬性詳解

屬性說明
TransparentBoolean,啟用/停用透明繪製。
TransparentColorTColor,指定視為透明的 RGB 色值。
TransparentModetmAuto:繪製時自動取位圖左下角 (0, Height-1) 像素顏色作為透明色。
tmFixed:使用 TransparentColor 屬性值。

進階:TImageList + BrushCopy (部分透明)

  • TImageList 內建遮罩,支援每像素 Alpha (32-bit) 或 1-bit 遮罩。
  • Canvas->BrushCopy(Rect, ImageList, Index, clNone) 可繪製透明圖示。
  • 適合工具列、樹狀視圖、列表視圖圖示。

合成建議

  • 背景圖**必須為位圖** (或先轉為位圖),否則色彩匹配會導致邊緣雜色。
  • 前景透明圖與背景圖 **色深一致** (同為 24-bit 或 32-bit),避免色彩截斷。
  • 大量合成時,先在離屏 TBitmap 合成完成,再一次 BitBlt 到螢幕 (雙緩衝)。

完整動畫範例 (飛機飛過藍天)

// FormCreate
ImageBg->Picture->LoadFromFile("BlueSky.bmp");
ImageBg->Transparent = false;
ImagePlane->Picture->LoadFromFile("Plane.bmp");
ImagePlane->Transparent = true;
ImagePlane->AutoSize = true;
ImagePlane->Left = 0; ImagePlane->Top = 50;
Timer1->Interval = 50; Timer1->Enabled = true;

// Timer1Timer
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
    ImagePlane->Left += 5;
    if (ImagePlane->Left > ClientWidth) ImagePlane->Left = -ImagePlane->Width;
}

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved