-1

重複の可能性:
Windowsフォームを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+で一般的なエラーが発生しました。

誰かが私にこの問題の修正を教えてもらえますか、そしてなぜ私がこのエラーを受け取るのか説明できますか?

4

1 に答える 1

0

例外メッセージはくだらないものですが、GDI+ がファイルを書き込めないことを示しています。

少なくとも 2 つの問題があります。まず、Vista、Win7、および Win8 で UAC プロンプトを介して取得した管理者権限がなければ、プログラムは c:\ に書き込むことができません。または、以前の Windows バージョンの管理者以外のアカウント。代わりに Path.GetTempFileName() を使用してください。

2 つ目は、MyImage の破棄についてずさんなことです。このコードを 2 回目に実行すると、プログラムが失敗する可能性が非常に高くなります。これは、ファイルがまだ使用されており、ガベージ コレクターがまだイメージ オブジェクトをファイナライズしていないためです。画像ファイルのロックを解除するには、Image.Dispose() が必要です。usingステートメントを使用して、一貫して破棄されるようにします。

于 2012-12-11T20:01:26.583 に答える