3

ユーザーが選択したアイテムのドキュメントを請求書の形式で印刷できるアプリケーションがあります。すべてがうまく機能しますがPrintPage、ドキュメントまたはグラフィックをキャプチャしたいPrintDocumentのイベントでは、.bmp後で使用/表示するために保存できるようにビットマップに変換します。(注:このドキュメントには複数のページがあります)私はそれを次のように設定しています:

PrintDocument doc = new PrintDocument();
doc.PrintPage += new PrintPageEventHandler(doc_PrintPage);
doc.Print();

その後、PrintPageイベントで:

private void doc_PrintPage(object sender, PrintPageEventArgs ev)
{
    // Use ev.Graphics to create the document
    // I create the document here

    // After I have drawn all the graphics I want to get it and turn it into a bitmap and save it.
}

行数が多いという理由だけで、すべてのev.Graphicsコードを切り取りました。グラフィックを描画するコードを変更せずに、グラフィックをビットマップに変換する方法はありPrintDocumentますか?または、それに似たようなことをしますか?ドキュメントをコピーしてビットマップに変換しますか?

4

2 に答える 2

5

実際にページをビットマップに描画してから、ev.Graphicsを使用してそのビットマップをページに描画する必要があります。

private void doc_PrintPage(object sender, PrintPageEventArgs ev)
{
    var bitmap = new Bitmap((int)graphics.ClipBounds.Width,
                            (int)graphics.ClipBounds.Height);

    using (var g = Graphics.FromImage(bitmap))
    {
        // Draw all the graphics using into g (into the bitmap)
        g.DrawLine(Pens.Black, 0, 0, 100, 100);
    }

    // And maybe some control drawing if you want...?
    this.label1.DrawToBitmap(bitmap, this.label1.Bounds);

    ev.Graphics.DrawImage(bitmap, 0, 0);
}
于 2012-06-03T07:33:52.233 に答える
0

実際、12 年 6 月 3 日 7:33 の Yorye Nathan の回答は正しく、それが私を助けた出発点でした。ただし、そのままでは動作しませんでしたので、アプリケーションで動作するように修正を加えました。修正は、PrintPgeEventArgs.Graphics デバイス コンテキストからプリンターのページ サイズを取得し、新しい Bitmap(...) 構造の 3 番目のパラメーターとして PrintPage Graphics を含めることです。

private void doc_PrintPage(object sender, PrintPageEventArgs ppea)
{
  // Retrieve the physical bitmap boundaries from the PrintPage Graphics Device Context
  IntPtr hdc = ppea.Graphics.GetHdc();
  Int32 PhysicalWidth = GetDeviceCaps(hdc, (Int32)PHYSICALWIDTH);
  Int32 PhysicalHeight = GetDeviceCaps(hdc, (Int32)PHYSICALHEIGHT);
  ppea.Graphics.ReleaseHdc(hdc);

  // Create a bitmap with PrintPage Graphic's size and resolution
  Bitmap myBitmap = new Bitmap(PhysicalWidth, PhysicalHeight, ppea.Graphics);
  // Get the new work Graphics to use to draw the bitmap
  Graphics myGraphics = Graphics.FromImage(myBitmap);

  // Draw everything on myGraphics to build the bitmap

  // Transfer the bitmap to the PrintPage Graphics
  ppea.Graphics.DrawImage(myBitmap, 0, 0);

  // Cleanup 
  myBitmap.Dispose();
}

////////
// Win32 API GetDeviceCaps() function needed to get the DC Physical Width and Height

const int PHYSICALWIDTH = 110;  // Physical Width in device units           
const int PHYSICALHEIGHT = 111; // Physical Height in device units          

// This function returns the device capability value specified
// by the requested index value.
[DllImport("GDI32.DLL", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Int32 GetDeviceCaps(IntPtr hdc, Int32 nIndex);

元の回答を提供してくれた Yorye Nathan に再度感謝します。//AJ

于 2014-05-12T20:32:07.667 に答える