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

印刷プレビューを表示する

PrintPreviewDialogクラスを使用する

まずは下の図のような印刷プレビューダイアログを表示してみましょう。これは、PrintPreviewDialogクラスを使用すれば簡単です。

PrintPreviewDialog

ここではその例として、「印刷する」で紹介したサンプルに手を加え、ボタン(Button1)をクリックした時に印刷プレビューダイアログを表示することにします。

VB.NET
コードを隠すコードを選択
'Imports System.Windows.Forms
'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

    'PrintPreviewDialogオブジェクトの作成
    Dim ppd As New PrintPreviewDialog
    'プレビューするPrintDocumentを設定
    ppd.Document = pd
    '印刷プレビューダイアログを表示する
    ppd.ShowDialog()
End Sub

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

    //PrintPreviewDialogオブジェクトの作成
    PrintPreviewDialog ppd = new PrintPreviewDialog();
    //プレビューするPrintDocumentを設定
    ppd.Document = pd;
    //印刷プレビューダイアログを表示する
    ppd.ShowDialog();
}

private void pd_PrintPage(object sender,
    System.Drawing.Printing.PrintPageEventArgs e)
{
    //画像を読み込む
    Image img = Image.FromFile("test.jpg");
    //画像を描画する
    e.Graphics.DrawImage(img, 0, 0, img.Width, img.Height);
    //次のページがないことを通知する
    e.HasMorePages = false;
    //後始末をする
    img.Dispose();
}

ここではPrintPreviewDialogオブジェクトを自分で作成しましたが、Visual StudioのフォームデザイナでPrintPreviewDialogコンポーネントをフォームに追加して利用する方法もあります。この方法についてはヘルプの「Windows アプリケーションでの印刷プレビューの表示」をご覧ください。

印刷プレビューダイアログの位置や表示倍率を指定して表示する方法は、「印刷プレビューダイアログの表示位置や表示倍率を指定する」で説明しています。

PrintPreviewControlクラスを使用する

次にPrintPreviewControlコントロールを使って印刷プレビューを表示する方法を紹介します。上記のようなダイアログではなく、より柔軟にプレビューを表示させたい時に使えます。

PrintPreviewControl

次の例は前と同じように「印刷する」で紹介したサンプルに手を加え、ボタン(Button1)をクリックした時に印刷プレビューをPrintPreviewControlコントロール(PrintPreviewControl1)に表示させています。なお、Button1とPrintPreviewControl1はすでにフォームに配置されているものとします。

VB.NET
コードを隠すコードを選択
'Imports System.Windows.Forms
'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

    'プレビューするPrintDocumentを設定
    PrintPreviewControl1.Document = pd

    '画面を更新する(.NET Framework 1.1以前では必要なし)
    PrintPreviewControl1.InvalidatePreview()
End Sub

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

    //プレビューするPrintDocumentを設定
    PrintPreviewControl1.Document = pd;

    //画面を更新する(.NET Framework 1.1以前では必要なし)
    PrintPreviewControl1.InvalidatePreview();
}

private void pd_PrintPage(object sender,
    System.Drawing.Printing.PrintPageEventArgs e)
{
    //画像を読み込む
    Image img = Image.FromFile("test.jpg");
    //画像を描画する
    e.Graphics.DrawImage(img, 0, 0, img.Width, img.Height);
    //次のページがないことを通知する
    e.HasMorePages = false;
    //後始末をする
    img.Dispose();
}
補足:.NET Framework 1.1以前ではPrintPreviewControl.Documentを設定するとInvalidatePreviewメソッドが呼び出されていましたが、2.0以降では呼び出されません。よって、自分でInvalidatePreviewメソッドを呼び出す必要があります。詳しくは、「フィードバック: PrintPreviewControl does not call InvalidatePreview method after setting a PrintDocument」をご覧ください。

倍率を指定する

デフォルトでは、表示されるページの倍率は、PrintPreviewControlコントロールの大きさに合わせて自動的に調節されます。任意の倍率を指定するには、PrintPreviewControl.Zoomプロパティを設定します。Zoomプロパティを1にすると100%、2にすると200%、0.5にすると50%になります。

デフォルトのように倍率が自動的に調節されるようにするには、PrintPreviewControl.AutoZoomプロパティをTrueにします。AutoZoomプロパティはデフォルトでTrueですが、Zoomプロパティを設定するとFalseに変わります。

以下に50%の倍率で表示する例を示します。pd_PrintPageメソッドは先の例と同じですので、省略します。

PrintPreviewControlコントロールで倍率を指定する

VB.NET
コードを隠すコードを選択
'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

    'プレビューするPrintDocumentを設定
    PrintPreviewControl1.Document = pd

    '50%の倍率で表示する
    PrintPreviewControl1.Zoom = 0.5

    '画面を更新する(.NET Framework 1.1以前では必要なし)
    PrintPreviewControl1.InvalidatePreview()
End Sub
C#
コードを隠すコードを選択
//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);

    //プレビューするPrintDocumentを設定
    PrintPreviewControl1.Document = pd;

    //50%の倍率で表示する
    PrintPreviewControl1.Zoom = 0.5;

    //画面を更新する(.NET Framework 1.1以前では必要なし)
    PrintPreviewControl1.InvalidatePreview();
}

指定したページを表示する

印刷プレビューに表示するページ数は、PrintPreviewControl.StartPageプロパティで指定できます。StartPageプロパティが0のとき1ページ目が表示されますので、2ページ目を表示するには1、3ページ目を表示するには2を指定します。StartPageプロパティの値が実際のページ数を超えている場合は、最後のページが表示されます。

具体的なコードは、で紹介します。

複数のページを表示する

1つのPrintPreviewControlコントロールに複数のページを表示することもできます。例えば、横に3列、縦に2行で表示するには、PrintPreviewControl.Columnsプロパティを3、PrintPreviewControl.Rowsプロパティを2にします。

以下の例では、横に3列、縦に2行で表示されるようにして、さらに、StartPageプロパティを5にして6ページ目から表示されるようにしています。ただしこの例では10ページしかないため、5ページ目から最後のページまで表示されます。(ついでにPrintPreviewControl.UseAntiAliasプロパティをTrueにして、アンチエイリアシングで文字列を表示するようにしています。)

PrintPreviewControlコントロールに複数のページを表示する

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

'Button1のClickイベントハンドラ 
Private Sub Button1_Click(ByVal sender As 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

    'プレビューするPrintDocumentを設定 
    PrintPreviewControl1.Document = pd

    '6ページ目を表示する 
    PrintPreviewControl1.StartPage = 5

    'ページを横に3列、縦に2行で表示する 
    PrintPreviewControl1.Columns = 3
    PrintPreviewControl1.Rows = 2

    'アンチエイリアシングで文字列を表示する 
    PrintPreviewControl1.UseAntiAlias = True

    '画面を更新する(.NET Framework 1.1以前では必要なし)
    PrintPreviewControl1.InvalidatePreview()
End Sub

'印刷しているページ 
Private pageCount As Integer = 1
Private printFont As New Font("Arial", 400, FontStyle.Bold)

Private Sub pd_PrintPage(ByVal sender As Object, _
    ByVal e As System.Drawing.Printing.PrintPageEventArgs)

    'ページを表示する 
    e.Graphics.DrawString(pageCount.ToString(), Me.printFont, Brushes.Black, 0, 0)

    '10ページまで表示する 
    If Me.pageCount >= 10 Then
        Me.pageCount = 1
        e.HasMorePages = False
    Else
        Me.pageCount += 1
        e.HasMorePages = True
    End If
End Sub
C#
コードを隠すコードを選択
//using System.Windows.Forms;
//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);

    //プレビューするPrintDocumentを設定
    PrintPreviewControl1.Document = pd;

    //6ページ目を表示する
    PrintPreviewControl1.StartPage = 5;

    //ページを横に3列、縦に2行で表示する
    PrintPreviewControl1.Columns = 3;
    PrintPreviewControl1.Rows = 2;

    //アンチエイリアシングで文字列を表示する
    PrintPreviewControl1.UseAntiAlias = true;

    //画面を更新する(.NET Framework 1.1以前では必要なし)
    PrintPreviewControl1.InvalidatePreview();
}

//印刷しているページ
private int pageCount = 1;
private Font printFont = new Font("Arial", 400, FontStyle.Bold);

private void pd_PrintPage(object sender,
    System.Drawing.Printing.PrintPageEventArgs e)
{
    //ページを表示する
    e.Graphics.DrawString(pageCount.ToString(), this.printFont, Brushes.Black, 0, 0);

    //10ページまで表示する
    if (this.pageCount >= 10)
    {
        this.pageCount = 1;
        e.HasMorePages = false;
    }
    else
    {
        this.pageCount++;
        e.HasMorePages = true;
    }
}
  • 履歴:
  • 2009/3/31 .NET Framework 2.0以降ではPrintPreviewControl.InvalidatePreviewメソッドを加えないとうまく表示されない不具合を修正(コメントでご報告をいただきました)。PrintPreviewControlコントロールを使う方法をより詳しくした。

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

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