桌面寵物/動畫精靈 (如追蹤滑鼠的貓咪) 實現原理極其簡單:準備連續幀圖片,建立不規則形狀視窗 (SetWindowRgn),以 Timer 驅動視窗移動與幀切換。本文以 BCB 3.0 為例,示範一個向上飄動的圓形動畫精靈。
SetWindowRgn(HWND, HRGN, TRUE):設定視窗可見區域為指定區域 (如圓形、多邊形),實現不規則視窗。CreateEllipticRgn(x1, y1, x2, y2):建立橢圓/圓形區域。Timer 元件:定時觸發移動與重繪。Timer1,Enabled=false、Interval=150 (約 6.7 FPS)。Unit1.h 引入:#include <winuser.h>、#include <wingdi.h>。void __fastcall TForm1::FormCreate(TObject *Sender) {
BorderStyle = bsNone; // 無邊框
Timer1->Enabled = false;
Timer1->Interval = 150;
// 建立 80x80 圓形區域並套用至視窗
SetWindowRgn(Handle, CreateEllipticRgn(0, 0, 80, 80), TRUE);
}
void __fastcall TForm1::FormPaint(TObject *Sender) {
Canvas->Pen->Width = 1;
Canvas->Pen->Style = psSolid;
Canvas->Pen->Color = clRed;
Canvas->Brush->Color = clRed;
Canvas->Ellipse(0, 0, 79, 79); // 在客戶區繪製滿視窗圓形
}
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y) {
if (Button == mbLeft) Timer1->Enabled = true; // 左鍵開始
if (Button == mbRight) Close(); // 右鍵退出
}
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
if (Top > 1) Top -= 2; // 每幀向上 2 像素
else Timer1->Enabled = false; // 到達頂部停止
}
| 功能 | 實現要點 |
|---|---|
| 多幀動畫 (走路、飛行) | 準備連續幀 BMP/PNG,Timer 事件中切換 Image->Picture 或 Canvas->Draw 不同幀。 |
| 追蹤滑鼠游標 | Timer 中讀取 Mouse->CursorPos,計算向量逐步移動視窗 Left/Top。 |
| 不規則形狀 (角色外型) | 用透明色 BMP 建立區域:CreatePolygonRgn 或掃描位圖透明像素生成矩形區域組合 (參考文章 7924)。 |
| 互動行為 (點擊反應、對話) | 滑鼠事件中切換狀態機,播放對應動畫序列。 |
| 多精靈同時運行 | 每個精靈一個 Form 實例,或單 Form 內管理多個圖層位置與區域。 |
| 透明背景與 Alpha 混合 | Win2000+ 使用 WS_EX_LAYERED + PNG Alpha 通道;Win9x 需手工合成 (參考文章 7922)。 |