由于 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
如何让这个子将表单正确放置在屏幕或其他表单(如果定义)的中间?
我知道这是一篇旧帖子,这并不能直接回答问题,但对于偶然发现此线程的其他人来说,可以简单地完成居中表单,而无需您编写自己的程序。
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
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 事件处理程序的极少数原因之一。
myForm.StartPosition = FormStartPosition.CenterParent
myForm.ShowDialog()
您还可以使用 FormStartPosition.CenterScreen
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
你不能调用 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