Dot-Net
我可以在控制項中託管 Windows 窗體嗎
我有一個客戶,它是一個帶有有線表示邏輯的單實例模式下的 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)使用。這可能並不理想,但如果您不想為此付出更多努力,那就沒關係,就像您說的那樣。表單將適當地最大化和最小化,並且不會顯示在工作列中,並且將與它們的容器一起關閉。