如何在另一个应用程序中嵌入MDI表单?

问题描述:

我们试图将我们的应用程序嵌入到另一个通过UserControl提供接口的应用程序中。如何在另一个应用程序中嵌入MDI表单?

很容易创建一个包含正常Windows.Form的用户控件。但是,如果要嵌入的表单具有属性IsMdiContainer == true,该如何执行此操作?

THX

+2

你不这样做,这是不可能的。 – 2011-04-01 04:53:35

我不认为这将有可能because

多文档接口(MDI) 父窗体必须是一个* 窗口。

如果您尝试将父级设置为MdiContainer,您将/应该会发生异常。解决此问题的唯一方法是重新设计您要嵌入的窗口。要么没有MDI的概念,要么如果你真的需要它,把它作为一个自定义控件来实现,它的行为像MDI但没有限制。 (这是一个很可能需要很多自定义绘图的高阶命令。)

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

+0

无法保证'SetParent'可以正确地用于MDI *子窗口。你*可能*能够移除'WS_EX_MDICHILD'样式标志并将其重新保存,但我从未尝试过。无论如何,这不是一个好的解决方案,因为你的答案解释了。 – 2011-04-01 08:19:40

你可以使用下面的方法,它不是自动的,但它会做的工作。

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

主要的想法是申报窗口,在这个岗位 C# Panel As MDI Container

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