我在变量中有表单的名称,我需要显示该表单,截取它,然后将其转换为字节,以便将其保存在数据库中。
我的代码是这样的:
var form = (Form)Activator.CreateInstance(Type.GetType(string.Format("namespace.{0}", FormName)), Parameter1, Parameter2);
using (var bitmap = new Bitmap(form.Width, form.Height - 50))
{
form.Show();
DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
byte[] bytes;
using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
{
bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
bytes = stream.ToArray();
}
form.Close();
}
问题是,我从主要表单获取的截图不是来自我希望的子表单...任何想法我怎么能实现这个?
也许这段代码应该在子窗体中,但我不知道如何从动态来动态调用方法。
答案 0 :(得分:0)
您可以动态处理要截屏的表单的FormClosed
Event
。您需要特别注意bounds
。
Form f = new Form();
f.FormClosed += (se, ev) => {
Rectangle bounds = f.Bounds; //Important to set the bounds of the Form you want to screenshot
using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
{
using (Graphics graph = Graphics.FromImage(bitmap))
{
graph.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
}
bitmap.Save("screenshot.png", ImageFormat.Png);
}
};
f.Show();
System.Threading.Thread.Sleep(2000);
f.Close();
在这种情况下,我必须等待2000 milisec
。给予要绘制的表格足够的时间。但是,您可以处理其他事件。即单击表单内的button
。