標籤:
WinForm上的ProgressBar,老實說,實在是不敢恭維,太死板,太難看了,即使做成即時顯示處理進度的,它還是逃離不了“難看”。現 在的web2.0上到處都能看到一個顯示正在處理的小圓圈在那轉啊轉,以表示正在處理,雖然它不是即時的,只是個gif動畫,但它的效果總感覺要比 winform上的progressBar要賞心悅目的多。那我在winform 上是否也可以用這種gif動畫來顯示處理進度呢?答案是顯然的,肯定可以,聽說pictureBox就可以顯示gif動畫,只要把該控制項的image屬性 設定成我們所指的gif動畫就可以了,編譯,運行,噢,gif動畫罷工了,它根本就沒有動起來,只是停留在某一幀。看來這種走捷徑的方式在IT民工業是行 不通的。
那我們還是用ImageAnimator.Animate()方法吧,發現語言群組織不起來,還是用直接看代碼來的快,越來越覺得自己可悲了。。。。話都說不清楚。。。
//首先定義私人變數 private Image m_img=null;private EventHandler evtHandler=null;//重載的當前winform的OnPaint方法,當介面被重繪時去顯示當前gif顯示某一幀protected override void OnPaint(PaintEventArgs e){ base.OnPaint(e); if (m_Image != null) { //獲得當前gif動畫下一步要渲染的幀。 UpdateImage(); //將獲得的當前gif動畫需要渲染的幀顯示在介面上的某個位置。 e.Graphics.DrawImage(m_Image, new Rectangle(145, 140, m_Image.Width, m_Image.Height)); }}//實現Load方法private Load(object sender,EventArgs e){ //為委託關聯一個處理方法 evtHandler=new EventHandler(OnImageAnimate); //擷取要載入的gif動畫檔案 m_img=Image.FromFile(Application.StartupPath+"\\loading.gif"); //調用開始動畫方法 BeginAnimate();}//開始動畫方法private void BeginAnimate(){ if(m_img!=null) { //當gif動畫每隔一定時間後,都會變換一幀,那麼就會觸發一事件,該方法就是將當前image每變換一幀時,都會調用當前這個委託所關聯的方法。 ImageAnimator.Animate(m_img,evtHandler); }}//委託所關聯的方法private void OnImageAnimate(Object sender, EventArgs e){ //該方法中,只是使得當前這個winfor重繪,然後去調用該winform的OnPaint()方法進行重繪) this.Invalidate();}//獲得當前gif動畫的下一步需要渲染的幀,當下一步任何對當前gif動畫的操作都是對該幀進行操作)private void UpdateImage(){ ImageAnimator.UpdateFrames(m_Image);}//關閉顯示動畫,該方法可以在winform關閉時,或者某個按鈕的觸發事件中進行調用,以停止渲染當前gif動畫。private void StopAnimate(){ m_Image = null; ImageAnimator.StopAnimate(m_Image,evtHandler);}
終於可以看到gif動畫了,如果動畫左側或者上沿再標上一段文字"loading....",這不是和web2,0的效果一樣的了麼,但是實現起來卻複雜的許多。。。
WinForm上顯示gif動畫:轉