C# WinForms:当父窗体被最小化时,如何防止子窗体被最小化?

8

我正在创建一个C# WinForms MDI应用程序。我有一个主窗体,其中包含4个其他窗体。我希望能够将子窗体移动到父窗体之外(它们的FormBorderStyle值设置为大小可调节的工具栏,以便每个子窗口不会在任务栏上出现单独的窗口)。我可以通过使用以下代码来实现主窗体:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace Prototype
    {
       public partial class MdiParent : Form
       {
           private FastEyeControl m_ControlForm;
           private FastEyeLogWindow m_LogForm;
           private FastEyeConfiguration m_ConfigurationForm;
           private ROCOrderWindow m_OrderLogForm;

           public MdiParent()
           {
               InitializeComponent();

               m_ControlForm       = new FastEyeControl();
               m_LogForm           = new FastEyeLogWindow();
               m_ConfigurationForm = new FastEyeConfiguration();
               m_OrderLogForm      = new ROCOrderWindow();
           }

           private void MdiParent_Load(object sender, EventArgs e)
           {
               m_ControlForm.Show(this);
               m_LogForm.Show(this);
               m_ConfigurationForm.Show(this);
               m_OrderLogForm.Show(this);
           }
        }
    }

然而,当我最小化父窗体时,所有子窗体也会被最小化(如预期)。有没有办法防止任何在父窗口之外的子窗体在父窗口最小化时被最小化?基本上,如果需要,我希望用户能够调整大小和移动单独的子窗体到父窗体之外(就像在Visual Studio.NET中取消停靠工具栏并将其放置在其他监视器中一样)。感谢您的帮助!

很好的问题。我没有答案,但我会调查一下。那绝对是一个有趣的情境。 - IAmTimCorey
你尝试过从Show()调用中删除“this”吗?(显示没有父级的窗体。) - Josh M.
是的,但接下来会发生的是,在启动时子窗体将被放置在父窗口的后面。我希望子窗体始终在父窗体的前面。 - Andrew
你确定你正在使用 MDI 父/子窗体吗?据我所知,你需要为每个子窗体设置 MdiParent 属性才能使真正的 MDI 功能生效。就我所看到的,你只设置了子窗体的 Owner。 - Adi
是的,但如果我使用MdiParent,那么子窗体就不能移动到父窗体之外。 - Andrew
3个回答

1

我认为你需要放弃拥有/父级/MDI 窗口,而是将它们全部变成无所有权的顶层窗口,并且在彼此间“并行”存在。然后编写自己的逻辑,使得一个窗口可以停靠在另一个窗口内部。


1

你实际上没有创建一个 MDI 应用程序,因为你没有设置子窗体的 MdiParent 属性。这应该是明显可见的,你可以将子窗体移动到主窗体的边界之外。

你使用了 Show(owner) 重载使它们成为拥有者窗口。这意味着它们将始终位于主窗口的顶部,并且在最小化主窗口时也会被最小化。

只需调用 Show() 方法即可(不带参数)。


1

好的,我搞定了:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace Prototype
{
    public partial class MdiParent : Form
    {
        private FastEyeControl m_ControlForm;
        private FastEyeLogWindow m_LogForm;
        private FastEyeConfiguration m_ConfigurationForm;
        private ROCOrderWindow m_OrderLogForm;

        private Point m_ControlFormLocation;
        private Point m_LogFormLocation;
        private Point m_ConfigurationFormLocation;
        private Point m_OrderLogFormLocation;

        public MdiParent()
        {
            InitializeComponent();

            m_ControlForm       = new FastEyeControl();
            m_LogForm           = new FastEyeLogWindow();
            m_ConfigurationForm = new FastEyeConfiguration();
            m_OrderLogForm      = new ROCOrderWindow();

            m_ControlFormLocation = new Point(0, 25);
            m_LogFormLocation = new Point(0, 405);
            m_ConfigurationFormLocation = new Point(550, 25);
            m_OrderLogFormLocation = new Point(0, 630);
        }

        private void MdiParent_Load(object sender, EventArgs e)
        {
            DockForm(m_ControlForm, m_ControlFormLocation);
            DockForm(m_LogForm, m_LogFormLocation);
            DockForm(m_ConfigurationForm, m_ConfigurationFormLocation);
            DockForm(m_OrderLogForm, m_OrderLogFormLocation);
        }

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void DockForm(Form form, Point location)
        {
            form.TopLevel = false;
            form.Location = location;

            if (! this.Controls.Contains(form))
            {
                this.Controls.Add(form);
            }

            form.Visible = true;
        }

        private void UndockForm(Form form)
        {
            if (this.Controls.Contains(form))
            {
                this.Controls.Remove(form);
            }

            form.TopLevel = true;
            form.Visible = true;
        }

        private void DockOrUndockForm(Form form, Point location)
        {
            if (this.Controls.Contains(form))
            {
                UndockForm(form);
            }
            else
            {
                DockForm(form, location);
            }
        }

        private void ToggleDockingOrDockForm(Form form, Point location)
        {
            if (form.Visible)
            {
                DockOrUndockForm(form, location);
            }
            else
            {
                DockForm(form, location);
            }
        }

        private void fastEyeControlToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ToggleDockingOrDockForm(m_ControlForm, m_ControlFormLocation);
        }

        private void fastEyeLogToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ToggleDockingOrDockForm(m_LogForm, m_LogFormLocation);
        }

        private void fastEyeConfigurationToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ToggleDockingOrDockForm(m_ConfigurationForm, m_ConfigurationFormLocation);
        }

        private void rOCOrderLogToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ToggleDockingOrDockForm(m_OrderLogForm, m_OrderLogFormLocation);
        }
    }
}

这段代码安全吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接