10

由于 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

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

4

5 回答 5

37

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

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
于 2015-05-12T18:46:17.850 回答
24

代码是错误的。这段代码运行得足够晚也很重要,构造函数太早了。一定要从 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 事件处理程序的少数原因之一。

于 2013-10-15T22:39:45.730 回答
8

这也可能有用:

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

您也可以使用 FormStartPosition.CenterScreen

于 2014-09-30T17:21:44.120 回答
0

我遇到了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
于 2016-09-17T14:09:38.647 回答
0

我今天正在为此苦苦挣扎。看了文档,了解到1.不能调用CenterToParent方法,2.需要设置表单的.StartingPosition属性,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
于 2021-05-11T10:14:18.053 回答