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

本文关键字:最小化 窗体 何防止 WinForms | 更新日期: 2023-09-27 17:55:03

我正在创建一个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并将其放置在另一个监视器某处)。谢谢你的帮助!

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

我认为您将不得不远离拥有/父/mdi窗口,而将不得不使它们都是无主的顶层窗口,彼此"并行"。然后编写您自己的逻辑,用于将一个窗口停靠在另一个窗口中。

您实际上没有创建MDI应用程序,您没有设置子窗体的MdiParent属性。应该是清晰可见的,你可以把子窗体移到主窗体的边界之外。

您使用Show(owner)重载使它们拥有窗口。这意味着它们将始终在主窗口的顶部。当你最小化主窗口的时候也会最小化。

直接调用Show()方法(不带参数)

好的,我让它工作了:

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);
        }
    }
}

这个代码安全吗?