-1

可能重复:
在 C# 中打印 Windows 窗体

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

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+ 中发生一般错误。

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

4

1 回答 1

0

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

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

第二个是您在处理 MyImage 时马虎。这很可能会使您的程序在您第二次运行此代码时失败,因为该文件仍在使用中,而垃圾收集器还没有完成图像对象的最终确定。Image.Dispose() 需要释放图像文件的锁定。使用using语句来确保它被一致地处理。

于 2012-12-11T20:01:26.583 回答