I used the matias answer above and was able to get rid of most of the questions raised in the comments. I also created a helper class for child forms in case someone wants to use it and / or make it better.
public class MdiClientPanel : Panel
{
private MdiClient _ctlClient = new MdiClient();
public delegate void ActivateHandler(object sender, MdiClientForm child);
public event ActivateHandler OnChildActivated;
public Form ActiveMDIWnd
{
get;
set;
}
public List<MdiClientForm> ChildForms = new List<MdiClientForm>();
public MdiClientPanel()
{
base.Controls.Add(_ctlClient);
}
private Form _mdiForm = null;
public Form MdiForm
{
get
{
if (_mdiForm == null)
{
_mdiForm = new Form();
System.Reflection.FieldInfo field = typeof(Form).GetField("ctlClient",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
field.SetValue(_mdiForm, _ctlClient);
}
return _mdiForm;
}
}
private void InitializeComponent()
{
SuspendLayout();
ResumeLayout(false);
}
public MdiClientForm AddChild(MdiClientForm child)
{
child.MyMdiContainer = this;
child.MdiParent = MdiForm;
ChildForms.Add(child);
return child;
}
public void RestoreChildForms()
{
foreach (MdiClientForm child in ChildForms)
{
child.WindowState = FormWindowState.Normal;
child.MaximizeBox = true;
child.MinimizeBox = true;
}
}
public void ChildActivated(MdiClientForm child)
{
ActiveMDIWnd = child;
if (OnChildActivated != null)
OnChildActivated(this, child);
}
public void ChildClosed(MdiClientForm child)
{
ChildForms.Remove(child);
}
}
public class MdiClientForm : Form
{
public MdiClientPanel MyMdiContainer { get; set; }
public MdiClientForm()
{
Activated += OnFormActivated;
FormClosed += OnFormClosed;
}
void OnFormClosed(object sender, FormClosedEventArgs e)
{
MyMdiContainer.ChildClosed(this);
}
private void OnFormActivated(object sender, EventArgs e)
{
MyMdiContainer.ChildActivated(this);
}
}
MrWuf source
share