Visual Basic 6.0にはPrintFormというメソッドがあり、フォームのイメージを印刷することが出来ました。これと同じようなことを.NET Frameworkで行うにはどのようにすればよいのでしょうか?
フォームの外観を画像として取得する方法に関しては、「フォームやコントロールの外観をキャプチャする」で紹介しています。また、印刷の方法に関しては、「印刷する」で説明しています。これらを組み合わせれば、フォームの印刷ができます。
以下に、「フォームやコントロールの外観をキャプチャする」の「Win32 APIを使用した方法」でフォームをキャプチャし、印刷する例を示します。フォームをキャプチャする方法は、「フォームやコントロールの外観をキャプチャする」を参考にして、適当な方法を選択してください。
'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
//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); }
(この記事はメールマガジン「.NETプログラミング研究」で紹介したものを書き直したものです。)
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。