程序作为MDI子窗口

时间:2009-10-03 20:09:06

标签: c# windows winforms mdi

有没有办法将程序用作MDI子窗口。我想有一个主MDI父窗口,它可以有多个子窗口,其中一些是自己的程序(.exe文件)。

3 个答案:

答案 0 :(得分:4)

实际上有一种非常简单的方法。

首先,您需要在表单中添加一个面板。该面板将用于“托管”该应用程序。

接下来,您需要将“System.Runtime.InteropServices”和“System.Diagnostics”命名空间添加到命名空间: CSHARP

using System.Diagnostics;
using System.Runtime.InteropServices;

现在,我们需要设置我们的WinAPI函数:

[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hwndChild, IntPtr hwndNewParent);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, Int32 wParam, Int32 lParam);

现在,在按钮单击事件中,启动该过程,并将其父级设置为面板。在这个例子中,我将使用记事本:

// Create a new process
Process proc;

// Start the process
proc = Process.Start("notepad.exe");
proc.WaitForInputIdle();

// Set the panel control as the application's parent
SetParent(proc.MainWindowHandle, this.panel1.Handle);

// Maximize application
SendMessage(proc.MainWindowHandle, 274, 61488, 0);

答案 1 :(得分:0)

几年前我已经实现了类似的东西(基于.NET Framework 1.1,如果我没记错的话)。该实施的关键要素是:

  • 我们创建了一个扩展的Form类,它暴露了一些特定的功能,例如用于提取将调用UI的用户命令的接口。
  • 主应用程序将扫描应用程序目录中的dll并检查它们(使用Reflection)根据我们的特殊Form类查找任何类,并从中提取信息以构建将调用它的菜单结构命令。
  • 当用户调用将导致表单显示的命令时,它会被创建(使用Activator.CreateInstance),从表单边框中剥离并嵌入到容器中(在我们的示例中为TabPage in一个TabControl,在您的情况下很可能是您的应用程序中的“空”MDI子表单)。

我认为这一切都很顺利(我实际上认为该框架仍在其创建的公司内维护和使用)。

您可能希望密切关注内存管理。例如,由于无法卸载程序集,因此如果需要,则需要将外部程序集加载到单独的AppDomain中。还要注意加载子窗口UI时动态附加的任何事件处理程序,以便在卸载UI时正确分离它们。

答案 2 :(得分:0)

 // using
using System.Runtime.InteropServices;<br>
using System.Threading;

//在课堂代码

 [DllImport("user32.dll")]<br>
    static extern IntPtr SetParent(IntPtr child,IntPtr parent);

//创建新流程

 Process proc;

// Start the process
proc = Process.Start("calc.exe");

proc.WaitForInputIdle();
Thread.Sleep(500);

// Set the panel control as the application's parent
SetParent(proc.MainWindowHandle, this.panel1.Handle);