|
----在 您的程序中只要增加一个Animate部件,并设置其部分属性就可实现动画,但缺点就在于Animate部件只能打开已有的AVI视屏文件(或使用Windows公用AVI),有一定的系统开销。 void __fastcall TDemoForm::
二、 使用Timer部件定时绘制画面
CheckBox1Click(TObject *Sender) { Animate1 ->Active = CheckBox1 ->Checked; } ----在C++Builder的System标签中有一个Timer部件,使用Timer部件实际上是使用Windows定时器,定时绘制部分画面,达到动画效果。 TPicture *pic[4]; // 存 储 图 片 的 指 针
----并为主窗口的OnCreate事件增加代码,在程序主窗口创建时装入图片,即:
int number; // 记 录 当 前 图 片 序 号 void __fastcall TDemoForm::FormCreate(TObject *Sender)
----增加Timer部件(Timer1),设置其时间间隔Interval属性为200毫秒;另外,设置Timer1的Enabled属性值为false。为定时更换绘制图片,为Timer1的OnTimer事件增加代码如下:
{ 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); } } } void __fastcall TDemoForm::
----为第二个复选框(CheckBox2)的OnClick事件增加代码如下,以控制动画的执行与停止:
Timer1Timer(TObject *Sender) { Image1 ->Canvas ->CopyRect (Image1 ->ClientRect, pic[number] ->Bitmap ->Canvas, Rect(0, 0, pic[number] ->Width, pic[number] ->Height)); number + +; number %=4; } void __fastcall TDemoForm::CheckBox2Click
----使用Timer部件,定时绘制画面也并不复杂,但因为要存储多幅图片,系统开销却是相当大的,但其动画效果却也相当好。
(TObject *Sender) { Timer1 ->Enabled = CheckBox2 ->Checked; } 三、利用程序空闲时间更换/重绘画面 ----OnIdle事件是TApplication类的事件之一。当应用程序空闲时,程序就会产生OnIdle事件,利用程序空闲执行动画不是很妙吗? 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); void __fastcall TDemoForm::CheckBox3Click
----为保证程序执行的安全性,还需在程序结束时做一些必要的处理(如释放程序运行过程中分配的空间)。为主窗体的OnDestroy事件增加代码如下:
(TObject *Sender) { if(CheckBox3 ->Checked) { Application ->OnIdle = MyIdleHandler; } else { Application ->OnIdle = NULL; } } void __fastcall TDemoForm::FormDestroy
(TObject *Sender) { for(int i=0; i<4; i + +) { delete pic[i]; } Application ->OnIdle = NULL; } |