⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 20000805009.htm

📁 C++Builder教学大全
💻 HTM
字号:
<HTML>

<HEAD>



<TITLE>在C++Builder中实现快速动画</TITLE>



<META content="MSHTML 5.00.2314.1000" name=GENERATOR>

</HEAD>

<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0 

vLink=#990099>



<div align="center">

  <table width="744" border="0" cellspacing="0" cellpadding="0" height="76">

    <tr> 

      <td> 

        <p class="coffee" align="center"><font size="3"><span class='title'><b><br>

          在C++Builder中实现快速动画</b></span></font></p>

        <p align="right"><b>作者</b>:四川 施维民<br>

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

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

            //在TForm1 *Form1;的后面添上这三句<br>

            Graphics::TBitmap *p;<br>

            Graphics::TBitmap *q;<br>

            int xx=0;<br>

            //---------------------<br>

            void __fastcall TForm1::FormCreate(TObject *Sender)<br>

            {p=new Graphics::TBitmap;//这存放的就是要贴到窗体上的小图案<br>

            p->Handle=LoadBitmap(HInstance,″aaa″);//从资源文件中载入小图案<br>

            q=new Graphics::TBitmap;//定义缓冲区q<br>

            q->Width=Width;//使缓冲区的大小与窗体相同<br>

            q->Height=Height;<br>

            PatBlt(q->Canvas->Handle,0,0,q->Width,q->Height,0);//把缓冲区的背景变为黑色<br>

            }<br>

            //--------------------<br>

            void __fastcall TForm1::FormDestroy(TObject *Sender)<br>

            {//程序结束时释放内存<br>

            delete p;<br>

            delete q;<br>

            }<br>

            //--------------------<br>

            void __fastcall TForm1::Timer1Timer(TObject *Sender)<br>

            {//窗体上要加上一个Timer控件<br>

            xx+=2;<br>

            PatBlt(q->Canvas->Handle,0,0,Width,Height,0);//把缓冲区的背景变为黑色,同时擦去了旧的画面<br>

            BitBlt(q->Canvas->Handle,xx,0,p->Width,p->Height,p->Canvas->Handle,0,0,SRCCOPY);//正在缓冲区上制作一帧的画面,这几句是不可见的<br>

            BitBlt(q->Canvas->Handle,xx,50,p->Width,p->Height,p->Canvas->Handle,0,0,SRCCOPY);<br>

            BitBlt(q->Canvas->Handle,xx,100,p->Width,p->Height,p->Canvas->Handle,0,0,SRCCOPY);<br>

            BitBlt(q->Canvas->Handle,xx,150,p->Width,p->Height,p->Canvas->Handle,0,0,SRCCOPY);<br>

            BitBlt(q->Canvas->Handle,xx,200,p->Width,p->Height,p->Canvas->Handle,0,0,SRCCOPY);<br>

            BitBlt(q->Canvas->Handle,xx,250,p->Width,p->Height,p->Canvas->Handle,0,0,SRCCOPY);<br>

            BitBlt(q->Canvas->Handle,xx,300,p->Width,p->Height,p->Canvas->Handle,0,0,SRCCOPY);<br>

            BitBlt(Canvas->Handle,0,0,Width,Height,q->Canvas->Handle,0,0,SRCCOPY);//把缓冲区的画面贴到窗体上<br>

            }<br>

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

        </p>

    </td>

    </tr>

  </table>

 

</div>

</BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -