【问题标题】:How to embed an MDI Form in another application?如何在另一个应用程序中嵌入 MDI 表单?
【发布时间】:2011-04-01 04:30:38
【问题描述】:

我们正在尝试将我们的应用程序嵌入到另一个通过 UserControl 提供界面的应用程序中。

创建包含普通 Windows.Form 的用户控件很容易。但是,如果要嵌入的表单具有 IsMdiContainer == true 属性,该怎么做呢?

谢谢

【问题讨论】:

  • 你没有,这是不可能的。

标签: .net winforms mdi mdiparent


【解决方案1】:

我认为不可能because

多文档界面 (MDI) 父表单必须是顶级的 窗口。

如果您尝试为 MdiContainer 设置父级,您将/应该得到一个异常。解决此问题的唯一方法是重新设计您尝试嵌入的窗口。要么不使用 MDI 概念,要么如果您确实需要它,请将其实现为行为类似于 MDI 但没有限制的自定义控件。 (这是一项艰巨的任务,很可能需要大量自定义绘图。)

实际上有一种 hack 方法,您可以在运行时通过 SetParent 函数从其他进程重新创建父窗口。因此,例如,您可以“窃取”一个计算器窗口应用程序并将其托管在另一个 MDI 中,但这往往非常不稳定,尤其是对于更复杂的应用程序。您必须将 MDI 应用程序作为单独的进程启动,然后从托管应用程序调用 SetParent。如果上述选项都不适合您的需求,可能值得一试,但最有可能的结果是运行时异常。

【讨论】:

  • 无法保证SetParent 将在 MDI 窗口中正常工作。您可能可以删除WS_EX_MDICHILD 样式标志并将其重新设置为父级,但我从未尝试过。正如您的回答所解释的那样,无论如何,这都不是一个好的解决方案。
【解决方案2】:

您可以使用以下方法,它不是自动的,但它会完成工作。

1) 在您的用户控件中,声明您的 Windows 应用程序,即 MDI 主机。 2) 将创建和处理新窗口的功能映射到用户控件中的工具栏,或者您可以将其映射到自定义控件。 3) 每次创建新窗口时,将 MDI 父级设置为您在步骤 1 中声明的窗口。

主要思想在这篇文章中 C# Panel As MDI Container

该方法有 1 个问题。当您最大化您的子窗口时,它会最大化并覆盖所有用户控制区域,您不会看到它的标题栏。我相信你可以通过将MDI子窗口的最大尺寸设置为比用户控件尺寸小一点来摆脱这个错误

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 2018-05-03
    • 2015-04-05
    • 1970-01-01
    • 2010-09-23
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多