我打印这个窗体对吗?

时间:2012-12-11 19:46:36

标签: c# winforms visual-studio printing

  

可能重复:
  Print Windows form in c#

我需要打印打印按钮所在的表单:

private void btnPrint_Click(object sender, EventArgs e)
{
    Graphics g1 = this.CreateGraphics();
    Image MyImage = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height, g1);
    Graphics g2 = Graphics.FromImage(MyImage);
    IntPtr dc1 = g1.GetHdc();
    IntPtr dc2 = g2.GetHdc();
    BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0, 13369376);
    g1.ReleaseHdc(dc1);
    g2.ReleaseHdc(dc2);
    MyImage.Save(@"c:\PrintPage.jpg", ImageFormat.Jpeg);
    FileStream fileStream = new FileStream(@"c:\PrintPage.jpg", FileMode.Open, FileAccess.Read);
    StartPrint(fileStream, "Image");
    fileStream.Close();
    if (System.IO.File.Exists(@"c:\PrintPage.jpg"))
    {
        System.IO.File.Delete(@"c:\PrintPage.jpg");
    }
}

但是在我的错误:MyImage.Save。

错误是:ExternalException未处理:GDI +中发生了一般错误。

有人可以帮我解决这个问题,并解释一下,为什么我会收到此错误?

1 个答案:

答案 0 :(得分:0)

异常消息很糟糕,但表明GDI +无法写入文件。

至少有两个问题。首先,如果没有通过UAC提示获得Vista,Win7和Win8的管理员权限,则不允许程序写入c:\。或以前Windows版本上的任何非管理员帐户。改为使用Path.GetTempFileName()。

第二个问题是你在处理MyImage方面很草率。这很可能会使您的程序在第二次运行此代码时失败,因为该文件仍在使用中,垃圾收集器还没有到处完成图像对象。需要Image.Dispose()来释放图像文件上的锁定。使用 using 语句确保始终如一地处理。