2013-10-15 2 views
7

Поскольку встроенная функциональность для позиционирования форм в 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 

Как получить этот подпункт, чтобы правильно поставить форму в середине экрана или в другой форме, если она определена?

+2

, как это то, что больше подходит или проще, чем родной CenterScreen или CenterParent? Вам нужно проверить, что родительская форма на самом деле больше, чем форма, которую вы пытаетесь показать ... – Plutonix

+0

Это подходит, потому что я могу разместить форму для размещения в обработчике _Load или позже, и я не должен думать о настройке стартовой позиции для "Руководство". –

+0

Кроме того, родительская форма не должна быть настоящим родителем, может быть любой формы! –

ответ

15

Код просто неправильный. Также очень важно, чтобы этот код работал достаточно поздно, конструктор слишком рано. Обязательно вызовите его из события «Загрузить», в то время форма правильно автоматически масштабируется и корректируется для предпочтений пользователя, свойство StartPosition больше не имеет значения. Fix:

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.

+0

Привет Ханс. Этот код центрирует форму на экране, но не соответствует «родительской» форме. form_center (Me, Me.Owner) помещает новую форму слишком левую и тоже от владельца. –

+0

ClientRectangle неверен, исправлен. –

+0

Да, это именно то, что должно быть. Большое спасибо. –

4

Это также может быть полезным:

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

Вы можете также использовать FormStartPosition.CenterScreen

20

Я знаю, что это старый пост, и это не сразу ответить на этот вопрос, но для кого-то еще который натыкается на эту нить, центрирование формы может быть сделано просто, не требуя от вас написать свою собственную процедуру.

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 
+0

Я пытался сделать то же самое, что и OP, и нашел это. Работала отлично. –

+0

Чище, проще и быстрее. Работы gr8t! –

+0

УДИВИТЕЛЬНЫЙ! Отлично! –

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 
Смежные вопросы