利用 Windows GDI 將視窗視為畫布,透過 TCanvas::CopyRect、MoveTo/LineTo、區域 (HRGN) 操作實作 17 種圖像進場/轉場動畫效果。
TBitmap::LoadFromFile,處理 256 色調色盤for 迴圈逐步繪製 + for(j=0;j<10000;j++); 簡易延遲CopyRect (區塊複製)、MoveTo/LineTo (掃描線效果)、CreateEllipticRgn (圓形擴散)| 類別 | 效果項目 | 核心技術 |
|---|---|---|
| 分割/合併 | 左右分開/合攏 | 雙 CopyRect 對稱展開/收斂 |
| 上下分開/合攏 | 同上,垂直方向 | |
| 左右錯位 | 上下半部相反方向平移 | |
| 上下錯位 | 左右半部相反方向平移 | |
| 平移進場 | 左/右/上/下 移入 | 單 CopyRect 來源/目標矩形逐步位移 |
| 刷屏掃描 | 左/右/上/下 刷屏 | 單側邊緣逐行/列複製 |
| 流水效果 | 上→下 / 下→上 | 雙重迴圈逐行複製產生波浪感 |
| 圓形擴散 | 圓形展開 | CreateEllipticRgn + SelectObject 裁剪繪圖 |
// 範例:左右分開 (Items1)
void __fastcall TForm1::Item1Click(TObject *Sender) {
Form1->Refresh();
int WideHalf = Bitmap1->Width / 2 + Bitmap1->Width % 2;
for (int i = 0; i <= WideHalf; i++) {
TRect Dest(WideHalf - i, 0, WideHalf + i, Bitmap1->Height);
TRect Src(WideHalf - i, 0, WideHalf + i, Bitmap1->Height);
Form1->Canvas->CopyRect(Dest, Bitmap1->Canvas, Src);
for (int j = 0; j < 10000; j++); // 簡易延遲
}
}
// 範例:圓形展開 (Items15)
void __fastcall TForm1::Item15Click(TObject *Sender) {
Form1->Refresh();
int maxR = sqrt(Bitmap1->Width*Bitmap1->Width + Bitmap1->Height*Bitmap1->Height) / 2 + 4;
for (int i = 1; i <= maxR; i++) {
HRGN rgn = CreateEllipticRgn(
Bitmap1->Width/2 - i, Bitmap1->Height/2 - i,
Bitmap1->Width/2 + i, Bitmap1->Height/2 + i);
SelectObject(Canvas->Handle, rgn);
Canvas->Draw(0, 0, Bitmap1);
DeleteObject(rgn);
for (int j = 0; j < 10000; j++);
}
}
TThread 或 TTimer 替代忙碌等待延遲TTransitionEffect 元件展示了 GDI 時代「視窗即畫布」的程式設計思維,對理解 Windows 繪圖架構、雙緩衝、區域裁剪極具教學價值。