我可以在控件中托管Windows窗体

时间:2011-10-07 18:36:07

标签: .net vb.net winforms user-controls

我有一个客户,它在单实例模式下作为Visual Basic项目,带有有线表示逻辑。

主窗体包含一个带有多个TabPages的TabControl。 如果我单击TabPageA,另一个表单将显示在表单前面,并调整大小以与TabPage相同。

如果我点击TabPageB,则隐藏第一个表单并显示另一个表单。 所以基本上对于用户来说,看起来你有一个带有不同TabPages的TabControl,但事实并非如此。

我尝试将Forms转换为UserControls并将它们放在TabPage中,但是,由于SingleInstance应用程序,这需要进行大量的重构。我尝试了但最终因为许多运行时错误而放弃了,我不想再为此付出更多的努力。

我的想法是,在运行时,我可以将表单添加到TabPages并让它们像UserControls一样,这甚至可能吗?

3 个答案:

答案 0 :(得分:35)

通过将FormLevel属性设置为False,可以将Form类重新转换为子控件。它本质上变成了一个带有一些未使用开销的UserControl。使它看起来类似于:

Public Class Form1
    Public Sub New()
        InitializeComponent()
        Dim frm As New Form2
        frm.TopLevel = False
        frm.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        frm.Visible = True
        frm.Dock = DockStyle.Fill
        TabPage1.Controls.Add(frm)
    End Sub
End Class

答案 1 :(得分:6)

任何窗口都可以使用SetParent托管在任何其他窗口(控件是一个窗口,技术上)。

<System.Runtime.InteropServices.DllImport("user32.dll")>
Public Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr

End Function

宣布和

SetParent(FormToHost.Handle, ControlToHostForm.Handle)

使用。这可能不太理想,但如果你不想再像这样做,那就没关系了。表格将最大化和最小化,并且不会显示在任务栏中,并将关闭其容器。

答案 2 :(得分:-1)

你可以使用面板。在每个标签中,不同的面板或面板必须显示另一个或其他必须隐藏。