我正在创建一个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中取消工具栏并将其放在另一个监视器中)。谢谢你的帮助!
答案 0 :(得分:1)
我认为你将不得不离开拥有/父级/ mdi窗口,而是必须让它们成为所有无主的顶级窗口,彼此“并行”。然后编写自己的逻辑,将一个窗口对接到另一个窗口。
答案 1 :(得分:1)
您实际上没有创建MDI应用程序,也没有设置子窗体的MdiParent属性。应该清晰可见,您可以将子表单移动到主表单的边界之外。
您通过使用Show(所有者)重载使它们拥有窗口。这意味着它们将始终位于主窗口的顶部。最小化主窗口时也会最小化。
只需调用Show()方法(无参数)。
答案 2 :(得分: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);
}
}
}
这段代码安全吗?