之前先後發表過:《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...