在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。修改后具体的程序我就省略了，请大家自己完成吧，愿大家都做出令自己满意的精彩动画。