从c#

时间:2017-03-26 08:42:22

标签: c# winforms bitmap

我在变量中有表单的名称,我需要显示该表单,截取它,然后将其转换为字节,以便将其保存在数据库中。

我的代码是这样的:

 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();
 }

问题是,我从主要表单获取的截图不是来自我希望的子表单...任何想法我怎么能实现这个?

也许这段代码应该在子窗体中,但我不知道如何从动态来动态调用方法。

1 个答案:

答案 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