【发布时间】: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 前面。
我目前的计划是:
- 调用SuspendLayout
- 递归反转窗体上所有控件的 Z 顺序
- 调用ResumeLayout
- 调用DrawToBitmap,这将创建一个显示正确顺序的图像
- 再次执行第 1 步、第 2 步和第 3 步,将所有内容恢复到原来的状态。
这听起来对吗?
我很确定我可以使用 ctrl.Parent.Controls.GetChildIndex(ctrl) 来获取当前的 Z-Order 索引,然后使用 SetChildIndex进行类似的调用> 将其设置为新值。
现在我正在寻找可以帮助我以尽可能高效的方式完成重新排序部分的代码示例。
【问题讨论】:
-
我不认为将表单上所有控件的 z-order 反转并返回,一开始是有效的。
-
@Neolisk,那么你建议如何完成这个?目标是使控件的图像(在本例中为表单)与用户可见的图像相匹配。只需正常调用 DrawToBitmap 而无需重新排序,就会在图像中显示设计元素(通常不会被用户注意到或隐藏),通常会与其他相关/重要的表单内容重叠。
-
您能否用它现在的外观(即没有重新排序)以及您希望它的外观更新您的问题?我无法想象您的评论。 :) 另外,不清楚您的最终目标 - 您是否要截取表格的屏幕截图?
-
你不能直接否定所有的 z 顺序吗?
-
@SimonMourier: ArgumentOutOfRangeException - 索引超出范围。必须是非负数且小于集合的大小。