在C Builder中实现快速动画
2008-02-23 05:25:56来源:互联网 阅读 ()
在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。修改后具体的程式我就省略了,请大家自己完成吧,愿大家都做出令自己满意的出色动画。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: C语言图像处理方法
下一篇: 在C Builder中显示透明位图
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash