Winforms绘画是同步还是异步?

时间:2012-01-19 00:16:35

标签: c# .net screenshot

我有一个有三个面板的表格。顶部面板包含列表框,中间面板包含网格,底部面板包含网格。我需要截取底部网格的截图,但有时网格中有更多行,您需要滚动查看每一行。我想在截取屏幕截图之前将底部网格设置为表单的大小,并且可以通过将两个顶部面板的.Visible设置为false来实现此目的。我的问题是截图是在表单重新绘制之前拍摄的,以将网格显示为表单的大小。在执行代码以截取屏幕截图之前,如何保证表单已重新绘制/重新绘制?

我正在使用Capture screenshot of active window?中ArsenMkrt的答案来截取屏幕截图。

编辑:网格是Infragistics UltraGrid。

3 个答案:

答案 0 :(得分:3)

调用表单的Update()方法。如果有任何待处理的涂料,那么您可以确定它们将被执行并且表格已完全绘制。绝对是这里的情况,隐藏面板需要表单重绘其背景。

这仅适用于您自己的表单,而不适用于其他进程拥有的窗口。使用表单的DrawToBitmap()方法通常也可以工作(不需要同步),但并非所有子控件都支持它。值得注意的是,RichTextBox和WebBrowser以及许多其他ActiveX控件都没有正确实现基础Windows消息。

答案 1 :(得分:1)

如果您使用的是Winforms DataGrid,则不需要经历所有麻烦。只需使用Control.DrawToBitmap()

即可
var width = dataGridView1.Width;
var height = dataGridView1.Height;
var x = dataGridView1.Left;
var y = dataGridView1.Top;

var bitmap = new Bitmap(width, height);
var targetBounds = new Rectangle(x, y, width, height);
dataGridView1.DrawToBitmap(bitmap, targetBounds);

bitmap.Save("C:\\DataGridView.bmp");

答案 2 :(得分:0)

使用Applicaton.DoEvents()允许处理所有Windows消息,因此调用返回时将完成调整大小和绘画。然后,您可以立即获取表格的屏幕截图。