• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

C++Builder中实现动画

发布: 2007-7-04 20:47 | 作者: admin | 来源:  网友评论 | 查看: 14次 | 进入软件测试论坛讨论

领测软件测试网 中国气象局监测网络司信息网络处 夏登城

  一、直接使用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;
}   

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网