在C++Builder中实现快速动画

http://www.sudu.cn/info/html/edu/C/20061207/236740.html

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

在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事件中,就可 能会有一个小问题。如果用户暂停了动画,窗体又正

好产生了重画事件(比如窗体被最小化后又被恢复),那窗体上的画面就会消失。这是因为窗体被重画 时,只画了窗体的通用部分,视窗系统并不知道原

来的窗体上有自定义的画面。要想让视窗系统把画面恢复原样,必须把画动画的语句放在窗体的 OnPaint事件中,Timer控件的OnTimer事件中只写决定

图案位置的语句(如本例中的xx+=2;)和一句RePaint。修改后具 体的程式我就省略了,请大家自己完成吧,愿大家都做出令自己满意的出色动画。

资讯中心首页 > 技 术资讯 > C/C++ > 列表

http://www.sudu.cn/info/article/articleType.php?tecId=52&page=158

在c++ builder中的CANVAS如何画完线后擦除

http://www.xici.net/#d11926300.htm
原文链接: https://www.cnblogs.com/chulia20002001/archive/2011/03/09/1979257.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/22129

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午11:59
下一篇 2023年2月8日 上午12:04

相关推荐