在MDI子无边框表单上添加边框

时间:2016-05-28 10:06:58

标签: vb.net

我在下面使用这种方式,将边框添加到我的所有 MDI子无边框表单...

Private Sub Form_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    If Me.WindowState = FormWindowState.Maximized Then
        Me.Padding = New Padding(0, 0, 0, 0)
        Me.BackColor = Color.FromArgb(76, 76, 76)
    Else
        Dim MF_Rect As New Rectangle(5, 5, Me.ClientSize.Width, Me.ClientSize.Height)
        Dim MF_Color = New SolidBrush(Color.FromArgb(76, 76, 76))
        e.Graphics.FillRectangle(MF_Color, MF_Rect)
        Me.Padding = New Padding(5, 5, 5, 5)
        Me.BackColor = Color.FromArgb(64, 64, 64)
    End If
End Sub

但是,如果 MDI子格式步骤 MDI父母的边框,甚至是其中的一半,然后最大化> 规范化再次,边界消失了!如果我滑动,我会再次看到它们!

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

实际上,不需要在MDI父级边框之外拖动表单来重现该行为。您需要做的就是最大化然后规范化表单。

问题是表单在调整大小后没有重新绘制。这是默认行为,它有一定程度的意义 - 客户区域中可见的部分总是可见,因此仍然(可能)正确绘制。然后,作为优化,不执行重绘。

但是这种行为对你不起作用,因为你的绘画逻辑与表格的当前大小有关。如果表单更改了其大小,则需要重新绘制以便计算新的绘制尺寸。

您可以通过强制对客户区域进行无效(并因此重新绘制)以响应resize事件来破解它。 Invalidate成员函数将执行此操作。

但有一个更好的解决方案会导致这种情况自动发生。将表单ResizeRedraw property设置为true。您可以从设计器(在“属性”窗口中)或在表单类构造函数中执行此操作。 (请注意,这完全等同于调用SetStyle成员函数并指定ControlStyles.ResizeRedraw标志。)

更好的方法是将您的边框绘制(逻辑上位于非客户区域)与您对表单的内容的绘制(这是逻辑客户区域)分开)。我不会在这个答案中讨论如何做到这一点,但你可以在网上找到其他地方的讨论和各种教程。例如,Drawing Custom Borders in Windows Forms。本文实际上是为您实现此效果的较大library的一部分。不确定该库如何与MDI子项一起使用。 MDI效果已被弃用许多年......