一、直接使用Animate 部件
在您的程序中只要增加一個Animate
部件,并設置其部分屬性就可實現動畫,但缺點就在于Animate
部件只能打開已有的AVI 視屏文件(或使用Windows 公用AVI),有一定的系統開銷。
在板2(Panel2)中加入一個Animate 部件(Animate1),我們設置其FileName
或CommonAVI 及Active 屬性以使其執行某AVI 視屏文件或Windows 公用AVI。設置Animate1
的CommonAVI 屬性值為aviFindFolder,它將執行我們常見的在搜索文件夾過程中的搜索動畫。
為控制Animate1 的動作,為第一個復選框(CheckBox1)的OnClick
事件增加代碼如下:
void __fastcall TDemoForm::
CheckBox1Click(TObject *Sender)
{
Animate1 ->Active = CheckBox1 ->Checked;
}
二、使用Timer 部件定時繪制畫面
在C ++Builder 的System 標簽中有一個Timer 部件,使用Timer
部件實際上是使用Windows
定時器,定時繪制部分畫面,達到動畫效果。
準備幾張連續的Bmp 圖片。
Pic0.bmp Pic1.bmp Pic2.bmp Pic3.bmp 在板3(Panel3)中加入Image 部件(Image1),并預裝入一幅圖片(如:Pic3.bmp)。
為在程序中存儲這些圖片,在主窗體的頭文件中增加變量定義:
TPicture *pic[4]; // 存儲圖片的指針
int number; // 記錄當前圖片序號
并為主窗口的OnCreate
事件增加代碼,在程序主窗口創建時裝入圖片,即:
void __fastcall TDemoForm::FormCreate(TObject *Sender)
{
number = 0;
AnsiString Path = ExtractFilePath(Application ->ExeName);
for(int i=0; i<4; i ++) {
pic[i] = new TPicture();
try {
pic[i] ->LoadFromFile(Path +
"pic" +IntToStr(i) +“.bmp");
}
catch(...) {
Application ->MessageBox
("\n 無法打開圖片文件...\t\n",
“錯誤", MB_ICONWARNING|MB_OK);
} }
}
增加Timer 部件(Timer1),設置其時間間隔Interval 屬性為200
毫秒;另外,設置Timer1 的Enabled 屬性值為false。為定時更換繪制圖片,為Timer1
的OnTimer 事件增加代碼如下:
void __fastcall TDemoForm::
Timer1Timer(TObject *Sender)
{
Image1 ->Canvas ->CopyRect
(Image1 ->ClientRect,
pic[number] ->Bitmap ->Canvas,
Rect(0, 0, pic[number] ->Width,
pic[number] ->Height));
number ++;
number %=4;
}
為第二個復選框(CheckBox2)的OnClick
事件增加代碼如下,以控制動畫的執行與停止:
void __fastcall TDemoForm::CheckBox2Click
(TObject *Sender)
{
Timer1 ->Enabled = CheckBox2 ->Checked;
}
使用Timer
部件,定時繪制畫面也并不復雜,但因為要存儲多幅圖片,系統開銷卻是相當大的,但其動畫效果卻也相當好。
三、利用程序空閑時間更換/ 重繪畫面
OnIdle 事件是TApplication
類的事件之一。當應用程序空閑時,程序就會產生OnIdle
事件,利用程序空閑執行動畫不是很妙嗎?
首先在演示程序主窗體的第四個板(Panel4)上增加一個標簽(Lable1),根據你的個人愛好設置其Caption
及Font 等屬性。再在主窗體的類定義中增加一個OnIdle
事件處理函數,它像普通函數一樣定義,但需保證其原型正確。我們定義的OnIdle
事件處理函數在主窗體的頭文件中作如下申明:
void __fastcall MyIdleHandler(TObject *Sender, bool &Done);
其完整代碼為:
void __fastcall TDemoForm::MyIdleHandler
(TObject *Sender, bool &Done)
{
int StartTime = GetTickCount();
if(Label1 ->Top +Label1 ->Height>0) {
Label1 ->Top --;
}
else {
Label1 ->Top = Panel4 ->Height;
}
while(GetTickCount() -StartTime < 50);
}
請注意,為避免移動標簽速度過快,使用
了下面的代碼段:
int StartTime = GetTickCount();
...
while(GetTickCount() -StartTime < 50);
它保證了動畫的時間間隔不少于50 毫
秒。
為第三個復選框(CheckBox3)的OnClick 事件
增加代碼如下:
void __fastcall TDemoForm::CheckBox3Click
(TObject *Sender)
{
if(CheckBox3 ->Checked) {
Application ->OnIdle = MyIdleHandler;
}
else {
Application ->OnIdle = NULL;
}
}
為保證程序執行的安全性,還需在程序
結束時做一些必要的處理(如釋放程序運行過程中分配的空
間)。為主窗體的OnDestroy 事件增加代碼如下:
void __fastcall TDemoForm::FormDestroy
(TObject *Sender)
{
for(int i=0; i<4; i ++) {
delete pic[i];
}
Application ->OnIdle = NULL;
}