2011-10-07 12 views
9

私は、Visual Basicプロジェクトとして、単一インスタンスモードで有線プレゼンテーションロジックを持つ顧客を持っています。コントロール内にWindowsフォームをホストすることができます

メインフォームには、複数のTabPagesを含むTabControlが含まれています。 TabPageAをクリックすると、フォームの前に別のフォームが表示され、TabPageと同じサイズにサイズが変更されます。

TabPageBをクリックすると、最初のフォームが非表示になり、別のフォームが表示されます。 基本的にユーザーにとって、違うTabPagesのTabControlがあるようです。

フォームをUserControlsに変換してTabPage内に配置しようとしましたが、SingleInstanceアプリケーションのおかげで、これは多くのリファクタリングを必要とします。私はそれを試しましたが、多くの多くのランタイムエラーのために最終的に断念し、私はこれ以上の努力をしたくありません。

私のIdeamは、実行時にフォームをTabPageに追加して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を使用すると、他のウィンドウでウィンドウをホストすることができます(技術的にはコントロールはウィンドウです)。使用することを宣言し、

SetParent(FormToHost.Handle, ControlToHostForm.Handle) 

する

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

End Function 

。理想的ではないかもしれませんが、あなたが言うように、これ以上の努力をしたくない場合は大丈夫です。フォームは最大限に最大化され、最小化され、タスクバーには表示されず、コンテナで閉じられます。

+1

Hansの提案はこの問題の方が優れていますが、これは他の種類のウィンドウでも機能するという利点があります。 – CodesInChaos

+0

私はこの昔、私の中にサードパーティのアプリケーションを「ドッキング」しました。他のアプリでは、「ホットキー」(フォーカスを持っていても機能を実行するキー)機能に注意してください。あなたはその機能を壊すかもしれません。 –

-1

パネルを使用できます。それぞれのタブで別のパネルまたはパネルが表示されている必要があります。

関連する問題