.NET TIPS

Windowsアプリケーションで印刷を行うには?

デジタルアドバンテージ 一色 政彦
2006/01/06

 Windowsアプリケーションなどで印刷を行うには、PrintDocumentコンポーネント(System.Drawing.Printing名前空間)を利用する。

ドキュメント印刷用コンポーネントの生成

 まずはPrintDocumentコンポーネントのオブジェクトを生成する必要がある。これは具体的には次のようなコードになる。

private System.Drawing.Printing.PrintDocument printDocument1;

public Form1()
{
  printDocument1 = new System.Drawing.Printing.PrintDocument();
}
Friend WithEvents PrintDocument1 As System.Drawing.Printing.PrintDocument

Public Sub New()
  MyBase.New()

  PrintDocument1 = New System.Drawing.Printing.PrintDocument
End Sub
PrintDocumentコンポーネント・オブジェクトの生成(上:C#、下:VB.NET)

 Visual Studio(.NET 2002/.NET 2003/2005)を使用する場合は、このオブジェクト生成のコードを手動で記述する必要はない。ツールボックスにPrintDocumentコンポーネントが初めから用意されているので、これをフォーム上にドラッグ&ドロップするだけでよい。

実際の印刷処理の実装

 次に実際の印刷処理を実装しよう。これはPrintDocumentコンポーネントのPrintPageイベントのイベント・ハンドラ内に実装すればよい。本稿では次のようなコードを記述した。

public Form1()
{
  ……中略……
  // PrintPageイベント・ハンドラの追加
  this.printDocument1.PrintPage +=
    new System.Drawing.Printing.PrintPageEventHandler(
      this.printDocument1_PrintPage);
}

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
  // 印刷ページの描画を行う
  e.Graphics.DrawString("サンプル印刷",
    new Font("MS 明朝", 32), Brushes.Black,
    e.MarginBounds.Left, e.MarginBounds.Top,
    new StringFormat());
}
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
  ' 印刷ページの描画を行う
  e.Graphics.DrawString("サンプル印刷", _
    New Font("MS 明朝", 32), Brushes.Black, _
    e.MarginBounds.Left, e.MarginBounds.Top, _
    New StringFormat)
End Sub
PrintDocumentコンポーネントのPrintPageイベント・ハンドラの実装(上:C#、下:VB.NET)

 このコードでは、PrintPageイベント・ハンドラ(本稿の例のC#版ではprintDocument1_PrintPageメソッド、VB.NET版ではPrintDocument1_PrintPageメソッド)を追加し、そのイベント・ハンドラ内に印刷ページに対して描画を行うためのコードを記述している。

 印刷ページに描画を行うには、Graphicsオブジェクト(System.Drawing名前空間)を使用する。このGraphicsオブジェクトは、PrintPageイベント・ハンドラの第2パラメータのPrintPageEventArgsオブジェクト(System.Drawing.Printing名前空間)が持つGraphicsプロパティから取得できる。これは上記コードでは「e.Graphics」の部分に該当する。ここでは、GraphicsオブジェクトのDrawStringメソッドを呼び出して、印刷ページに文字列を描画している。

 なおDrawStringメソッドにはいくつかのオーバーロードがあるので詳しくはMSDNの「Graphics.DrawString メソッド」の項を参照してほしいが、本稿で使用したバージョンのDrawStringメソッドでは、その第1パラメータに描画する文字列(本稿の例では「サンプル印刷」)を、第2パラメータにフォント(「MS明朝」の「32」)を、第3パラメータにブラシ(「標準の黒色ブラシ」)を、第4パラメータに描画開始X座標(「ページ余白の左上隅のX座標」)を、第5パラメータに描画開始Y座標(「ページ余白の左上隅のY座標」)を、第6パラメータに書式属性(「標準の書式」)を指定している。

 またPrintDocumentコンポーネントのPrintPageイベント・ハンドラの追加に関しても、Visual Studioを利用すればその作業が簡略化される。具体的には次の画面を参照してほしい。

Visual StudioによるPrintPageイベント・ハンドラの追加
Visual Studioを利用すればPrintPageイベント・ハンドラも簡単に追加できる。
  ツールボックスからPrintDocumentコンポーネントをフォーム上にドラッグ&ドロップする。これにより、PrintDocumentコンポーネント(この例では「printDocument1」)がフォームに追加される。
  追加されたPrintDocumentコンポーネントをダブルクリックすると、PrintPageイベント・ハンドラが自動的に追加される。後はそのイベント・ハンドラ内に印刷処理コードを記述するだけだ。

 以上で印刷処理の実装は完了だ。ただしここで示した印刷方法では1ページしか印刷されない。複数ページを印刷する方法については、また後日公開予定のTIPSで紹介しよう。

印刷処理の実行

 後は実装した印刷処理を実行するだけである。これを行うには、PrintDocumentコンポーネントのPrintメソッド(パラメータなし、戻り値なし)を呼び出せばよい。

 本稿ではフォーム上にボタンを追加して、そのClickイベント・ハンドラにPrintメソッドの呼び出しを記述する。具体的には次のようなコードになる。ちなみにVisual Studioを使用している場合、Windowsフォーム上に配置したボタンをダブルクリックすることでClickイベント・ハンドラが自動的に追加される。

private void button1_Click(object sender, System.EventArgs e)
{
  // 印刷処理を実行
  printDocument1.Print();
}
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  ' 印刷処理を実行
  PrintDocument1.Print()
End Sub
PrintDocumentコンポーネントのPrintメソッドの呼び出し(上:C#、下:VB.NET)

サンプル・プログラムの実行

 以上の手順で実装したサンプル・プログラムを実行したのが次の画面だ。

印刷を実行するWindowsアプリケーションのサンプル・プログラム
ボタン(この例では[button1]ボタン)をクリックすると、印刷処理が呼び出されて実行される。

 この画面ではボタン・クリックによる印刷処理の呼び出しの後に[印刷中]ダイアログが表示されているが、これはPrintDocumentコンポーネントのPrintメソッドを実行すると.NET Frameworkが自動的に表示してくれるものである。End of Article

カテゴリ:Windowsフォーム 処理対象:印刷
カテゴリ:クラス・ライブラリ 処理対象:印刷
使用ライブラリ:PrintDocumentクラス(System.Drawing.Printing名前空間)
使用ライブラリ:PrintPageEventArgsクラス(System.Drawing.Printing名前空間)
使用ライブラリ:Graphicsオブジェクト(System.Drawing名前空間)

この記事と関連性の高い別の.NET TIPS
複数ページの印刷を行うには?
印刷プレビュー(ダイアログ形式)を表示するには?
複数の部数を印刷するには?
文字列や画像を無効状態で描画するには?
スクリーンやウィンドウをキャプチャするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間