Vb.net 儿童级联
我正在尝试为加载的子窗口执行窗口级联。我无法使用LayoutMdi,因为它会更改子窗体的大小 我可以使用父对象的子对象来执行此操作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 但该顺序是由加载顺序决定的。我可以按打开的窗口顶部排序,
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中的第二句话更改显示的表单大小,我不想这样做。