Winform 遮罩懒人处理法

前言

之前有个项目需要执行一个略微耗时的操作大概五六七八九十秒这样子,这个时候程序不能做其他操作,只能等待操作完成。为了提升一丝使用体验同时让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

🎉🎉🎉

完结撒花,就这样吧,有帮助到你的话记得点个赞哈,比心💗💗💗

有疑问的话可以评论留言哈。

posted @ 2023-05-13 09:56  PixelKiwi  阅读(799)  评论(9编辑  收藏  举报