反转表单上所有控件的Z顺序

时间:2012-10-25 14:01:39

标签: .net winforms z-order

我正在尝试制作在应用程序中打开的某些表单的屏幕截图。这些表格可能被其他开放表格覆盖/遮盖。使用CopyFromScreen是不实际的。在表单级别使用 DrawToBitmap 让我非常接近我想要的位置。

使用带控件的 DrawToBitmap 的一个issue是:

  

内部容器的控件以相反的顺序呈现。

症状: 表格A上有控制B和控制C.如果在窗体A上调用 DrawToBitmap 时控件B位于控件C的前面,它将首先绘制控件B然后绘制控件C.由于控件C是在控件B的顶部绘制的,因此生成的位图看起来Control C就在Control B的前面。

我目前的计划是:

  1. 致电 SuspendLayout
  2. 递归地反转表格
  3. 上所有控件的Z顺序
  4. 致电 ResumeLayout
  5. 调用 DrawToBitmap ,这将创建一个显示正确顺序的图像
  6. 再次执行步骤1,2和3,使所有内容恢复原状。
  7. 这听起来是对的吗?

    我很确定我可以使用 ctrl.Parent.Controls.GetChildIndex(ctrl)来获取当前的Z-Order索引,然后使用 SetChildIndex 将其设置为新值。

    现在我正在寻找可能帮助我以尽可能高效的方式完成重新订购部分的代码示例。

1 个答案:

答案 0 :(得分:1)

试试这个:

For Each ctl As Control In Me.Controls.OfType(Of Control).OrderBy(Function(c) Me.Controls.GetChildIndex(c))
  ctl.BringToFront()
Next

然后再次运行相同的东西,将其还原:

如果表单上有嵌套控件,则可能需要linearise this tree into an array,以便于处理(即不需要递归)。