代码之家  ›  专栏  ›  技术社区  ›  Mike Hofer

从MDI切换到SDI,然后再切换回来

  •  0
  • Mike Hofer  · 技术社区  · 15 年前

    这听起来像是一个简单的任务,但我遇到了一些问题。

    我的C应用程序有一些非常简单的代码:

        private void SwitchToSdi()
        {
            MainWindow mainWindow = GetMainWindow();
    
            for (int index = mainWindow.MdiChildren.Length - 1; index >= 0; index--)
            {
                Form form = mainWindow.MdiChildren[index];
                if (!(form is MainWindow))
                {                    
                    form.Visible = false;
                    form.MdiParent = null;
                    form.Visible = true;
                    mainWindow.MdiChildren[index] = null;
                }
            }
            mainWindow.IsMdiContainer = false;
        }
    

    然后,

        private void SwitchToMdi()
        {
            MainWindow mainWindow = GetMainWindow();
            mainWindow.IsMdiContainer = true;
            for (int index = Application.OpenForms.Count - 1; index >= 0; index--)
            {
                Form form = Application.OpenForms[index];
                if (!(form is MainWindow))
                {
                    form.Visible = false;
                    form.MdiParent = mainWindow;
                    form.Visible = true;
                }
            }
        }
    

    请注意,MainWindow是MDI父窗口,其IsMDicontainer属性设置为true。

    用户可以在选项对话框中在MDI和SDI之间切换。那么多的东西很好用。如果我切换到SDI,新窗口会在主窗口外打开,这很好。同样,如果我切换到MDI,它们会在容器中打开。

    不过,我注意到了一些事情。

    1. 打开MDI子窗口不会像我预期的那样变成SDI窗口。

    2. 打开SDI窗口不会像我预期的那样成为MDI子窗口。

    3. 即使在调用switchtomdi()时将ismdicontainer设置为true,如果我尝试打开一个新窗口,我也会得到一个异常,它告诉我主窗口不是MDI容器。奥欧

    有人请扔我一块骨头在这里。这不应该是火箭科学。但我并没有在入口处找到很多有用的帮助(阅读:g0gle是相当无用的)。

    以前有人在.NET中实现过这种行为吗?你是怎么做到的?我这里缺什么?哈普!

    2 回复  |  直到 14 年前
        1
  •  1
  •   Maximilian Becker    14 年前

    不得不说,我以前没有这样做,只是遇到了同样的问题。为了提供一个解决方案,我目前的想法是您可以通过“复制”表单的状态来模仿所需的行为。创建一个新实例并将状态传递给构造函数。

        2
  •  0
  •   Kyle Heironimus    15 年前

    这是一个蹩脚的答案,但是你已经18个小时没有答案了,所以这是…

    在Borland /NavaCaboro C++Builder帮助中,它表示“在运行时更改FortSype(在SDI和MDI之间)是不可取的。