DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

フォームの外観を印刷する
VB6のPrintFormの代わりになるものは?

Visual Basic 6.0にはPrintFormというメソッドがあり、フォームのイメージを印刷することが出来ました。これと同じようなことを.NET Frameworkで行うにはどのようにすればよいのでしょうか?

フォームの外観を画像として取得する方法に関しては、「フォームやコントロールの外観をキャプチャする」で紹介しています。また、印刷の方法に関しては、「印刷する」で説明しています。これらを組み合わせれば、フォームの印刷ができます。

以下に、「フォームやコントロールの外観をキャプチャする」の「Win32 APIを使用した方法」でフォームをキャプチャし、印刷する例を示します。フォームをキャプチャする方法は、「フォームやコントロールの外観をキャプチャする」を参考にして、適当な方法を選択してください。

VB.NET
コードを隠すコードを選択
'Imports System.Windows.Forms
'Imports System.Drawing

'フォームのイメージを保存する変数
Private memoryImage As Bitmap

''' <summary>
''' フォームのイメージを印刷する
''' </summary>
''' <param name="frm">イメージを印刷するフォーム</param>
Public Sub PrintForm(ByVal frm As Form)
    'フォームのイメージを取得する
    memoryImage = CaptureControl(frm)
    'フォームのイメージを印刷する
    Dim PrintDocument1 As New System.Drawing.Printing.PrintDocument
    AddHandler PrintDocument1.PrintPage, _
        AddressOf PrintDocument1_PrintPage
    PrintDocument1.Print()
    memoryImage.Dispose()
End Sub

<System.Runtime.InteropServices.DllImport("gdi32.dll")> _
Private Shared Function BitBlt(ByVal hdcDest As IntPtr, _
    ByVal nXDest As Integer, ByVal nYDest As Integer, _
    ByVal nWidth As Integer, ByVal nHeight As Integer, _
    ByVal hdcSrc As IntPtr, _
    ByVal nXSrc As Integer, ByVal nYSrc As Integer, _
    ByVal dwRop As Integer) As Boolean
End Function

Private Const SRCCOPY As Integer = &HCC0020

'フォームのイメージを取得する
Public Function CaptureControl(ByVal ctrl As Control) As Bitmap
    Dim g As Graphics = ctrl.CreateGraphics()
    Dim img As New Bitmap(ctrl.ClientRectangle.Width, _
        ctrl.ClientRectangle.Height, g)
    Dim memg As Graphics = Graphics.FromImage(img)
    Dim dc1 As IntPtr = g.GetHdc()
    Dim dc2 As IntPtr = memg.GetHdc()
    BitBlt(dc2, 0, 0, img.Width, img.Height, dc1, 0, 0, SRCCOPY)
    g.ReleaseHdc(dc1)
    memg.ReleaseHdc(dc2)
    memg.Dispose()
    g.Dispose()
    Return img
End Function

'PrintDocument1のPrintPageイベントハンドラ
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, _
        ByVal e As System.Drawing.Printing.PrintPageEventArgs)
    e.Graphics.DrawImage(memoryImage, 0, 0)
End Sub

'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
    PrintForm(Me)
End Sub
C#
コードを隠すコードを選択
//using System.Windows.Forms;
//using System.Drawing;

//フォームのイメージを保存する変数
private Bitmap memoryImage;

/// <summary>
/// フォームのイメージを印刷する
/// </summary>
/// <param name="frm">イメージを印刷するフォーム</param>
public void PrintForm(Form frm)
{
    //フォームのイメージを取得する
    memoryImage = CaptureControl(frm);
    //フォームのイメージを印刷する
    System.Drawing.Printing.PrintDocument PrintDocument1 =
         new System.Drawing.Printing.PrintDocument();
    PrintDocument1.PrintPage +=
         new System.Drawing.Printing.PrintPageEventHandler(
         PrintDocument1_PrintPage);
    PrintDocument1.Print();

    memoryImage.Dispose();
}

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern bool BitBlt(IntPtr hdcDest,
     int nXDest, int nYDest, int nWidth, int nHeight,
     IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);

private const int SRCCOPY = 0xCC0020;

/// <summary>
/// コントロールのイメージを取得する
/// </summary>
/// <param name="ctrl">キャプチャするコントロール</param>
/// <returns>取得できたイメージ</returns>
public Bitmap CaptureControl(Control ctrl)
{
    Graphics g = ctrl.CreateGraphics();
    Bitmap img = new Bitmap(ctrl.ClientRectangle.Width,
        ctrl.ClientRectangle.Height, g);
    Graphics memg = Graphics.FromImage(img);
    IntPtr dc1 = g.GetHdc();
    IntPtr dc2 = memg.GetHdc();
    BitBlt(dc2, 0, 0, img.Width, img.Height, dc1, 0, 0, SRCCOPY);
    g.ReleaseHdc(dc1);
    memg.ReleaseHdc(dc2);
    memg.Dispose();
    g.Dispose();
    return img;
}

//PrintDocument1のPrintPageイベントハンドラ
private void PrintDocument1_PrintPage(object sender,
     System.Drawing.Printing.PrintPageEventArgs e)
{
    e.Graphics.DrawImage(memoryImage, 0, 0);
}

//Button1のClickイベントハンドラ
private void Button1_Click(object sender, EventArgs e)
{
    PrintForm(this);
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。