【问题标题】:Reversing the Z-Order of all controls on a form反转窗体上所有控件的 Z 顺序
【发布时间】:2012-10-25 14:01:39
【问题描述】:

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

一个 issue 使用 DrawToBitmap 和一个控件是:

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

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

我目前的计划是:

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

这听起来对吗?

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

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

【问题讨论】:

  • 我不认为将表单上所有控件的 z-order 反转并返回,一开始是有效的。
  • @Neolisk,那么你建议如何完成这个?目标是使控件的图像(在本例中为表单)与用户可见的图像相匹配。只需正常调用 DrawToBitmap 而无需重新排序,就会在图像中显示设计元素(通常不会被用户注意到或隐藏),通常会与其他相关/重要的表单内容重叠。
  • 您能否用它现在的外观(即没有重新排序)以及您希望它的外观更新您的问题?我无法想象您的评论。 :) 另外,不清楚您的最终目标 - 您是否要截取表格的屏幕截图?
  • 你不能直接否定所有的 z 顺序吗?
  • @SimonMourier: ArgumentOutOfRangeException - 索引超出范围。必须是非负数且小于集合的大小。

标签: .net winforms z-order


【解决方案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,以便于处理(即不需要递归)。

【讨论】:

  • 除非 Controls 集合本身是按 z 顺序排序的,否则这似乎不起作用。假设 Control B 在 Control A 的前面,Control A 在 Control C 的前面。上面的代码中没有任何内容可以确保 Control B 被发送到后面,然后是 Control A,然后是 Control C(这将是反向 Z 顺序) .
  • 当我将“我”引用更改为对控件所在表单本身的引用时,会导致编译错误:“OrderBy”不是“System.Windows.Forms 的成员” .Control.ControlCollection' 如果我将其保留为“我”,则错误是因为“控件”不是调用我的代码的类中的成员。
  • @KevinFairchild:你确定你的引用中有System.Linq 吗?从技术上讲,OrderBy 不是System.Windows.Forms.Control.ControlCollection 的成员 - 它是一种扩展方法,适用于任何 IEnumerable。您使用的是哪个框架版本?你能在Strings 的数组上做OrderBy 吗?
  • 我有那个类的“Imports System.Linq”,但就是这样。是的,不过,我可以对字符串数组执行 OrderBy。
  • @Kevin:是的,抱歉——刚刚测试并得到了同样的错误。请查看我的另一个编辑,注意 .OfType(Of Control) 已添加。
猜你喜欢
  • 2022-11-30
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 2020-10-07
  • 2010-09-21
相关资源
最近更新 更多