【发布时间】:2011-04-03 16:13:44
【问题描述】:
场景
这是一个非 MDI 窗口应用程序。 我有一个主窗体,其中包含一个名为 Panel1 的面板和两个按钮 btnForm1 和 btnForm2。单击 btnForm1 和 btnForm2 在 Panel1 中分别打开 Form1 和 Form2。在 Panel1 中打开表单之前,会清除 Panel1 中所有打开的表单。代码如下:
Private objForm1 As Form1
Private Sub btnForm1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnForm1.Click
objForm1 = New Form1
objForm1.FormBorderStyle = Windows.Forms.FormBorderStyle.None
objForm1.TopLevel = False
objForm1.Dock = DockStyle.Fill
Panel1.Controls.Clear
Panel1.Controls.Add(objForm1)
objForm1.Show()
End Sub
Private Sub btnForm2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnForm2.Click
Dim objForm2 As New Form1
objForm2.FormBorderStyle = Windows.Forms.FormBorderStyle.None
objForm2.TopLevel = False
objForm2.Dock = DockStyle.Fill
Panel1.Controls.Clear
Panel1.Controls.Add(objForm2)
objForm2.Show()
End Sub
在 Form1 中有一个按钮 btnForm3,它在 Form2 上方的 frmHome.Panel1 中打开 Form3,而不清除 Panel1 中的任何现有表单。这不是由 btnForm3_Click 事件直接完成的,而是在 btnForm3_Click 中引发在此表单中声明的朋友事件,该事件在 frmHome 中处理。 frmHome 中处理它的代码如下:
Private Sub objForm1_LoadForm3InHome() Handles objForm1.LoadSubForm3InHome
Dim objForm3 As New Form3
objForm3.FormBorderStyle = Windows.Forms.FormBorderStyle.None
objForm3.TopLevel = False
objForm3.Dock = DockStyle.Fill
Panel1.Controls.Add(objForm3)
objForm3.Show()
objForm3.BringToFront()
End Sub
所有四个表单的工具条按钮中都有添加、编辑和删除按钮,这些按钮对所有表单都是通用的。他们的菜单项中也有文件菜单。
目标
将frmHome.Panel1中当前活动窗体的菜单和工具条合并到frmHome的菜单和工具条中。将frmHome.Panel1中当前活动窗体的菜单和工具条从frmHome的菜单和工具条中取消合并 面板被停用。这可以通过在将在 frmHome.Panel1 中打开的表单中包含以下行来处理:
合并
ToolStripManager.Merge(Me.MenuStrip1, frmHome.MenuStrip1)
ToolStripManager.Merge(Me.ToolStrip1, frmHome.ToolStrip1)
取消合并
ToolStripManager.RevertMerge(frmHome.MenuStrip1)
ToolStripManager.RevertMerge(frmHome.ToolStrip1)
问题
以上几行应该写在哪些事件中? 在 MDI 应用程序中,这可以通过将它们分别包含在 Form_Activated 和 Form_Deactivate 事件中来完成。但是,当您在 frmHome.Panel1 中打开表单时,Activated 和 Deactivate 事件都不会触发。您可以使用 Form_Load 和 Form_FormClosed 事件代替 Activated 和 Deactivate,但它们只会在现有表单在面板中打开新表单之前关闭时合并/取消合并菜单。但由于我有时需要打开和关闭表单以保持现有表单处于打开状态,因此使用这些事件将无法完成任务。甚至 GotFocus 和 LostFocus 事件也不起作用。所以我希望激活和停用事件被触发,或者当表单获得/失去焦点时,菜单和工具条可以通过其他方式合并/取消合并。这真让我抓狂。我根本找不到出路。请帮忙。问候。
【问题讨论】:
-
这个问题看起来已经回答了。你还需要什么?
标签: .net vb.net winforms .net-4.0