如何在 Windows 表单应用程序中正确地将表单停靠到 MDI?

How to properly dock to the right a form to a MDI in a Windows Form application?

我正在向 MDI 添加侧边栏表单(不是子表单)并将其停靠在右侧。 侧边栏的顶部似乎与工具栏重叠。手动调整大小时(通过拖动),边栏 "magically" 看起来不错。

调整大小前:

调整大小后:

public partial class MDI : Form
{
    private void InitGenealogicalTree()
    {
        var form = new GenealogicalTreeForm();            
        form.TopLevel = false;
        form.WindowState = FormWindowState.Normal;
        form.Dock = DockStyle.Right;
        this.Controls.Add(form);
    }
}

注意:ToolStrip 是在设计模式下添加的。

如何正确添加边栏表单而不使其与工具栏重叠?

只需将面板置于 desigenermode 中,您希望在其中放置侧面板并在面板中显示侧面板。


以下代码可让您在面板中显示侧边栏表单:

var form = new GenealogicalTreeForm();            
form.TopLevel = false;
panel.Controls.Add(form);
form.Dock = DockStyle.Fill;
this.Controls.Add(form);
form.Show();

边栏 windows 不能移动,不能调整大小,不能最大化,所以:

  • FormBorderStyle 设置为 FixedToolWindow
  • 覆盖侧边栏 WndProc window WndProc 以防止移动并防止最大化:

    protected override void WndProc(ref Message m)
    {
        const int WM_SYSCOMMAND = 0x0112;
        const int SC_MOVE = 0xf010;
        const int SC_MAXIMIZE = 0xf030;
        if (m.Msg == WM_SYSCOMMAND)
        {
            int command = m.WParam.ToInt32() & 0xfff0;
            if (command == SC_MOVE || command == SC_MAXIMIZE)
                return;
        }
        base.WndProc(ref m);
    }
    
  • 另外,添加侧边栏时,将其置于前面。这意味着首先应该停靠工具栏,然后侧边栏 windows 将停靠在剩余区域:

    this.Controls.Add(sideBar);
    sideBar.BringToFront();