2014-01-09 9 views
0

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

+0

Я не думаю, что это возможно. Родитель MDI и ребенок находятся в другом отношении, ребенок не должен реагировать на размер родителя каким-либо образом, если ребенок не застыл/не был максимизирован. – Neolisk

+0

, так что это означает, что я не могу изменить размер дочерней формы программно? я надеялся получить размер родительской формы при каждом изменении размера, а затем приравнять ее к размеру дочерней формы. –

+0

Вы * можете * сделать это, но это не значит, что вам нужно. Есть определенные ожидания, которые пользователь имеет при работе с интерфейсом MDI. Один из них - это то, что я описал. – Neolisk

ответ

0

См. Ниже - краткую версию, которую я написал, которая, как представляется, обрабатывает большинство сценариев привязки. Возможно, вам придется немного отполировать этот код. Но это должно вам начать работу:

Imports System.ComponentModel 

Public Class MDIChildForm 
    Dim p_eMyAnchor As AnchorStyles 
    Dim p_mdiParent As Form 

    Dim p_iOldHeight, p_iOldWidth As Integer 

    <DefaultValue(AnchorStyles.Left Or AnchorStyles.Top)> 
    Public Property MyAnchor As AnchorStyles 
    Get 
     Return p_eMyAnchor 
    End Get 
    Set(value As AnchorStyles) 
     p_eMyAnchor = value 
     chkAnchorTop.Checked = (p_eMyAnchor And AnchorStyles.Top) 
     chkAnchorLeft.Checked = (p_eMyAnchor And AnchorStyles.Left) 
     chkAnchorRight.Checked = (p_eMyAnchor And AnchorStyles.Right) 
     chkAnchorBottom.Checked = (p_eMyAnchor And AnchorStyles.Bottom) 
    End Set 
    End Property 

    Sub New() 
    ' This call is required by the designer. 
    InitializeComponent() 

    ' Add any initialization after the InitializeComponent() call. 
    p_eMyAnchor = AnchorStyles.Left Or AnchorStyles.Top 
    End Sub 

    Public Sub ShowAsMDIChild(mdiParent As Form) 
    p_mdiParent = mdiParent 
    Me.MdiParent = mdiParent 
    AddHandler mdiParent.ResizeBegin, AddressOf MDIParentForm_ResizeBegin 
    AddHandler mdiParent.ResizeEnd, AddressOf MDIParentForm_ResizeEnd 
    Me.Show() 
    End Sub 

    Private Sub MDIParentForm_ResizeBegin(sender As Object, e As EventArgs) 
    Dim frm As Form = DirectCast(sender, Form) 
    p_iOldWidth = frm.Width 
    p_iOldHeight = frm.Height 
    End Sub 

    Private Sub MDIParentForm_ResizeEnd(sender As Object, e As EventArgs) 
    Dim parentForm As Form = DirectCast(sender, Form) 

    'handling for horizontal anchoring 
    Dim deltaWidth As Integer = parentForm.Width - p_iOldWidth 
    Dim fAnchorLeft As Boolean = p_eMyAnchor And AnchorStyles.Left 
    Dim fAnchorRight As Boolean = p_eMyAnchor And AnchorStyles.Right 

    Select Case fAnchorLeft 
     Case True : If fAnchorRight Then Me.Width += deltaWidth 
     Case False 
     Dim coef As Single = If(fAnchorRight, 1, 0.5) 
     Me.Left += deltaWidth * coef 
    End Select 

    'handling for vertical anchoring 
    Dim deltaHeight As Integer = parentForm.Height - p_iOldHeight 
    Dim fAnchorTop As Boolean = p_eMyAnchor And AnchorStyles.Top 
    Dim fAnchorBottom As Boolean = p_eMyAnchor And AnchorStyles.Bottom 

    Select Case fAnchorTop 
     Case True : If fAnchorBottom Then Me.Height += deltaHeight 
     Case False 
     Dim coef As Single = If(fAnchorBottom, 1, 0.5) 
     Me.Top += deltaHeight * coef 
    End Select 
    End Sub 

End Class 

Для горизонтальной анкеровки, используются следующие правила:

  • левого - ничего не происходит (поведение по умолчанию)
  • слева и справа - расширение ширины к исходной форме ширина delta
  • правый - перемещение влево по размеру родительской формы delta
  • no anchor - перемещение влево на половину родительской формы ширина delta.

Тот же принцип применяется к вертикальному креплению, соответственно сверху и снизу.

Вы можете получить полный проект, чтобы играть с here (Mediafire).

Смежные вопросы