Winform控件优化之双层Form利用Opacity实现Layer遮罩层

简介: 对于完全由自己控制实现的桌面应用来说,则可以想办法实现遮罩整个窗体(窗口)的Layer层。下面介绍在Winform中利用Form做遮罩层的实现,推荐的还是第二种方式:双Form的遮罩层....
之前介绍了通过继承Control控件类实现遮罩层的方法,但相对来说有些不如意的地方,最大的缺点是无法遮盖整个窗体【不过也不算缺点,对于浏览器中常见的web遮罩层,也是遮罩的当前整个页面,而无法覆盖到整个浏览器上】

对于完全由自己控制实现的桌面应用来说,则可以想办法实现遮罩整个窗体(窗口)的Layer层。下面介绍在Winform中利用Form做遮罩层的实现,推荐的还是第二种方式:双Form的遮罩层。

遮罩层实现二【继承Form利用Opacity实现】

Winform应用程序实现通用遮罩层介绍了通过Form的Opacity属性,实现类似遮罩效果的窗体。

但是,由于Opacity透明的是整个窗体,包括窗体里面的控件,所以总体不推荐这种方式。而且原文感觉实现得有些复杂...

有几点可以后续深入了解下:

  1. 设置遮罩层的大小。通过Form窗体实现的遮罩可以覆盖后面的整个主窗体。对于耗时等待来说更合理(即将关闭、最大、最小化等操作禁止)。
  2. 动态对象ExpandoObject的实现,虽然文中没有任何使用。但是其无法通过委托传递参数到另一个方法内获取数据。也就是ExpandoObject只能在一个上下文中使用。后续可深入了解。
  3. ImageAnimator动画处理包括时间的帧的图像,位于System.Drawing命名空间下,用于处理和获取逐帧动画内的图像,ImageAnimator.Animate(image, evtHandler);将多帧图像显示为动画,即逐帧显示,并提供每帧的事件处理器,然后使用CreateGraphics().DrawImage绘制每帧图像,实现动画效果。

遮罩层实现三【双Form利用Opacity实现】

利用Form的Opacity实现遮罩层的一个很大的问题就是透明,它是针对整个窗体(包括其中的子控件)的透明,而我们需要的是背景透明。

因此,可以在透明窗体的基础上再添加一个Form窗体,用来放置要显示的其他内容。

LayerForm构造函数的第一个参数LayeredForm为要遮住的窗体;onLayerForm为位于遮罩之上的弹窗窗体。

代码很简单,如下:

public class LayerForm:Form
{
  private Form _onLayerForm;

  public LayerForm(Form LayeredForm,Form onLayerForm)
  {
      ControlBox = false;
      FormBorderStyle = FormBorderStyle.FixedSingle;
      StartPosition = FormStartPosition.Manual;

      BackColor = Color.Black;
      Opacity = 0.5;

      ShowInTaskbar = false;

      Location = LayeredForm.Location;
      Size = LayeredForm.Size;

      _onLayerForm = onLayerForm;

      //Load += LayerForm_Load; // Load中处理不显示onLayerForm —— _onLayerForm.ShowDialog()
      Shown += LayerForm_Shown;
  }

  private void LayerForm_Shown(object sender, EventArgs e)
  {
      _onLayerForm.ShowInTaskbar = false;
      _onLayerForm.StartPosition = FormStartPosition.CenterParent;
      _onLayerForm.FormClosed += OnLayerForm_FormClosed;
      _onLayerForm.ShowDialog();
  }

  private void OnLayerForm_FormClosed(object sender, FormClosedEventArgs e)
  {
      this.Close();
  }
}
AI 代码解读

使用就非常简单了。

将显示在遮罩层上的窗体传递进去即可:

var onLayerForm = new OnLayerForm();
var layerForm = new LayerForm(this, onLayerForm);
layerForm.Show(); // 推荐Show();
AI 代码解读

遮罩上的窗体可根据需要设置或加入加载动画、处理逻辑、必要的控件等。

遮罩上的窗体显示使用 _onLayerForm.ShowDialog() 以对话框模式显示,可以做到居中位置的实现。

可以适当修改FormBorderStyle,使遮罩层完全贴合窗体的大小。

遮罩窗体layerForm推荐使用Show()显示,后续可在外部调用Close()关闭遮罩层窗体。如果使用layerForm.ShowDialog()通常会导致当前(UI线程)的处理阻塞,因此需要提前在子线程中启动耗时的操作,以及在操作完成后正确处理(关闭)显示的遮罩层。

var onLayerForm = new OnLayerForm();
var layerForm = new LayerForm(this, onLayerForm);
layerForm.Show();

var timer = new System.Windows.Forms.Timer();
// timer.Interval = 100;
timer.Tick += (t, ea)=> {
    // 处理耗时操作...

    timer.Stop();

    // 处理完耗时操作,关闭Layer窗体
    layerForm.Close();
};
timer.Start();
AI 代码解读

参考

目录
打赏
0
0
0
0
10
分享
相关文章
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
在一般能搜到的所有实现圆角窗体的示例中,都有着惨不忍睹的锯齿...而借助于Layered Windows,是可以实现丝滑无锯齿效果的Form窗体的,其具体原理就是分层窗体....
2051 0
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
Winform控件优化之无边框窗体及其拖动、调整大小和实现最大最小化关闭功能的自定义标题栏效果
Winform中实现无边框窗体只需要设置FormBorderStyle = FormBorderStyle.None,但是无边框下我们需要保留移动窗体、拖拽调整大小、自定义美观好看的标题栏等...
4473 0
Winform控件优化之无边框窗体及其拖动、调整大小和实现最大最小化关闭功能的自定义标题栏效果
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
两行代码就能实现Form窗体的(背景)透明效果,它不是Opacity属性的整个窗体透明,`TransparencyKey`实现窗体的透明、窗体中间部分镂空效果...
3836 0
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
Winform控件优化之自定义控件的本质【从圆角控件看自定义的本质,Region区域无法反锯齿的问题】
自定义控件的本质只有两点:重绘控件Region区域(圆角、多边形、图片等),这是整个控件的真实范围;重绘图形,在原有Region范围内,重绘不同的图形(圆角、多边形、图片等)作为背景......
698 0
Winform控件优化之自定义控件的本质【从圆角控件看自定义的本质,Region区域无法反锯齿的问题】
Winform控件优化之TabControl控件的使用和常用功能
TabControl是一个分页切换(tab)控件,不同的页框内可以呈现不同的内容,将主要介绍调整tab的左右侧显示、设置多行tab、禁用或删除tabpage、隐藏TabControl头部的选项卡等
6458 0
Winform控件优化之TabControl控件的使用和常用功能
Winform中Textbox、NumericUpDown等修改高度,禁止输入数字或内容的实现
Winform中的Textbox、NumericUpDown控件通常在单行的情况下,无法直接通过`Height`属性修改高度,但很多时候我们需要调整其高度,使其显示的更加合理,主要介绍三种方法...
3106 0
C#使用外部字体、嵌入字体到程序资源中(Winform)及字体的版权问题
应用程序能够使用一个好的字体,是用户界面很重要的一部分,但是很多字体如果系统没有安装,则需要额外引入,这就涉及到极其重要的字体版权问题,及额外字体的使用和安装。最好的方式应该是将字体嵌入到程序中...
4994 1
C#使用外部字体、嵌入字体到程序资源中(Winform)及字体的版权问题
使用dumpbin工具查看动态库中函数列表
使用dumpbin工具查看动态库中函数列表
1782 0
Winform控件优化之圆角按钮【各种实现中的推荐做法】(下)
最终优化实现ButtonPro按钮(继承自Button),既提供Button原生功能,又提供扩展功能,除了圆角以外,还实现了圆形、圆角矩形的脚尖效果、边框大小和颜色、背景渐变颜色...
2939 0
Winform控件优化之圆角按钮【各种实现中的推荐做法】(下)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等