【问题标题】:How can I remove the double form title bar?如何删除双表单标题栏?
【发布时间】:2020-03-16 23:38:01
【问题描述】:

我有一个 mdi 容器表单,当它在里面打开一个孩子时,我会看到这个带有另一组关闭/最小化/最大化按钮和表单图标的双标题栏。我怎样才能摆脱它?我尝试将Control 设置为false,但它不起作用。 FormBorderStylenone 也不起作用,它会使子窗体变形。

另外,我有一个包含一些按钮的工具条,它的底部有一条恼人的边框线(查看我画的蓝色箭头)。我怎样才能禁用它呢?

【问题讨论】:

  • 这就是 MDI 的工作原理。这些按钮允许在父窗口中控制子窗口。如果您不希望这种行为,请不要使用 MDI。
  • 在子Form Resize 事件中,您可以BeginInvoke() 它的MdiParent 并删除其MainMenuStrip 中的第一个项目(在子Form 最大化后-这就是您需要BeginInvoke() 的原因-,第一个 MenuStrip 项是子窗体 SystemMenu 图标)。您将不会再在最左侧看到图标。其他按钮最好留在原处,但现在 MenuStrip 看起来不像另一个 TitleBar。也许就够了。
  • 当然,在Resize事件中,需要检查Child Form是否WindowState = FormWindowState.Maximized,否则会从MdiParent的MenuStrip中移除所有菜单:)

标签: vb.net


【解决方案1】:

第一部分


对于您问题的第一部分,@RezaAghaei 先生发布的解决方法here 可能是答案。这是 VB.NET 版本:

Public Class YourParentForm

    'Or drop one in the designer...
    Private ReadOnly ContainerPanel As Panel

    Sub New()
        InitializeComponent()

        IsMdiContainer = False
        ContainerPanel = New Panel With {.Dock = DockStyle.Fill}
        Controls.Add(ContainerPanel)
    End Sub

End Class

以及创建子表单的位置:

Dim f As New ChildForm With
    {
    .FormBorderStyle = FormBorderStyle.None,
    .TopLevel = False,
    .ControlBox = False,
    .Dock = DockStyle.Fill,
    }
ContainerPanel.Controls.Add(f)
f.Show()

由于最后插入到集合中的控件首先停靠,因此您需要显式设置控件的顺序以避免任何可能的停靠重叠。因此,正如您在评论中注意到并提到的那样,Dock.Fill 表单与Dock.Top 标签重叠。要解决这个问题:

Dim f As New ChildForm With
{
.FormBorderStyle = FormBorderStyle.None,
.TopLevel = False,
.ControlBox = False,
.Dock = DockStyle.Fill
}
ContainerPanel.Controls.Add(f)
Controls.SetChildIndex(ContainerPanel, 0)
Controls.SetChildIndex(Label1, 1)
f.Show()

其实你可以省略Controls.SetChildIndex(Label1, 1),只是为了澄清思路而添加的。

如果您使用设计器添加ContainerPanel,选择它并右键单击,您将在上下文菜单中看到Bring to FrontSend to Back,它们用于执行相同的操作。此外,您可以使用 Document Outline 窗口(Ctrl + T 显示它)来更改顺序控件使用上/下箭头和左/右箭头将控件移动到不同的容器。

第二部分


至于第二部分,需要新建一个继承ProfessionalColorTable的类,并覆盖ToolStripBorder属性,防止它在渲染ToolStrip时返回默认颜色:

Public Class CustomColorTable
    Inherits ProfessionalColorTable

    Public Overrides ReadOnly Property ToolStripBorder As Color
        Get
            Return Color.Empty
        End Get
    End Property
End Class

然后,将自定义颜色表传递给ToolStripProfessionalRenderer 类的新实例,并将其分配给ToolStrip.RendererToolStripManager.Renderer 属性。

重访父Form的构造函数:

Sub New()
    InitializeComponent()

    ContainerPanel = New Panel With {.Dock = DockStyle.Fill}
    Controls.Add(ContainerPanel)

    ToolStrip1.Renderer = New ToolStripProfessionalRenderer(New CustomColorTable) With {
        .RoundedEdges = False
    }

    'Or
    'ToolStripManager.Renderer = New ToolStripProfessionalRenderer(New CustomColorTable) With {
    '    .RoundedEdges = False
    '}
End Sub

【讨论】:

  • 感谢您的回复!对于问题的第一部分:您给我的解决方案有效。标题栏消失了,但您可以在我的图片中看到的标签(在按钮下方,上面写着“Cear client”)被隐藏,工具条覆盖了它。你知道我该如何解决这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
相关资源
最近更新 更多