2011-10-07 55 views
9

我有一個客戶,它作爲一個具有有線表示邏輯的單實例模式的Visual Basic項目。我可以在一個控件中託管一個Windows窗體嗎

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

如果我點擊TabPageB,第一個窗體被隱藏並顯示另一個窗體。 因此,基本上對於用戶來說,它看起來像一個帶有不同TabPages的TabControl,而不是這種情況。

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

我的Ideam是,在運行時,我可以將表單添加到TabPages並讓它們像UserControls一樣行事,這甚至有可能嗎?

+0

你可以嘗試抓取窗體的控制數組的副本,並將其推到另一個控件的新面板上。 – asawyer

+0

你看過MDI嗎?也許你可以用菜單項來替換標籤控件,這樣主窗口可以從菜單欄打開子窗口。 –

回答

32

您可以通過將其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 
+0

這是一個了不起的答案。而且這一次我一直在與業主一起設置並處理動作...... +5! – Ryan

+0

很好。我會試試看,但看起來很有希望。 –

+0

太棒了。謝謝。 – jww

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) 

使用。這可能並不理想,但如果你不想再付出更多的努力,就像你說的那樣。這些表格將最大化和最小化,並且不會出現在任務欄中,並將關閉它們的容器。

+1

雖然漢斯的建議對這個問題更好,但它的優點是它也可以與其他類型的窗口一起工作。 – CodesInChaos

+0

我很久以前用它來「停靠」我的第三方應用程序。在其他應用程序中注意任何「熱鍵」(在應用程序中執行功能的鍵,即使它沒有焦點)。您可能會中斷該功能。 –

-1

您可以使用面板。在每個標籤中不同的面板或面板必須顯示另一個或其他人必須隱藏。

相關問題