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

2021-07-27 23:11:48 字數 3019 閱讀 6117

之前先後發表過:《winform應用程式實現通用遮罩層》、《winform應用程式實現通用訊息視窗》,這兩款遮罩層其實都是基於彈出視窗的,今天為大家分享乙個比較簡單但介面相對友好的另一種實現方案,廢話不多說,直接進入主題。

一、實現思路(解決問題順序):

透明遮罩:

1.實現可設定透明的panel控制項(maskpanel);

2.panel控制項(maskpanel)能夠覆蓋父容器(一般是當前窗體form物件)客戶區區域(即:與父容器客戶區區域大小相同),並處於最上層,保證父容器上的任何控制項都被蓋住並保證不可用;

3.panel控制項(maskpanel)必需實現隨著父容器大小的改變而改變;

4.panel控制項(maskpanel)上可呈現以表示正在載入的**或者文字,並且居中;

非同步:實現的方法有很多,比如非同步委託、task等,而這是在winform專案中,此次就直接使用backgroundworker

二、關鍵解決方案:

1.可設定透明控制項:通過自定義控制項,並重寫createparams(其中: cp.exstyle |= 0x00000020;)、onpaint(其中:labelborderpen、labelbackcolorbrush的color=color.fromargb(_alpha, this.backcolor))兩個方法即可;

2.能夠覆蓋父容器客戶區區域:this.size = this.parent.clientsize;this.left = 0;this.top = 0;

3.隨著父容器大小的改變而改變:this.anchor = anchorstyles.left | anchorstyles.top | anchorstyles.right | anchorstyles.bottom;

4.呈現以表示正在載入的**或者文字,並且居中:

新增picturebox,設定image為loading.gif**,sizemode = system.windows.forms.pictureboxsizemode.autosize; point location = new point(this.location.x + (this.width - picturebox_loading.width) / 2, this.location.y + (this.height - picturebox_loading.height) / 2);//居中

好了,最後貼出實現的源**:

maskpanel:

public partial class maskpanel : control

set

}private int _alpha = 125;//設定透明度

[category("透明"), description("設定透明度")]

public int alpha

set

}public maskpanel(control parent)

: this(parent, 125)

/// /// 初始化載入控制項

///

/// public maskpanel(control parent, int alpha)

protected override createparams createparams

}protected override void onpaint(painteventargs pe)

else

base.onpaint(pe);

pe.graphics.drawrectangle(labelborderpen, 0, 0, this.width, this.height);

pe.graphics.fillrectangle(labelbackcolorbrush, 0, 0, this.width, this.height);

}protected override void dispose(bool disposing)

}base.dispose(disposing);

}}

為了實現通用,同時保證所有的窗體都有非同步執行並顯示遮罩效果,故此處採用定義乙個窗體基類:formbase,裡面定義乙個受保護的doworkasync方法, **如下:

public partial class formbase : form

/// /// 多執行緒非同步後台處理某些耗時的資料,不會卡死介面

///

/// func委託,包裝耗時處理(不含ui介面處理),示例:(o)=>

/// func委託引數,用於跨執行緒傳遞給耗時處理邏輯所需要的物件,示例:string物件、jobject物件或datatable等任何乙個值

/// action委託,包裝耗時處理完成後,下步操作(一般是更新介面的資料或ui控制項),示列:(r)=>

protected void doworkasync(funcworkfunc, object funcarg = null, actionworkcompleted = null);}

else

loadingpan.bringtofront();

loadingpan.visible = true;

#endregion

};bgworkder.runworkercompleted += (s, arg) =>

#endregion

bgworkder.dispose();

if (workcompleted != null)

};bgworkder.dowork += (s, arg) =>

;bgworkder.runworkerasync(funcarg);

}}

使用示例如下:

private void button1_click(object sender, eventargs e)

return result;

}, startno, (r) => //顯示結果(此處用於對上面結果的處理,比如顯示到介面上)

);}

效果圖就不貼出來了,大家可以copy上面的所有**,即可測試出效果。

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

首先要明確我們要實現的效果 透明 動態圖示 文字 透明 這個簡單,只需要將窗體的opacity設為100 以下的值就可以了,這裡我採用85 動態圖示 這個相對複雜一些,因為winform目前沒有現成的支援直接顯示 的控制項,但幸好有乙個元件imageanimator支援逐幀動畫,我們只需要將繫結到i...

Winform應用程式實現載入等待(C )

net winform應用程式中,要實現載入等待的動畫效果需要借助於imageanimator類,該類可實現多幀影象的動畫處理顯示。該類的主要的方法如下 public static void updateframes image image 該方法讓多幀影象更新到下一幀 public static ...

在winform嵌入外部應用程式

應朋友要求,需要將乙個第三方應用程式嵌入到本程式winform視窗,以前在vb6時代做過類似的功能,其原理就是利用windows api中findwindow函式找到第三方應用程式控制代碼,再利用setparent函式,將該控制代碼設定為本視窗的子視窗。網上搜尋大部分都是利用system.diagn...