第二步:添加成員變量和消息(就是行為和外觀啦),只要雙擊空白處系統就會自動填寫默認函數,添加圖中的三個函數就夠了。
第三步:添加成員變量image及在Form1_Load中初始化
private: Image *image; private: System::Void Form1_Load(System::Object * sender, System::EventArgs * e) { //按路徑讀入文件 image=Image::FromFile(L"測試圖片.GIF"); } private: System::Void Form1_Closed(System::Object * sender, System::EventArgs * e) { if(image) image->Dispose(); }
第四步:好了,動畫文件已經讀入,現在的任務是把它顯示出來
private: System::Void Form1_Paint(System::Object * sender, System::Windows::Forms::PaintEventArgs * e) { //在Form1_Paint中啟用動畫,這個函數的功能是讀取圖片中每個對象的時間信息,然后每到一次時間就調用一次OnPaintGIF ImageAnimator::Animate(image, new EventHandler(this,OnPaintGIF)); //顯示圖片 e->Graphics->DrawImage(0,0,image->Width,image->Height); //將圖片按照時間間隔向后翻一頁 ImageAnimator::UpdateFrames(image); } private: System::Void OnPaintGIF(Object* sender, EventArgs* e) { //時間到啦,該顯示下一張圖啦,置顯示區域無效 this->Invalidate(); }
到此,已經可以正確顯示GIF格式的動畫了,簡單吧,才幾行就解決了。
........不過嘛,呵呵,大家仔細觀察會發現,圖片一閃一閃的,很不好看.....那怎么辦呢?用雙緩沖方法?非也,根本就不是一碼事!圖片閃鑠的問題幾乎每天都能在論壇上看到,我在這里順便說一下原因。數據量大時的閃動是因為計算機來不及載入數據,這時可以用雙緩沖法;但是數據量不大時圖片閃動是因為當程序置屏幕無效時框架會用背景色來擦除,這樣就會閃一下,這時用雙緩沖法就無效了。后者在MFC中我們可以響應OnEraseBkgnd()來解決;可是在.net中找不到這個消息,怎么辦呢?其實只要避開屏幕無效就好了,請往下看:
private: Image *image; Graphics *p;//添加一個用來顯示的變量 private: System::Void Form1_Load(System::Object * sender, System::EventArgs * e) { image=Image::FromFile(L"測試圖片.GIF");//按路徑讀入文件 p=Graphics::FromHwnd(this->Handle);//按窗口句柄創建Graphics ImageAnimator::Animate(image, new EventHandler(this,OnPaintGIF));//啟動動畫 } private: System::Void Form1_Closed(System::Object * sender, System::EventArgs * e) { if(p) p->Dispose(); if(image) image->Dispose(); } private: System::Void OnPaintGIF(Object* o, EventArgs* e) { p->DrawImage(image,0,0,image->Width,image->Height);//顯示圖片 ImageAnimator::UpdateFrames();//將圖片向后翻一頁,由于OnPaintGIF()本身就是按時間啟動的,所以UpdateFrames()要不要參數無所謂了 } private: System::Void Form1_Paint(System::Object * sender, System::Windows::Forms::PaintEventArgs * e) { //呵呵,這個可以不要了,在屬性頁中刪除所有文字即可自動刪除代碼 }
是不是也很簡單???這樣就把圖像的閃爍問題也解決了。部分圖片的效果如下,圖像文件打包在代碼文件夾里了,代碼包里的程序可以讀取多種圖片并且可以點擊任意位置拖動
總結一下: