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

プリンタ選択ダイアログを表示して印刷する

プリンタ選択ダイアログを表示して、ユーザーにプリンタを選んでもらってから、そのプリンタを使って印刷する方法を紹介します。

プリンタ選択ダイアログ

プリンタ選択ダイアログを表示するには、PrintDialogクラスを用います。この時、PrintDialog.Documentプロパティに印刷で使用するPrintDocumentオブジェクトを指定します。

ここではその例として、「印刷する」で紹介したサンプルに手を加え、プリンタ選択ダイアログを表示してから印刷するようにしています。

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

'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
    'PrintDocumentオブジェクトの作成
    Dim pd As New System.Drawing.Printing.PrintDocument
    'PrintPageイベントハンドラの追加
    AddHandler pd.PrintPage, AddressOf pd_PrintPage

    'PrintDialogクラスの作成
    Dim pdlg As New PrintDialog
    'PrintDocumentを指定
    pdlg.Document = pd
    '印刷の選択ダイアログを表示する
    If pdlg.ShowDialog() = DialogResult.OK Then
        'OKがクリックされた時は印刷する
        pd.Print()
    End If
End Sub

Private Sub pd_PrintPage(ByVal sender As Object, _
        ByVal e As System.Drawing.Printing.PrintPageEventArgs)
    '画像を読み込む
    Dim img As Image = Image.FromFile("test.bmp")
    '画像を描画する
    e.Graphics.DrawImage(img, e.MarginBounds)
    '次のページがないことを通知する
    e.HasMorePages = False
    '後始末をする
    img.Dispose()
End Sub
C#
コードを隠すコードを選択
//using System.Drawing;

//Button1のClickイベントハンドラ
private void Button1_Click(object sender, System.EventArgs e)
{
    //PrintDocumentオブジェクトの作成
    System.Drawing.Printing.PrintDocument pd =
        new System.Drawing.Printing.PrintDocument();
    //PrintPageイベントハンドラの追加
    pd.PrintPage +=
        new System.Drawing.Printing.PrintPageEventHandler(pd_PrintPage);

    //PrintDialogクラスの作成
    PrintDialog pdlg = new PrintDialog();
    //PrintDocumentを指定
    pdlg.Document = pd;
    //印刷の選択ダイアログを表示する
    if (pdlg.ShowDialog() == DialogResult.OK)
    {
        //OKがクリックされた時は印刷する
        pd.Print();
    }
}

private void pd_PrintPage(object sender,
    System.Drawing.Printing.PrintPageEventArgs e)
{
    //画像を読み込む
    Image img = Image.FromFile("test.bmp");
    //画像を描画する
    e.Graphics.DrawImage(img, e.MarginBounds);
    //次のページがないことを通知する
    e.HasMorePages = false;
    //後始末をする
    img.Dispose();
}
注意:64ビット環境では、PrintDialog.ShowDialogメソッドを呼び出してもダイアログが表示されない場合があります。そのような場合は、ShowDialogメソッドを呼び出す前にPrintDialog.UseEXDialogプロパティをTrueにしてください。なおこのプロパティは、.NET Framework 2.0以降で使用できます。
  • 履歴:
  • 2013/9/1 64ビット環境での問題と、その対策を追記(コメントを参考にさせて頂きました)。
  • 2014/5/12 誤字修正。

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

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