Vb.net 儿童级联

Vb.net 儿童级联,vb.net,winforms,linq,Vb.net,Winforms,Linq,我正在尝试为加载的子窗口执行窗口级联。我无法使用LayoutMdi,因为它会更改子窗体的大小 我可以使用父对象的子对象来执行此操作 Dim i As Integer For Each frm As Form In Me.MdiChildren frm.Location = New Point(i, i) frm.BringToFront() i += 30 Next 但该顺序是由加载顺序决定的。我可以按打开的窗口顶部排序,

我正在尝试为加载的子窗口执行窗口级联。我无法使用LayoutMdi,因为它会更改子窗体的大小

我可以使用父对象的子对象来执行此操作

    Dim i As Integer
    For Each frm As Form In Me.MdiChildren
        frm.Location = New Point(i, i)
        frm.BringToFront()
        i += 30
    Next
但该顺序是由加载顺序决定的。我可以按打开的窗口顶部排序,但我更愿意按Z顺序排序。如何确定窗体在给定父级中的Z顺序

同样问题的另一个关口-尝试获得排序的“列表”另一个数据结构可能更好?或按排序的表格。顶部:

    Dim childForms As New List(Of Form)
    For Each frm As Form In Me.MdiChildren
        childForms.Add(frm)
    Next
    Dim sortedChildForms As Form() =
        From entry In childForms
        Order By DirectCast(entry.Top, Integer)
        Ascending Select entry
我在Linq完全是个新手,所以我真的不知道我在这里做什么。DirectCast失败,因为不支持Int到Int。我尝试使用Order by entry.Top,但失败的原因是:

    System.InvalidCastException was unhandled
    Message=Unable to cast object of type 
     WhereSelectEnumerableIterator`2[System.Windows.Forms.Form,
     System.Windows.Forms.Form]' 
     to type 'System.Windows.Forms.Form[]'.
所以有两个问题:我可以得到MdiChild表单的ZOrder吗?我如何按照.Top或.Z对结果“list”进行排序


请不要使用C语言的答案,因为在这种情况下,它们不能很好地自动转换为VB.Net。

这需要pinvoke,您必须使用以Z顺序枚举子项。基本方案是查找最后一个MDI子窗口,即底部的窗口,然后向上搜索。该代码运行良好:

Private Sub CascadeButton_Click(sender As Object, e As EventArgs) Handles CascadeButton.Click
    Dim pos As Integer = 0
    If Me.MdiChildren.Count = 0 Then Exit Sub
    '' Find the child on the bottom
    Dim child = GetWindow(Me.MdiChildren(0).Handle, GW_HWNDLAST)
    Do While child <> IntPtr.Zero
        Form.FromHandle(child).Location = New Point(pos, pos)
        pos += 30
        '' Find the next on above it
        child = GetWindow(child, GW_HWNDPREV)
    Loop
End Sub

Private Const GW_HWNDLAST As Integer = 1
Private Const GW_HWNDPREV As Integer = 3
Private Declare Function GetWindow Lib "User32.dll" (hwnd As IntPtr, cmd As Integer) As IntPtr

在按钮单击事件上使用以下代码:Me.layoutdisystem.Windows.Forms.mdiloayout.Cascade:OP-Cascade中的第二句话更改显示的表单大小,我不想这样做。