如何在Winform程序中实现遮罩层对话框(蒙版窗口)

效果

遮罩层对话框:
在这里插入图片描述
异步加载效果:
在这里插入图片描述

原理

在主窗口上先弹出一个和主窗口大小相同、位置重叠的半透明模式窗口(蒙版层),紧接着在这个半透明窗口上方中间位置,弹出一个没有边框、不可移动和控制大小的模式窗口。将最上方窗口的DialogResult属性,通过中间的半透明窗口,传递到主窗口。

设计

主窗口

在这里插入图片描述

		private void btn_showdialog_Click(object sender, EventArgs e)
        {
            label1.Text ="the dialog return "+ (MaskDialog.ShowDialog(this, new FormDialog()) == DialogResult.OK ? "ok" : "cancel");            
        }
        private void btn_load_Click(object sender, EventArgs e)
		{
    		FormLoading frm = new FormLoading(() => 
    		{
        		System.Threading.Thread.Sleep(3000);
        		return "ok!";
    		});
    		MaskDialog.ShowDialog(this, frm);
    		label1.Text = frm.Result.ToString() ;
		}

对话框

在这里插入图片描述

		private void btn_ok_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.OK;
        }

        private void btn_cancel_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
        }

遮罩层

在代码中生成实现。

主要实现类

	public class MaskDialog
    {
        public static DialogResult ShowDialog(Form layOnForm, Form dialogForm)
        {
            dialogForm.ShowInTaskbar = false;
            dialogForm.ControlBox = false;
            dialogForm.FormBorderStyle = FormBorderStyle.None;
            dialogForm.StartPosition = FormStartPosition.CenterParent;
            using (Form frm = createMask(layOnForm))
            {
                frm.Shown += (sender, e) =>
                {
                    using (dialogForm)
                    {
                        frm.DialogResult = dialogForm.ShowDialog(frm);
                    }
                };
                return frm.ShowDialog(layOnForm);
            }
        }
        private static Form createMask(Form layOnForm)
        {
            Form frmMask = new Form();
            frmMask.Height = layOnForm.Height;
            frmMask.Width = layOnForm.Width;
            frmMask.Opacity = 0.7;
            frmMask.ShowInTaskbar = false;
            frmMask.ControlBox = false;
            frmMask.FormBorderStyle = FormBorderStyle.None;
            frmMask.StartPosition = FormStartPosition.CenterParent;
            return frmMask;
        }
    }

源码

下载

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hyq106

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值