C# 最大化 MDI 子窗体
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8765088/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Maximize MDI child form
提问by Jay
I'm working on a legacy WinForms MDI application and have some trouble making the child forms behave as I want. My objective is to have the child form alwaysmaximized (docked).
我正在处理遗留的 WinForms MDI 应用程序,但在使子窗体按我想要的方式运行时遇到了一些麻烦。我的目标是让子窗体始终最大化(停靠)。
The problem is, that even if I set MaximizeBoxto falsethe maximize/resize button appears in the MDIs toolstrip and let the user resize (undock) the child form.
The only way to avoid this is to set ControlBoxto falsebut then the close button disappears to (thats not what I want).
问题是,即使我设置MaximizeBox为false最大化/调整大小按钮出现在 MDI 工具条中并让用户调整(取消停靠)子窗体的大小。避免这种情况的唯一方法是设置ControlBox为false但随后关闭按钮消失为(那不是我想要的)。
I've already tried to use a fixed FormBorderStyleand to maximize the child form when the resize event is fired but none of my approaches worked.
我已经尝试在FormBorderStyle触发 resize 事件时使用固定的并最大化子窗体,但我的方法都不起作用。
Is there any super secret property I have missed or is it just impossible?
有没有我错过的超级秘密财产,或者是不可能的?
Best Regards & Thanks in advance
最好的问候和提前致谢
Update
更新
I wrote a sleazy method (thanks to @rfresia) for handling my child form, it may help others who run into the same issue:
我写了一个简单的方法(感谢@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;
}
采纳答案by rfresia
You can override the OnResize of each child form you want to make sure does not minimize. Or create a BaseForm and inherit all children forms from it.
您可以覆盖要确保不会最小化的每个子表单的 OnResize。或者创建一个 BaseForm 并从中继承所有子窗体。
protected override void OnResize(EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
}
Also, you can use X,y coordinates, but OnResize should be enough. Put this in the child form constructor:
此外,您可以使用 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;
I got the code for the X,Y from here: http://bytes.com/topic/c-sharp/answers/278649-how-do-i-prevent-form-resizing
我从这里得到了 X、Y 的代码:http: //bytes.com/topic/c-sharp/answers/278649-how-do-i-prevent-form-resizing
回答by Peter
This is how I overcame the same promblem, cannot remember where I found the code.
这就是我如何克服同样的问题,不记得我在哪里找到代码。
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
}
回答by user1714568
The problem wasn't easy to solve, but I accidentally found the answer and it's quite simple; set the windowstate of the child form to Normal by default. Then make sure that you reset the windowstate of the child window AFTERyou call the Show()method.
问题解决起来并不容易,但我无意中找到了答案,而且很简单;默认情况下将子窗体的 windowstate 设置为 Normal。然后确保在调用该方法后重置子窗口的窗口状态Show()。
Example:
例子:
private void ShowNewForm(object sender, EventArgs e)
{
Form childForm = new Form();
childForm.MdiParent = this;
childForm.Text = "Window " + childFormNumber++;
childForm.Show();
childForm.WindowState = FormWindowState.Maximized;
}
回答by sarvjeet
form1 obj = new form1 ();
obj.MdiParent = MDIGracular.ActiveForm;
obj.StartPosition = FormStartPosition.CenterParent;
obj.WindowState = FormWindowState.Minimized;
obj.Dock = DockStyle.Fill;
obj.Show();
obj.WindowState = FormWindowState.Maximized;
回答by Jeff
In my app I found if I put just these two lines in the form loaded event it worked. Thanks sarvjeet for the basic idea. +1 for you
在我的应用程序中,我发现如果我将这两行放在表单加载事件中,它会起作用。感谢 sarvjeet 的基本想法。+1 给你
this.WindowState = FormWindowState.Minimized;
this.WindowState = FormWindowState.Maximized;

