最大化拥有的表单未正确恢复
本文关键字:恢复 表单 拥有 最大化 | 更新日期: 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);
}
}
我的问题如下:
- 如果我单击按钮获取一个所属窗体的实例,并将其拖动到它自己的监视器上
- 最大化拥有的表单
- 最小化原始主窗体(Form1)
- 恢复原始主窗体(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;
}