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

本文关键字:恢复 表单 拥有 最大化 | 更新日期: 2023-09-27 18:27:43

我在一个表单上有一个按钮,它可以打开一个新表单作为一个拥有的表单

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)

然后在恢复时,最大化的拥有形态不再最大化,而是具有"正常"状态。

编辑:Owned表单被设置为一个工具窗口,因此我不能破坏Owner/Owned关系。这似乎是winforms的问题,但我知道应该可以纠正,因为VS行为正确,并将窗口恢复为Maximized而不是Normal。

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

这里有一种可能性。。。

将属性添加到Owned表单以跟踪其最后一个FormWindowState(如果您不想公开它,可能只是private):

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

WndProc的覆盖添加到Owned表单:

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