• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 用Visual C++.NET簡單實現GIF動畫

    發表于:2007-05-25來源:作者:點擊數: 標簽:C++.NETGIF動畫visual簡單
    自從gif動畫格式推出這十幾年來,可是忙壞了C/C++的 程序員 。遠的不說,就說這幾年吧,各種方法可謂五花八門,有的直讀文件,一行一行不厭其煩的分析;有的使用IPicture,大把大把的玩接口;有的封裝成COM,誰也不知道他怎么實現的......現在有了GDI+,大家
     自從gif動畫格式推出這十幾年來,可是忙壞了C/C++程序員。遠的不說,就說這幾年吧,各種方法可謂五花八門,有的直讀文件,一行一行不厭其煩的分析;有的使用IPicture,大把大把的玩接口;有的封裝成COM,誰也不知道他怎么實現的......現在有了GDI+,大家更忙活了,所以我寫了這篇文章。

      其實只要使用.net框架封裝好的幾個函數,就能輕松搞定了,這里要用到的工具是VS.net2003。

      第一步:新建一個.Net窗體工程


      第二步:添加成員變量和消息(就是行為和外觀啦),只要雙擊空白處系統就會自動填寫默認函數,添加圖中的三個函數就夠了。

     


      第三步:添加成員變量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)
    {
    //呵呵,這個可以不要了,在屬性頁中刪除所有文字即可自動刪除代碼
    }

     

      是不是也很簡單???這樣就把圖像的閃爍問題也解決了。部分圖片的效果如下,圖像文件打包在代碼文件夾里了,代碼包里的程序可以讀取多種圖片并且可以點擊任意位置拖動

     

     


      總結一下:

    1. 由于使用.net封裝類,所以只要Animate()啟動動畫,然后UpdateFrames()翻頁即可,十分簡便;
    2. 先汗一下,由于上面那兩個函數的具體功能和使用方法(特別是UpdateFrames()的參數)找不到詳細描述的文檔,所以是筆者猜的....請知道的達人幫忙在下面留個言;
    3. 這個文檔應該算是第一篇描述VC寫.NET框架程序的中文原創文檔了,很多東西沒有資料,都是筆者自己琢磨出來的,比如按窗口句柄創建Graphics那句,開始想this->GetSafeHwnd();后來xxx.m_hWnd;再后來...再再后來.....最后終于發現了this->Handle,再汗...另外編譯器提示不要在InitializeComponent()里輸入自己的代碼,你就不要輸嘛,否則...555~~代價很慘重吶~~狂汗^_^!
    4. 我在代碼文件里順便做了點擴充,可以讀入大部分常用的圖像文件,但不是很完善,就當作給大家留個作業呵?,F在的看圖工具如ACDSee等的載入速度是越來越慢了,而我們的這個小程序運行起來速度比它那個快多了;既然我們自己的程序就能顯示大多常見圖片了,那么雙擊圖像文件,用我們的程序飛快地打開瀏覽,豈不爽哉,快哉?

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>