使表单在屏幕或父级上居中

问题描述 投票:0回答:6

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

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

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

如何让这个子将表单正确放置在屏幕或其他表单(如果定义)的中间?

vb.net
6个回答
49
投票

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

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
    

28
投票
代码是错误的。同样重要的是,这段代码运行得足够晚,构造函数太早了。请务必从 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 事件处理程序的极少数原因之一。


11
投票
这也可能有用:

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

您还可以使用 FormStartPosition.CenterScreen


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
    

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
    

0
投票
如果表单是子表单并使用 From.show 方法显示,则 Hans Passant 的回答工作正常,但如果表单不是子表单并使用 showasdialog() 显示,则该中心屏幕子例程不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.