2014-01-09 29 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。

相同的原則適用於垂直錨定,分別爲頂部和底部。

你可以得到完整的項目與here (Mediafire)玩。