C#Control的屏幕截图为白色

时间:2011-09-28 09:10:03

标签: c# .net controls screenshot drawtobitmap

我的问题与此问题有关:How to get a screen capture of a .Net WinForms control programmatically?

我想在C#中截取System.Windows.Forms.Control的截图。我正在使用上面链接的问题中建议的DrawToBitmap方法,并且大部分时间都可以使用。但是有一些问题。

问题1
我有两个标签,让我们称之为A和B.控件我想截取标签页B中的屏幕截图。我想按下标签页A中的按钮时截取屏幕截图。这大部分时间都有效,除非尚未访问标签页B:然后屏幕截图只是白色。如果我首先访问标签页B,然后返回标签页A并单击按钮以获取屏幕截图,那么它可以正常工作。我猜这是因为在选项卡中加载或构建了尚未完成的控件,但我不确定究竟是什么(或者它可能完全是其他东西)。我一直在尝试使用ResumeLayout,PerformLayout,Show,Update,Invalidate强制加载或构建,但这不起作用。
编辑:通过在包含的标签页控件上使用DrawToBitmap而非Control本身并在该标签页上执行显示来管理解决此问题。

问题2:
当我截取某个自定义Control(UserControl的子类)的屏幕截图时,屏幕截图中有一个小的矩形白色区域(显然不应该有一个)。矩形区域不在控件的某个特定部分,如按钮或文本框,所以我不确定是什么导致了这一点。在其他自定义控件(也是UserControl的子类)上,它工作正常,因此本身不是问题 编辑:解决了这个问题,那里有一个空控件,它被绘制在它上面。为该控件设置Visible为false解决了它。

2 个答案:

答案 0 :(得分:0)

您可以使用此代码,其余工作和找到正确的坐标是供读者完成作业。

int screenWidth = Screen.GetBounds(new Point(0, 0)).Width;
int screenHeight = Screen.GetBounds(new Point(0, 0)).Height;
Bitmap bmpScreenShot = new Bitmap(screenWidth, screenHeight);
Graphics gfx = Graphics.FromImage((Image)bmpScreenShot);
gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight));
bmpScreenShot.Save("test.jpg", ImageFormat.Jpeg);

答案 1 :(得分:0)

对于问题1:如果“如果我首先访问标签页B,然后返回标签页A然后单击按钮以获取屏幕截图然后它可以正常工作”然后添加模仿这些操作的表格模式:

tabControl.SelectedIndex = IndexOfTabB;
tabControl.SelectedIndex = IndexOfTabA;

这很有把戏,但它会起作用。

对于问题2:您可以比较控件的大小和它的屏幕截图并给我们带来结果吗?如果Control.Width不等于位图屏幕的wirdth那么这是一个真正的问题。