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

Jür*_*ock 11 .net vb.net user-controls winforms

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

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

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

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

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

Han*_*ant 36

您可以通过将其TopLevel属性设置为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
Run Code Online (Sandbox Code Playgroud)


Ry-*_*Ry- 6

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

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

End Function
Run Code Online (Sandbox Code Playgroud)

宣布和

SetParent(FormToHost.Handle, ControlToHostForm.Handle)
Run Code Online (Sandbox Code Playgroud)

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