Dot-Net

我可以在控制項中託管 Windows 窗體嗎

  • October 7, 2011

我有一個客戶,它是一個帶有有線表示邏輯的單實例模式下的 Visual Basic 項目。

主窗體包含一個帶有多個 TabPages 的 TabControl。如果我點擊 TabPageA 另一個表單將顯示在表單前面,並調整大小以與 TabPage 具有相同的大小。

如果我點擊 TabPageB,第一個表單將被隱藏並顯示另一個表單。所以基本上對於使用者來說,看起來你有一個帶有不同 TabPages 的 TabControl,但事實並非如此。

我嘗試將 Forms 轉換為 UserControls 並將它們放在 TabPage 中,但是,由於 SingleInstance 應用程序,這需要大量的重構。我試過了,但最終因為許多執行時錯誤而放棄了,我不想再為此付出更多的努力。

我的想法是,在執行時,我可以將表單添加到 TabPages 並讓它們像 UserControls 一樣工作,這甚至可能嗎?

您可以通過將 Form 類的 TopLevel 屬性設置為 False 將其轉回子控制項。它本質上變成了一個帶有一些未使用成本的 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

任何視窗都可以使用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)

使用。這可能並不理想,但如果您不想為此付出更多努力,那就沒關係,就像您說的那樣。表單將適當地最大化和最小化,並且不會顯示在工作列中,並且將與它們的容器一起關閉。

引用自:https://stackoverflow.com/questions/7691468