Winform應用程式實現通用遮罩層

2021-09-26 21:00:26 字數 2982 閱讀 7170

首先要明確我們要實現的效果:透明+動態圖示+文字

透明:這個簡單,只需要將窗體的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

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;

}}

**中setworkaction方法是用來設定非同步需要處理的委託方法,在窗體顯示出來後(frmprocessing_shown),建立新執行緒,用以處理耗時的邏輯**段,其中有乙個workcompleted屬性,這個主要是表明處理耗時的邏輯**已完成(不論是否報錯),在窗體重繪時(onpaint),會持續判斷該值是否為true,若為true則關閉當前視窗。

另之所以沒重寫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...