Winform 遮罩懶人處理法

BoiledYakult發表於2023-05-13

前言

之前有個專案需要執行一個略微耗時的操作大概五六七八九十秒這樣子,這個時候程式不能做其他操作,只能等待操作完成。為了提升一絲使用體驗同時讓Winform程式看上去高階一點???,就想到加一個遮罩層(MaskLayer)。雖然Winform沒有原生的遮罩層,但是實現起來也不是很麻煩。

遮罩層在Winform的實現方式一般分為兩種:

  • 自定義控制元件,繼承Contorl重寫來實現遮罩層
  • 新建一個假窗體來達到同樣的效果

懶人懶人,當然要用最少程式碼幹最多的活嘍???,我們來透過新窗體來實現。

功能介紹以及程式碼實現

原理很簡單,就是新建一個有一定透明度的空白窗體,邊框樣式設定為無邊框,啟動位置設定為手動設定(這樣我們就可以順便指定他出現的位置了),最後再給它整個遮罩背景色就萬事大吉了???

新建一個窗體MaskForm

public partial class MaskForm : Form
{
  public MaskForm(Point point, Size size)
  {
    InitializeComponent();
    Opacity = 0.8;
    BackColor = Color.LightSlateGray;
    FormBorderStyle = FormBorderStyle.None;
    StartPosition = FormStartPosition.Manual;
    //位置和大小跟隨主介面
    Location = point;
    Size = size;
  }
  private void MaskForm_FormClosed(object sender, FormClosedEventArgs e)
  {
    Dispose();
  }
}

這樣就能實現遮罩層效果了,呼叫也很簡單,在想新增遮罩效果的Form裡面建立一個MaskForm物件,直接Show就可以了。舉個簡單的例子,比如我想在Form1里加個遮罩效果,我加個button點選之後就顯示遮罩,然後五秒之後關閉遮罩:

private void button1_Click(object sender, EventArgs e)
{
  MaskForm mask = new MaskForm(this.Location, this.Size);
  mask.Show();
  DateTime now = DateTime.Now;
  while (now.AddSeconds(5) > DateTime.Now) { }
  mask.Close();
}

MaskForm

遮罩實際比窗體大點可不是我的鍋啊?,我在我的自定義窗體上沒這問題,嚴絲合縫的!!!

進階玩法

上面是最簡單的遮罩效果使用,我們還可以來個進階版 - 隨意控制MaskForm的顯示位置、大小。顯然我們可以透過例項化MaskForm窗體的時候控制它,比我們想要個全屏的:

MaskForm mask = new MaskForm(new Point(0,0), new Size(1920,1080));

image-20230513094851517

???

完結撒花,就這樣吧,有幫助到你的話記得點個贊哈,比心???

有疑問的話可以評論留言哈。

相關文章