【问题标题】:Center form on screen or on parent在屏幕上或父母上居中表格
【发布时间】:2021-05-11 18:14:18
【问题描述】:

由于在 VB.NET 中定位表单的内置功能并不总是适合使用,我尝试让我的 sub 来做到这一点。

但我错过了一些东西......

Public Sub form_center(ByVal frm As Form, Optional ByVal parent As Form = Nothing)

    Dim x As Integer
    Dim y As Integer
    Dim r As Rectangle

    If Not parent Is Nothing Then
        r = parent.ClientRectangle
        x = r.Width - frm.Width + parent.Left
        y = r.Height - frm.Height + parent.Top
    Else
        r = Screen.PrimaryScreen.WorkingArea
        x = r.Width - frm.Width
        y = r.Height - frm.Height
    End If

    x = CInt(x / 2)
    y = CInt(y / 2)

    frm.StartPosition = FormStartPosition.Manual
    frm.Location = New Point(x, y)
End Sub

如果已定义,如何让这个 sub 将表单正确放置在屏幕中间或其他表单中?

【问题讨论】:

  • 这比原生的 CenterScreen 或 CenterParent 更合适或更容易吗?您需要检查父表单实际上是否大于您尝试显示的表单...
  • 这是合适的,因为我可以将表单放置在 _Load 处理程序或更高版本中,并且我没有考虑将开始位置设置为“手动”。
  • 另外,父表单不应该是真正的父表单,可以是任何类型的表单!

标签: vb.net


【解决方案1】:

我知道这是一篇旧帖子,这并不能直接回答问题,但对于偶然发现此线程的任何其他人,可以简单地完成表格居中,而无需您编写自己的程序。

System.Windows.Forms.Form.CenterToScreen()System.Windows.Forms.Form.CenterToParent() 允许您根据需要将表单相对于屏幕或父表单居中.

需要注意的是,这些过程必须在表单加载之前调用。最好在 form_load 事件处理程序中调用它们。

示例代码:

  Private Sub Settings_Load(sender As Object, e As EventArgs) Handles Me.Load

    Me.CenterToScreen()

    'or you can use 

    Me.CenterToParent()

End Sub

【讨论】:

  • 我试图做和 OP 一样的事情,结果发现了这个。完美运行。
  • 更干净、更轻松、更快捷。工作 gr8t!
  • 太棒了!完美运行!
【解决方案2】:

代码是错误的。这段代码运行得足够晚也很重要,构造函数太早了。一定要从 Load 事件中调用它,那时表单会根据用户的偏好进行适当的自动缩放和调整,此时 StartPosition 属性不再重要。修复:

Public Shared Sub CenterForm(ByVal frm As Form, Optional ByVal parent As Form = Nothing)
    '' Note: call this from frm's Load event!
    Dim r As Rectangle
    If parent IsNot Nothing Then
        r = parent.RectangleToScreen(parent.ClientRectangle)
    Else
        r = Screen.FromPoint(frm.Location).WorkingArea
    End If

    Dim x = r.Left + (r.Width - frm.Width) \ 2
    Dim y = r.Top + (r.Height - frm.Height) \ 2
    frm.Location = New Point(x, y)
End Sub

顺便说一下,实际实现 Load 事件处理程序的少数原因之一。

【讨论】:

  • 嗨,汉斯。此代码将表单居中于屏幕,但不正确地居中于“父”表单。 form_center(Me, Me.Owner) 将新表单放置在 Owner 的左侧和上方。
  • 是的,这正是应该的。非常感谢。
【解决方案3】:

这也可能有用:

    myForm.StartPosition = FormStartPosition.CenterParent
    myForm.ShowDialog()

您也可以使用 FormStartPosition.CenterScreen

【讨论】:

    【解决方案4】:

    我遇到了StartPosition = CenterParent 无法正常工作的问题。我解决了它用.ShowDialog()而不是.Show()调用表单:

    ' first you should set your form's Start Position as Center Parent
    Private Sub button_Click(sender As Object, e As EventArgs) Handles button.Click
        MyForm.ShowDialog()
    End Sub
    

    【讨论】:

      【解决方案5】:

      我今天为此苦苦挣扎。阅读文档后,我了解到 1.that you cannot call the CenterToParent method、2.that you need to set the .StartingPosition Property of the form、3.“该属性应在窗体显示之前设置,您可以在调用 Show 或 ShowDialog 方法之前设置该属性”。 那我是怎么修的。就是将代码放入实例化子窗体的子窗体中,在父窗体上,如下所示。

      Private Sub btnItemCategories_Click(sender As Object, e As EventArgs) Handles btnItemCategories.Click
          Dim objItemCategories As New frmItemCategories
          objItemCategories.StartPosition = FormStartPosition.CenterParent
          objItemCategories.ShowDialog(Me)
      End Sub
      

      【讨论】:

        猜你喜欢
        • 2018-01-29
        • 1970-01-01
        • 2014-03-24
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        • 2011-05-03
        相关资源
        最近更新 更多