用戶: 密碼:     忘記密碼 | 會員註冊
  

在C++Builder中實現快速動畫的方法

8.6
出處:2345軟件大全 時間:2011-06-27 人氣:903

核心提示:快速動畫是指每隔一段很小的時間間隔就快速擦去原有畫面,並重新畫上新的畫面的動畫技術。快速動畫成功的關鍵就在於擦去和重畫的速度必須很快,否則畫面就會有閃爍現象

  快速動畫是指每隔一段很小的時間間隔就快速擦去原有畫面,並重新畫上新的畫面的動畫技術。快速動畫成功的關鍵就在於擦去和重畫的速度必須很快,否則畫面就會有閃爍現象。

  在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。修改後具體的程序我就省略了,請大家自己完成吧,願大家都做出令自己滿意的精彩動畫。