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

.net 如何在另一个应用程序中嵌入MDI表单?,.net,winforms,mdi,mdiparent,.net,Winforms,Mdi,Mdiparent,我们正在尝试将我们的应用程序嵌入到另一个通过UserControl提供界面的应用程序中 创建包含普通Windows.Form的用户控件很容易。但是,如果要嵌入的表单的属性为IsMdiContainer==true,那么如何执行此操作 Thx我认为不可能: 多文档接口(MDI) 父窗体必须是顶级窗体 窗户 如果尝试将父容器设置为MdiContainer,则会/应该出现异常。解决这个问题的唯一方法是重新设计要嵌入的窗口。您可以不使用MDI概念,或者如果确实需要,可以将其实现为一个自定义控件,该控件的

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

创建包含普通Windows.Form的用户控件很容易。但是,如果要嵌入的表单的属性为IsMdiContainer==true,那么如何执行此操作


Thx

我认为不可能:

多文档接口(MDI) 父窗体必须是顶级窗体 窗户

如果尝试将父容器设置为MdiContainer,则会/应该出现异常。解决这个问题的唯一方法是重新设计要嵌入的窗口。您可以不使用MDI概念,或者如果确实需要,可以将其实现为一个自定义控件,该控件的行为类似于MDI,但不受限制。(这是一个很高的要求,很可能需要大量自定义图形。)


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

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

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

主要思想在这篇文章中


这种方法有一个问题。当你最大化你的子窗口时,它会最大化并覆盖所有的用户控制区域,你不会看到它的标题栏。我相信您可以通过将MDI子窗口的最大大小设置为略小于用户控件大小来消除此错误。如果您不这样做,则这是不可能的。无法保证
SetParent
将在MDI子窗口中正常工作。您可能可以删除
WS_EX_MDICHILD
样式标志并将其重新设置为父项,但我从未尝试过。无论如何,正如你的回答所解释的,这不是一个好的解决方案。