首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当以编程方式隐藏并再次显示最大化的子窗体时,当C#.NET MDI错误时,不能更改子窗体的图标

问当以编程方式隐藏并再次显示最大化的子窗体时,当C#.NET MDI错误时,不能更改子窗体的图标
EN

Stack Overflow用户
提问于 2010-12-13 12:36:54
回答 5查看 5.8K关注 0票数 8

基本上,我的C#.NET MDI有两个问题。您可以下载VS2010解决方案,该解决方案可以复制bug 这里。

( 1)当以编程方式隐藏并再次显示最大化的子窗体时,它不会再次被适当地最大化,并且既不会最大化也不会处于正常状态。

代码语言:javascript
复制
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区域与虚拟子表单闪烁?

代码语言:javascript
复制
private void workaround1Button_Click(object sender, EventArgs e)
{
    dummyForm.Visible = true;
    dummyForm.Visible = false;
}

2)当子窗体最大化时,在菜单栏上显示子窗体的图标。但是,如果您必须在子窗体最大化时更改图标,则菜单栏上的图标不会被刷新(见上面的图像)。我也找到了一个解决办法,它基本上隐藏并显示菜单栏。图标被刷新,但它使菜单栏下的所有东西都闪烁。尝试无效、刷新、更新方法,但它们没有帮助。是否有其他方法可以使菜单栏刷新子窗体的图标?

代码语言:javascript
复制
private void workaround2Button_Click(object sender, EventArgs e)
{
    menuStrip.Visible = false;
    menuStrip.Visible = true;
}

我还注意到,当父窗体处于正常窗口状态模式(未最大化),并且将窗体的宽度或高度更改1像素时,子窗体按其应有的大小最大化,菜单栏上的子窗体图标被正确刷新,您不需要其他解决方法。如果以编程方式更改窗体的大小,则窗体闪烁1像素,当父窗体最大化时,无法做到这一点。有任何方法可以调用重绘/刷新功能吗?在调整窗体大小时调用该功能,使子窗体最大化,并刷新菜单栏上的图标吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-14 20:11:40

找到了解决这些问题的方法。

首先,您需要暂停绘画的形式和它的孩子。我找到了一个非常有用的线程这里,它描述了如何实现它。

挂起绘图后,需要调用控件的UpdateBounds方法,并将ClientRectangle宽度或高度增加一个,然后将其降回原来的值。这会调用布局功能,从而使所有要更新/重新绘制的内容。最后一步是使绘画成为可能。我想不是很好的解决办法,但有效。

代码语言:javascript
复制
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/调用,这在一般情况下是应该避免的。

票数 1
EN

Stack Overflow用户

发布于 2010-12-13 12:43:54

你是否厌倦了使用隐藏/显示而不是将其设置为true/false?

尝试:

代码语言:javascript
复制
private void showButton_Click(object sender, EventArgs e)
{
    childForm.Show();
}

private void hideButton_Click(object sender, EventArgs e)
{
    childForm.Hide();
}
票数 1
EN

Stack Overflow用户

发布于 2010-12-13 13:49:47

内部MdiControlStrip类(显示图标的控件)和父窗口中的min/max/restore符号的实现中存在一个错误。到目前为止,我还没有对其进行描述,代码并不那么容易。错误的一个典型的副作用是图形会被折叠,你会发现一些其他的副作用。但是,修复很简单,延迟创建子窗口直到构造函数完成之后。如下所示:

代码语言:javascript
复制
    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);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4428880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档