2011-10-07 26 views
9

Tôi có một khách hàng là một Dự án Visual Basic trong chế độ cá thể đơn lẻ với một logic trình bày có dây.Tôi có thể lưu trữ một Biểu mẫu Windows bên trong một điều khiển

Biểu mẫu chính chứa TabControl với TabPages mutliple. Nếu tôi nhấp vào TabPageA, một biểu mẫu khác sẽ hiển thị ở phía trước Biểu mẫu và được đổi kích thước để có cùng kích thước với TabPage.

Nếu tôi nhấp vào TabPageB, biểu mẫu đầu tiên sẽ bị ẩn và biểu mẫu khác được hiển thị. Vì vậy, về cơ bản cho người dùng có vẻ như bạn có một TabControl với TabPages khác nhau mà không phải là trường hợp.

Tôi đã thử chuyển đổi Biểu mẫu thành UserControl và đặt chúng bên trong TabPage, nhưng, nhờ ứng dụng SingleInstance, điều này sẽ mất rất nhiều thay đổi cấu trúc lại. Tôi đã thử nó nhưng cuối cùng đã từ bỏ vì nhiều lỗi thời gian chạy và tôi không muốn nỗ lực nhiều hơn nữa trong việc này.

Ý tưởng của tôi là, khi chạy, tôi có thể thêm biểu mẫu vào TabPages và để chúng hoạt động như UserControls, điều này thậm chí có thể?

+0

Bạn có thể thử lấy một bản sao của mảng điều khiển của biểu mẫu và đẩy nó vào một bảng điều khiển mới trên điều khiển khác có thể. – asawyer

+0

Bạn đã xem MDI chưa? Có thể bạn có thể thay thế điều khiển tab bằng các mục menu để cửa sổ chính có thể mở và mở các cửa sổ con từ thanh Menu. –

Trả lời

32

Bạn có thể chuyển lớp Biểu mẫu về điều khiển con bằng cách đặt thuộc tính TopLevel thành False. Nó về cơ bản là một UserControl với một số chi phí không sử dụng. Làm cho nó trông giống như thế này:

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

Đây là một câu trả lời tuyệt vời. Và tất cả thời gian này tôi đã thiết lập nó với chủ sở hữu và di chuyển xử lý ... +5! – Ryan

+0

Thật tuyệt. Tôi sẽ thử nó, nhưng trông có vẻ như đang xúc tiến. –

+0

Tuyệt vời. Cảm ơn. – jww

6

Bất kỳ cửa sổ nào cũng có thể được lưu trữ trong bất kỳ cửa sổ nào khác (điều khiển là cửa sổ, về mặt kỹ thuật) sử dụng SetParent.

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

End Function 

kê khai và

SetParent(FormToHost.Handle, ControlToHostForm.Handle) 

để sử dụng. Nó có thể không lý tưởng nhưng không sao nếu bạn không muốn nỗ lực nhiều hơn vào điều này, như bạn nói. Các biểu mẫu sẽ tối đa hóa và thu nhỏ đúng cách và sẽ không hiển thị trong thanh tác vụ và sẽ đóng với các vùng chứa của chúng.

+1

Trong khi đề xuất của Hans là tốt hơn cho vấn đề này, điều này có lợi thế là nó hoạt động với các loại cửa sổ khác. – CodesInChaos

+0

Tôi đã sử dụng từ lâu này để "cập nhật" ứng dụng của bên thứ 3 bên trong mỏ. Cẩn thận với bất kỳ "phím nóng" (Phím thực hiện chức năng trong ứng dụng ngay cả khi nó có chức năng tập trung) trong các ứng dụng khác. Bạn có thể phá vỡ chức năng đó. –

-1

bạn có thể sử dụng bảng. trong mỗi tab bảng hoặc bảng điều khiển khác nhau phải hiển thị bảng điều khiển hoặc bảng khác hoặc phải ẩn.

Các vấn đề liên quan