您的位置: 首页 > 软件教程 > C++ Builder教程专题 > 在C++Builder中实现快速动画的方法

在C++Builder中实现快速动画的方法

8.6分
出处:网络 时间:2011-06-27

您可能感兴趣的话题: C++ Builder  

核心提示:快速动画是指每隔一段很小的时间间隔就快速擦去原有画面,并重新画上新的画面的动画技术。快速动画成功的关键就在于擦去和重画的速度必须很快,否则画面就会有闪烁现象

  快速动画是指每隔一段很小的时间间隔就快速擦去原有画面,并重新画上新的画面的动画技术。快速动画成功的关键就在于擦去和重画的速度必须很快,否则画面就会有闪烁现象。

  在vb中制作快速动画比较简单,只要把窗体的autoredraw属性设置为true,再直接调用api函数bitblt,画完一帧refresh一次。但c++builder的窗体没有autoredraw属性,只要一使用bitblt,窗体就会自动刷新,由于一帧画面往往要几次用到bitblt,画面就闪烁起来了。解决的办法就是自己定义一个不可见的缓冲区,其大小应与目标窗体相同,先在缓冲区上把一帧的画面画完,再用一次bitblt函数把缓冲区的图案贴到窗体上。请看例子:

  //在tform1 *form1;的后面添上这三句
  graphics::tbitmap *p;
  graphics::tbitmap *q;
  int xx=0;
  //---------------------
  void __fastcall tform1::formcreate(tobject *sender)
  {
  p=new graphics::tbitmap;//这存放的就是要贴到窗体上的小图案
  p->handle=loadbitmap(hinstance,″aaa″);//从资源文件中载入小图案
  q=new graphics::tbitmap;//定义缓冲区q
  q->width=width;//使缓冲区的大小与窗体相同
  q->height=height;
  patblt(q->canvas->handle,0,0,q->width,q->height,0);//把缓冲区的背景变为黑色
  }
  //--------------------
  void __fastcall tform1::formdestroy(tobject *sender)
  {
  //程序结束时释放内存
  delete p;
  delete q;
  }
  //--------------------
  void __fastcall tform1::timer1timer(tobject *sender)
  {
  //窗体上要加上一个timer控件
  xx+=2;
  patblt(q->canvas->handle,0,0,width,height,0);//把缓冲区的背景变为黑色,同时擦去了旧的画面
  bitblt(q->canvas->handle,xx,0,p->width,p->height,p->canvas->handle,0,0,srccopy);
  //正在缓冲区上制作一帧的画面,这几句是不可见的
  bitblt(q->canvas->handle,xx,50,p->width,p->height,p->canvas->handle,0,0,srccopy);
  bitblt(q->canvas->handle,xx,100,p->width,p->height,p->canvas->handle,0,0,srccopy);
  bitblt(q->canvas->handle,xx,150,p->width,p->height,p->canvas->handle,0,0,srccopy);
  bitblt(q->canvas->handle,xx,200,p->width,p->height,p->canvas->handle,0,0,srccopy);
  bitblt(q->canvas->handle,xx,250,p->width,p->height,p->canvas->handle,0,0,srccopy);
  bitblt(q->canvas->handle,xx,300,p->width,p->height,p->canvas->handle,0,0,srccopy);
  bitblt(canvas->handle,0,0,width,height,q->canvas->handle,0,0,srccopy);
  //把缓冲区的画面贴到窗体上
  }

  如果实际应用时,像上面的程序那样,把画动画的语句放在timer控件的ontimer事件中,就可能会有一个小问题。如果用户暂停了动画,窗体又正好产生了重画事件(比如窗体被最小化后又被恢复),那窗体上的画面就会消失。这是因为窗体被重画时,只画了窗体的通用部分,windows并不知道原来的窗体上有自定义的画面。要想让windows把画面恢复原样,必须把画动画的语句放在窗体的onpaint事件中,timer控件的ontimer事件中只写决定图案位置的语句(如本例中的xx+=2;)和一句repaint。修改后具体的程序我就省略了,请大家自己完成吧,愿大家都做出令自己满意的精彩动画。

网友评论
精品软件课程
更多 >
C++是一种静态数据类型检查的,支持多重编程... [详细]
Java,是由Sun Microsystem... [详细]
C语言是一种面向过程的计算机程序设计语言。多... [详细]
Visual Basic是一种由微软公司开发... [详细]
Oracle Database,又名Orac... [详细]
Visual Basic.NET是从 Vis... [详细]