最大化拥有的表单无法正确恢复

时间:2013-08-14 14:20:07

标签: c# winforms maximize-window

我在表单上有一个按钮,可以将新表单作为自有表单打开。 (这很简单,除了下面没有其他逻辑)

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Form form = new Form();
        form.Show(this);
    }
}

我的问题如下:

  1. 如果我点击按钮获取所拥有表单的实例并将其拖到它自己的监视器上。
  2. 最大化自有表格
  3. 最小化原始主窗体(Form1)
  4. 恢复原始主窗体(Form1)
  5. 然后在恢复时,最大化的拥有形式不再最大化,但状态为正常。

    修改 拥有的表单被设置为工具窗口,因此我无法打破所有者/所有者的关系。它似乎是winforms的一个东西,但我知道应该可以正确地纠正VS行为,并将窗口恢复到最大化而不是正常。

1 个答案:

答案 0 :(得分:1)

这是一种可能性......

将属性添加到“拥有”表单以跟踪其上一个FormWindowState(如果您不想公开它,可以只是private):

private FormWindowState _lastState;
public FormWindowState LastWindowState { get { return _lastState; } }

WndProc的覆盖添加到自有表单:

protected override void WndProc(ref Message message)
{
    const Int32 WM_SYSCOMMAND = 0x0112;
    const Int32 SC_MAXIMIZE = 0xF030;
    const Int32 SC_MINIMIZE = 0xF020;
    const Int32 SC_RESTORE = 0xF120;

    switch (message.Msg)
    {
    case WM_SYSCOMMAND:
        {
        Int32 command = message.WParam.ToInt32() & 0xfff0;
        switch (command)
        {
            case SC_MAXIMIZE:
            _lastState = FormWindowState.Maximized;
            break;
            case SC_MINIMIZE:
            _lastState = FormWindowState.Minimized;
            break;
            case SC_RESTORE:
            _lastState = FormWindowState.Normal;
            break;
        }
        }
        break;
    }

    base.WndProc(ref message);
}

最后,为Owned表单的VisibleChanged事件添加处理程序:

private void Form2_VisibleChanged(object sender, EventArgs e)
{
    WindowState = _lastState;
}