【问题标题】:How to draw overlay window winform apps c#如何绘制覆盖窗口winform应用程序c#
【发布时间】:2014-02-03 15:06:14
【问题描述】:

我的要求是假设我有两个 sdi 表格。一个 sdi 主窗体有按钮,当用户单击该按钮时,将出现一个覆盖半透明窗口并覆盖主 sdi 窗体,并且另一个 sdi 将出现在覆盖窗口的顶部。

这是我的覆盖窗口代码

namespace CSRAssistant
{
    public partial class MaskedDialog : Form
    {
        static MaskedDialog mask;
        static Form frmContainer;

        private Form dialog;
        private UserControl ucDialog;

        private MaskedDialog(Form parent, Form dialog)
        {
            this.dialog = dialog;
            this.FormBorderStyle = FormBorderStyle.None;
            this.BackColor = System.Drawing.Color.Black;
            this.Opacity = 0.50;
            this.ShowInTaskbar = false;
            this.StartPosition = FormStartPosition.Manual;
            this.Size = parent.ClientSize;
            this.Location = parent.PointToScreen(System.Drawing.Point.Empty);
            parent.Move += AdjustPosition;
            parent.SizeChanged += AdjustPosition;
        }

        private MaskedDialog(Form parent, UserControl ucDialog)
        {
            this.ucDialog = ucDialog;
            this.FormBorderStyle = FormBorderStyle.None;
            this.BackColor = System.Drawing.Color.Black;
            this.Opacity = 0.50;
            this.ShowInTaskbar = false;
            this.StartPosition = FormStartPosition.Manual;
            this.Size = parent.ClientSize;
            this.Location = parent.PointToScreen(System.Drawing.Point.Empty);
            parent.Move += AdjustPosition;
            parent.SizeChanged += AdjustPosition;
        }

        private void AdjustPosition(object sender, EventArgs e)
        {
            Form parent = sender as Form;
            this.Location = parent.PointToScreen(System.Drawing.Point.Empty);
            this.ClientSize = parent.ClientSize;
        }

        //
        public static DialogResult ShowDialog(Form parent, Form dialog)
        {
            mask = new MaskedDialog(parent, dialog);
            dialog.StartPosition = FormStartPosition.CenterParent;
            mask.MdiParent = parent.MdiParent;
            mask.Show();
            DialogResult result = dialog.ShowDialog(mask);
            mask.Close();
            return result;
        }

        public static DialogResult ShowDialog(Form parent, UserControl dialog)
        {
            mask = new MaskedDialog(parent, dialog);
            frmContainer = new Form();
            frmContainer.ShowInTaskbar = false;
            frmContainer.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            frmContainer.StartPosition = FormStartPosition.CenterParent;
            frmContainer.Height = dialog.Height;
            frmContainer.Width = dialog.Width;

            frmContainer.Controls.Add(dialog);
            mask.MdiParent = parent.MdiParent;
            mask.Show();
            DialogResult result = frmContainer.ShowDialog(mask);
            frmContainer.Close();
            mask.Close();
            return result;
        }

        public static void CloseDialog()
        {
            if (frmContainer != null)
            {
                frmContainer.Close();
            }
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // MaskedDialog
            // 
            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Name = "MaskedDialog";
            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MaskedDialog_FormClosing);
            this.Load += new System.EventHandler(this.MaskedDialog_Load);
            this.ResumeLayout(false);

        }

        private void MaskedDialog_Load(object sender, EventArgs e)
        {
        }

        private void MaskedDialog_FormClosing(object sender, FormClosingEventArgs e)
        {
        }
    }
}

这样,当用户单击主 sdi 按钮时,我会调用我的叠加层。

Form2 f2 = new Form2();
f2.Show();
MaskedDialog.ShowDialog(this, f2);
f2.Dispose();
f2 = null;

当我运行代码并且MaskedDialog.ShowDialog(this, f2); 正在调用时,我收到一个错误....错误消息是已经可见的表单不能显示为模式对话框。在调用 showDialog 之前将表单的 visible 属性设置为 false。

所以我无法理解我在哪里犯了错误。任何人都可以帮助我解决问题。谢谢

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    您做错了 - 请致电 mask.ShowDialog(),而不是 mask.Show()dialog.ShowDialog()。错误消息非常清楚 - 你不能 ShowDialog 一个已经可见的表单 - 而这正是你在 dialog.ShowDialog(mask); 中所做的。

    或者,在调用MaskedDialog.ShowDialog 时,以一种可能更准确地显示您想要做什么的方式,执行以下操作:

    Form2 f2 = new Form2();
    MaskedDialog.ShowDialog(this, f2);
    

    换句话说 - 不要显示您要去ShowDialog 的表格。 ShowDialog 调用将使其可见。

    【讨论】:

    • 我应该写 mask.ShowDialog() 和 dialog.ShowDialog() 吗?
    • @Mou 您只需要了解在 ShowDialog 调用之后直到对话框关闭之前什么都不会执行,所以答案通常是“否”:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2017-05-28
    相关资源
    最近更新 更多