C# 最大化MDI子窗体

C# 最大化MDI子窗体,c#,winforms,mdi,mdichild,maximize,C#,Winforms,Mdi,Mdichild,Maximize,我正在处理一个遗留的WinForms MDI应用程序,在使子窗体按我所希望的方式运行时遇到了一些问题。 我的目标是使子窗体始终最大化(停靠) 问题是,即使我将MaximizeBox设置为false,最大化/调整大小按钮也会出现在MDIs工具条中,并允许用户调整(取消锁定)子窗体的大小。 避免这种情况的唯一方法是将ControlBox设置为false,然后关闭按钮消失(这不是我想要的) 我已经尝试过使用固定的FormBorderStyle,并在触发resize事件时最大化子窗体,但我的方法都不起作

我正在处理一个遗留的WinForms MDI应用程序,在使子窗体按我所希望的方式运行时遇到了一些问题。 我的目标是使子窗体始终最大化(停靠)

问题是,即使我将
MaximizeBox
设置为
false
,最大化/调整大小按钮也会出现在MDIs工具条中,并允许用户调整(取消锁定)子窗体的大小。 避免这种情况的唯一方法是将
ControlBox
设置为
false
,然后关闭按钮消失(这不是我想要的)

我已经尝试过使用固定的
FormBorderStyle
,并在触发resize事件时最大化子窗体,但我的方法都不起作用

有没有什么我错过的超级秘密财产,或者根本不可能

致以最诚挚的问候和感谢

更新 我编写了一个处理我的子表单的低级方法(感谢@rfresia),它可能会帮助遇到相同问题的其他人:

//All child forms derive from ChildForm
//Parent MDI Form implementation
//...
private void ShowForm(ChildForm form)
{
    //Check if an instance of the form already exists
    if (Forms.Any(x => x.GetType() == form.GetType()))
    {
        var f = Forms.First(x => x.GetType() == form.GetType());
        f.Focus();
        f.WindowState = FormWindowState.Maximized;
    }
    else
    {
        //Set the necessary properties (any other properties are set to default values)
        form.MdiParent = this;
        form.MaximizeBox = false;
        form.MinimizeBox = false;
        form.WindowState = FormWindowState.Maximized;
        Forms.Add(form);
        form.Forms = Forms;
        form.Show();
        form.Focus();
        //Lets make it nasty (some forms aren't rendered properly otherwise)
        form.WindowState = FormWindowState.Normal;
        form.WindowState = FormWindowState.Maximized;
    }
}
//...

//ChildForm implementation
//...
public List<Form> Forms { get; set; }
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    Forms.RemoveAll(x => x.GetType() == GetType());
}

protected override void OnResize(EventArgs e)
{
    WindowState = FormWindowState.Maximized;
}
//所有子窗体都派生自ChildForm
//父MDI表单实现
//...
私人作废展示表格(儿童表格)
{
//检查表单的实例是否已存在
if(Forms.Any(x=>x.GetType()==form.GetType())
{
var f=Forms.First(x=>x.GetType()==form.GetType());
f、 焦点();
f、 WindowState=FormWindowState.Maximized;
}
其他的
{
//设置必要的属性(任何其他属性都设置为默认值)
form.MdiParent=此;
form.ebox=false;
form.ebox=false;
form.WindowState=FormWindowState.Maximized;
表格。添加(表格);
形式。形式=形式;
form.Show();
form.Focus();
//让我们把它弄得很糟糕(否则某些表单无法正确渲染)
form.WindowState=FormWindowState.Normal;
form.WindowState=FormWindowState.Maximized;
}
}
//...
//子表单实现
//...
公共列表表单{get;set;}
受保护的覆盖无效(System.ComponentModel.CancelEventArgs e)
{
Forms.RemoveAll(x=>x.GetType()==GetType());
}
受保护的覆盖void OnResize(事件参数e)
{
WindowState=FormWindowState.Maximized;
}

您可以覆盖要确保不会最小化的每个子窗体的OnResize。或者创建一个基窗体并从中继承所有子窗体

protected override void OnResize(EventArgs e)
{
   this.WindowState = FormWindowState.Maximized;
}
此外,您可以使用X、y坐标,但OnResize应该足够了。将其放入子窗体构造函数中:

   this.WindowState = FormWindowState.Maximized;

   Point NewLoc = Screen.FromControl(this).WorkingArea.Location;
   //Modifiy the location so any toolbars & taskbar can be easily accessed.
   NewLoc.X += 1;
   NewLoc.Y += 1;
   this.Location = NewLoc;

   Size NewSize = Screen.FromControl(this).WorkingArea.Size;
   //Modifiy the size so any toolbars & taskbar can be easily accessed.
   NewSize.Height -= 1;
   NewSize.Width -= 1;
   this.Size = NewSize;

   this.MinimumSize = this.Size;
   this.MaximumSize = this.MinimumSize;
我从这里得到了X,Y的代码:
这就是我如何克服相同问题的方法,我记不起在哪里找到代码了

private const int WM_SYSCOMMAND = 0x112;
private const int SC_MINIMIZE = 0xF020;
private const int SC_MAXIMIZE = 0xF030;
private const int SC_CLOSE = 0xF060;
private const int SC_RESTORE = 0xF120;

protected override void WndProc(ref Message msg)
{
  if ((msg.Msg == WM_SYSCOMMAND) && 
    (((int)msg.WParam == SC_MINIMIZE) || ((int)msg.WParam == SC_MAXIMIZE) ||
    ((int)msg.WParam == SC_CLOSE)) || ((int)msg.WParam == SC_RESTORE))
    {
      //do nothing
    } // end if
    else
    {
      base.WndProc(ref msg);
     } // end else
}

这个问题不容易解决,但我意外地找到了答案,而且很简单;默认情况下,将子窗体的窗口状态设置为“正常”。然后确保在调用
Show()
方法后重置子窗口的窗口状态

例如:

private void ShowNewForm(object sender, EventArgs e)
{
  Form childForm = new Form();
  childForm.MdiParent = this;
  childForm.Text = "Window " + childFormNumber++;
  childForm.Show();
  childForm.WindowState = FormWindowState.Maximized;
}

在我的应用程序中,我发现如果我在表单加载事件中只放了这两行,它就会工作。谢谢sarvjeet的基本想法+1给你

this.WindowState = FormWindowState.Minimized;
this.WindowState = FormWindowState.Maximized;

当您希望子窗体总是最大化时,使用MDI是没有意义的。无论怎样,当你切换窗口时,MDI都会以大量的闪烁来与你对抗。你可能是对的,但正如我所说的,这是遗留代码,我不想太多地涉及它。
this.WindowState = FormWindowState.Minimized;
this.WindowState = FormWindowState.Maximized;