基本上,我的C#.NET MDI有两个问题。您可以下载VS2010解决方案,该解决方案可以复制bug 这里。
( 1)当以编程方式隐藏并再次显示最大化的子窗体时,它不会再次被适当地最大化,并且既不会最大化也不会处于正常状态。
childForm = new Form();
childForm.Text = "Child Form";
childForm.MdiParent = this;
...
private void showButton_Click(object sender, EventArgs e)
{
childForm.Visible = true;
}
...
private void hideButton_Click(object sender, EventArgs e)
{
childForm.Visible = false;
}当子窗体最大化,然后编程隐藏并再次显示时,它会变成这样(请注意菜单栏-子窗体的控制框出现,但子窗体没有最大化):

在此阶段,不能移动子窗体。然而,我找到了一个解决办法,只需显示和隐藏一个虚拟子表单,这就迫使实际的子表单变得适当地最大化。但这使得MDI区域闪烁。尝试无效、刷新、更新方法,但它们没有帮助。也许还有其他解决办法来克服这个错误,而不是让MDI区域与虚拟子表单闪烁?
private void workaround1Button_Click(object sender, EventArgs e)
{
dummyForm.Visible = true;
dummyForm.Visible = false;
}2)当子窗体最大化时,在菜单栏上显示子窗体的图标。但是,如果您必须在子窗体最大化时更改图标,则菜单栏上的图标不会被刷新(见上面的图像)。我也找到了一个解决办法,它基本上隐藏并显示菜单栏。图标被刷新,但它使菜单栏下的所有东西都闪烁。尝试无效、刷新、更新方法,但它们没有帮助。是否有其他方法可以使菜单栏刷新子窗体的图标?
private void workaround2Button_Click(object sender, EventArgs e)
{
menuStrip.Visible = false;
menuStrip.Visible = true;
}我还注意到,当父窗体处于正常窗口状态模式(未最大化),并且将窗体的宽度或高度更改1像素时,子窗体按其应有的大小最大化,菜单栏上的子窗体图标被正确刷新,您不需要其他解决方法。如果以编程方式更改窗体的大小,则窗体闪烁1像素,当父窗体最大化时,无法做到这一点。有任何方法可以调用重绘/刷新功能吗?在调整窗体大小时调用该功能,使子窗体最大化,并刷新菜单栏上的图标吗?
发布于 2010-12-14 20:11:40
找到了解决这些问题的方法。
首先,您需要暂停绘画的形式和它的孩子。我找到了一个非常有用的线程这里,它描述了如何实现它。
挂起绘图后,需要调用控件的UpdateBounds方法,并将ClientRectangle宽度或高度增加一个,然后将其降回原来的值。这会调用布局功能,从而使所有要更新/重新绘制的内容。最后一步是使绘画成为可能。我想不是很好的解决办法,但有效。
StopDrawing();
UpdateBounds(Location.X, Location.Y, Width, Height, ClientRectangle.Width, ClientRectangle.Height + 1);
UpdateBounds(Location.X, Location.Y, Width, Height, ClientRectangle.Width, ClientRectangle.Height - 1);
StartDrawing();我发现挂起的绘画不仅对解决这两个bug很有帮助,而且在一般情况下也可以使GUI工作得更顺利。我想这可以帮助消除任何类型的闪烁。然而,这个解决方案需要调用P/调用,这在一般情况下是应该避免的。
发布于 2010-12-13 12:43:54
你是否厌倦了使用隐藏/显示而不是将其设置为true/false?
尝试:
private void showButton_Click(object sender, EventArgs e)
{
childForm.Show();
}
private void hideButton_Click(object sender, EventArgs e)
{
childForm.Hide();
}发布于 2010-12-13 13:49:47
内部MdiControlStrip类(显示图标的控件)和父窗口中的min/max/restore符号的实现中存在一个错误。到目前为止,我还没有对其进行描述,代码并不那么容易。错误的一个典型的副作用是图形会被折叠,你会发现一些其他的副作用。但是,修复很简单,延迟创建子窗口直到构造函数完成之后。如下所示:
public MainForm()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e) {
childForm = new Form();
childForm.Text = "Child Form";
childForm.MdiParent = this;
dummyForm = new Form();
dummyForm.MdiParent = this;
dummyForm.WindowState = FormWindowState.Maximized;
base.OnLoad(e);
}https://stackoverflow.com/questions/4428880
复制相似问题