【发布时间】:2011-04-01 04:30:38
【问题描述】:
我们正在尝试将我们的应用程序嵌入到另一个通过 UserControl 提供界面的应用程序中。
创建包含普通 Windows.Form 的用户控件很容易。但是,如果要嵌入的表单具有 IsMdiContainer == true 属性,该怎么做呢?
谢谢
【问题讨论】:
-
你没有,这是不可能的。
标签: .net winforms mdi mdiparent
我们正在尝试将我们的应用程序嵌入到另一个通过 UserControl 提供界面的应用程序中。
创建包含普通 Windows.Form 的用户控件很容易。但是,如果要嵌入的表单具有 IsMdiContainer == true 属性,该怎么做呢?
谢谢
【问题讨论】:
标签: .net winforms mdi mdiparent
我认为不可能because:
多文档界面 (MDI) 父表单必须是顶级的 窗口。
如果您尝试为 MdiContainer 设置父级,您将/应该得到一个异常。解决此问题的唯一方法是重新设计您尝试嵌入的窗口。要么不使用 MDI 概念,要么如果您确实需要它,请将其实现为行为类似于 MDI 但没有限制的自定义控件。 (这是一项艰巨的任务,很可能需要大量自定义绘图。)
实际上有一种 hack 方法,您可以在运行时通过 SetParent 函数从其他进程重新创建父窗口。因此,例如,您可以“窃取”一个计算器窗口应用程序并将其托管在另一个 MDI 中,但这往往非常不稳定,尤其是对于更复杂的应用程序。您必须将 MDI 应用程序作为单独的进程启动,然后从托管应用程序调用 SetParent。如果上述选项都不适合您的需求,可能值得一试,但最有可能的结果是运行时异常。
【讨论】:
SetParent 将在 MDI 子 窗口中正常工作。您可能可以删除WS_EX_MDICHILD 样式标志并将其重新设置为父级,但我从未尝试过。正如您的回答所解释的那样,无论如何,这都不是一个好的解决方案。
您可以使用以下方法,它不是自动的,但它会完成工作。
1) 在您的用户控件中,声明您的 Windows 应用程序,即 MDI 主机。 2) 将创建和处理新窗口的功能映射到用户控件中的工具栏,或者您可以将其映射到自定义控件。 3) 每次创建新窗口时,将 MDI 父级设置为您在步骤 1 中声明的窗口。
主要思想在这篇文章中 C# Panel As MDI Container
该方法有 1 个问题。当您最大化您的子窗口时,它会最大化并覆盖所有用户控制区域,您不会看到它的标题栏。我相信你可以通过将MDI子窗口的最大尺寸设置为比用户控件尺寸小一点来摆脱这个错误
【讨论】: