2

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

将DrawToBitmap与控件一起使用的一个问题是:

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

症状: 表格 A 上有控件 B 和控件 C。如果在 Form A 上调用DrawToBitmap时 Control B 在 Control C 前面,它会先绘制 Control B 然后再绘制 Control C。由于 Control C 是在 Control B 之上绘制的,因此生成的位图看起来像 Control C 在前面控制 B。

我目前的计划是:

  1. 调用SuspendLayout
  2. 递归反转窗体上所有控件的 Z-Order
  3. 调用ResumeLayout
  4. 调用DrawToBitmap,它将创建一个显示正确顺序的图像
  5. 再次执行步骤 1、2 和 3,将所有内容恢复到原来的状态。

那个听起来是对的吗?

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

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

4

1 回答 1

1

试试这个:

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

然后再次运行同样的事情,将其恢复:

如果您的表单上有嵌套控件,您可能希望将此树线性化为一个数组,以便于处理(即不需要递归)。

于 2012-10-25T17:39:15.607 回答