【问题标题】:Maximized owned Form not restoring correctly最大化拥有的表格无法正确恢复
【发布时间】:2013-08-14 14:20:07
【问题描述】:

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

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 行为正确并将窗口恢复为最大化而不是正常。

【问题讨论】:

  • 我试图监听消息队列以了解它恢复的事件,但我只为主表单获取这些,而不是拥有的表单。当我检查所拥有表单的状态时,它已正确最大化。
  • 如果他们不表现得像 Owner 和 Owned,那为什么要这样做呢?让它“无人拥有”,它会做你想做的事。
  • 拥有的表单被设置为工具窗口,只有在主表单可见时才可见。
  • 是否只是为了确保 Owner 总是关闭 Owned?如果是这样,只需手动执行此操作,并将其保留为非所有者。
  • 这将需要更改大量代码以确保表单已关闭并最小化并正确位于主表单之上。我不认为这是一个解决方案。

标签: c# winforms maximize-window


【解决方案1】:

这是一种可能性……

向 Owned 表单添加一个属性以跟踪其最后一个 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;
}

【讨论】:

  • 我已经尝试过了,并用它存储了所有表单的状态。可悲的是,您可以将它们设置为它们所在的位置,但在所有这些之后会被解雇(这会再次使拥有的表单最大化)
  • 我无法重现这最后一步。确保它不在您自己的代码中(即使是由于调用的一些间接结果而无意中)。在我的测试应用程序中,恢复按预期进行。
猜你喜欢
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
相关资源
最近更新 更多