首先要明確我們要實現的效果:透明+動態圖示+文字
透明:這個簡單,只需要將窗體的opacity設為100%以下的值就可以了,這裡我採用85%;
動態圖示:這個相對複雜一些,因為winform目前沒有現成的支援直接顯示**的控制項,但幸好有乙個元件imageanimator支援逐幀動畫,我們只需要將繫結到imageanimator的animate方法上(即:imageanimator.animate(m_image,eventhandler委託);),然後重寫窗體的onpaint即可,具體的**實現見下面公布的原始碼。
文字:這個簡單,放在乙個label控制項即可
還有為了能夠讓圖示與文字在相對的位置(即不論大小)保持居中,我這裡採用了乙個tablelayoutpanel,分成兩行,上行放置label,並設為居中,下行放置panel,提供繪製**的區域。
using system;以下是自動生成的**:using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.windows.forms;
using system.reflection;
using system.threading;
using system.threading.tasks;
namespace tems
set}
public bool workcompleted = false;
public exception workexception
public void setworkaction(parameterizedthreadstart workaction, object arg)
public frmprocessing(string msg)
protected override void onpaint(painteventargs e)
if (this.workcompleted)
}private void frmprocessing_load(object sender, eventargs e)
,y=", this.owner.left, this.owner.top));
this.width = this.owner.width;
this.height = this.owner.height;
}else
//為委託關聯乙個處理方法
evthandler = new eventhandler(onimageanimate);
if (m_image == null)
//呼叫開始動畫方法
beginanimate();
}//開始動畫方法
private void beginanimate()
}//委託所關聯的方法
private void onimageanimate(object sender, eventargs e)
//獲得當前gif動畫的下一步需要渲染的幀,當下一步任何對當前gif動畫的操作都是對該幀進行操作)
private void updateimage()
//關閉顯示動畫,該方法可以在winform關閉時,或者某個按鈕的觸發事件中進行呼叫,以停止渲染當前gif動畫。
private void stopanimate()
private void frmprocessing_shown(object sender, eventargs e)
}private void execworkaction()
,this.workactionarg);
worktask.start();
task.waitall(worktask);
}catch (exception ex)
finally}}
}
namespace tems**中setworkaction方法是用來設定非同步需要處理的委託方法,在窗體顯示出來後(frmprocessing_shown),建立新執行緒,用以處理耗時的邏輯**段,其中有乙個workcompleted屬性,這個主要是表明處理耗時的邏輯**已完成(不論是否報錯),在窗體重繪時(onpaint),會持續判斷該值是否為true,若為true則關閉當前視窗。base.dispose(disposing);
}#region windows form designer generated code
/// /// required method for designer support - do not modify
/// the contents of this method with the code editor.
///
private void initializecomponent()
#endregion
private system.windows.forms.tablelayoutpanel tablelayoutpanel1;
private system.windows.forms.label lbmessage;
private system.windows.forms.panel panimage;
}}
另之所以沒重寫panel的onpaint方法,原因是雖然可以顯示**,但由於區域性重繪,造成**出現閃屏,所以仍需要採用窗體重繪
為了便於通用,我還定義了乙個通用方法,專門用來顯示遮罩層窗體,方法定義如下:
public static class common現在使用就很簡單了,如下:}}
common.showprocessing("正在處理中,請稍候...", this, (obj) =>使用效果如下:,null);
Winform應用程式實現通用遮罩層二
之前先後發表過 winform應用程式實現通用遮罩層 winform應用程式實現通用訊息視窗 這兩款遮罩層其實都是基於彈出視窗的,今天為大家分享乙個比較簡單但介面相對友好的另一種實現方案,廢話不多說,直接進入主題。一 實現思路 解決問題順序 透明遮罩 1.實現可設定透明的panel控制項 maskp...
Winform應用程式實現載入等待(C )
net winform應用程式中,要實現載入等待的動畫效果需要借助於imageanimator類,該類可實現多幀影象的動畫處理顯示。該類的主要的方法如下 public static void updateframes image image 該方法讓多幀影象更新到下一幀 public static ...
在winform嵌入外部應用程式
應朋友要求,需要將乙個第三方應用程式嵌入到本程式winform視窗,以前在vb6時代做過類似的功能,其原理就是利用windows api中findwindow函式找到第三方應用程式控制代碼,再利用setparent函式,將該控制代碼設定為本視窗的子視窗。網上搜尋大部分都是利用system.diagn...