可能重复:
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 +中发生了一般错误。
有人可以帮我解决这个问题,并解释一下,为什么我会收到此错误?
答案 0 :(得分:0)
异常消息很糟糕,但表明GDI +无法写入文件。
至少有两个问题。首先,如果没有通过UAC提示获得Vista,Win7和Win8的管理员权限,则不允许程序写入c:\。或以前Windows版本上的任何非管理员帐户。改为使用Path.GetTempFileName()。
第二个问题是你在处理MyImage方面很草率。这很可能会使您的程序在第二次运行此代码时失败,因为该文件仍在使用中,垃圾收集器还没有到处完成图像对象。需要Image.Dispose()来释放图像文件上的锁定。使用 using 语句确保始终如一地处理。