我有一个客户,它在单实例模式下作为Visual Basic项目,带有有线表示逻辑。
主窗体包含一个带有多个TabPages的TabControl。 如果我单击TabPageA,另一个表单将显示在表单前面,并调整大小以与TabPage相同。
如果我点击TabPageB,则隐藏第一个表单并显示另一个表单。 所以基本上对于用户来说,看起来你有一个带有不同TabPages的TabControl,但事实并非如此。
我尝试将Forms转换为UserControls并将它们放在TabPage中,但是,由于SingleInstance应用程序,这需要进行大量的重构。我尝试了但最终因为许多运行时错误而放弃了,我不想再为此付出更多的努力。
我的想法是,在运行时,我可以将表单添加到TabPages并让它们像UserControls一样,这甚至可能吗?
答案 0 :(得分:35)
通过将FormLevel属性设置为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
答案 1 :(得分: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)
使用。这可能不太理想,但如果你不想再像这样做,那就没关系了。表格将最大化和最小化,并且不会显示在任务栏中,并将关闭其容器。
答案 2 :(得分:-1)
你可以使用面板。在每个标签中,不同的面板或面板必须显示另一个或其他必须隐藏。