0

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

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)

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

编辑: 拥有的表单被设计为一个工具窗口,所以我不能打破所有者/拥有的关系。这似乎与winforms有关,但我知道应该可以纠正,因为VS行为正确并将窗口恢复为最大化而不是正常。

4

1 回答 1

1

这是一种可能...

将属性添加到 Owned 表单以跟踪其最后一个FormWindowStateprivate如果您不想公开它,可能会这样做):

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;
}
于 2013-08-15T12:00:06.463 回答