まずは下の図のような印刷プレビューダイアログを表示してみましょう。これは、PrintPreviewDialogクラスを使用すれば簡単です。
ここではその例として、「印刷する」で紹介したサンプルに手を加え、ボタン(Button1)をクリックした時に印刷プレビューダイアログを表示することにします。
'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
//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コントロールを使って印刷プレビューを表示する方法を紹介します。上記のようなダイアログではなく、より柔軟にプレビューを表示させたい時に使えます。
次の例は前と同じように「印刷する」で紹介したサンプルに手を加え、ボタン(Button1)をクリックした時に印刷プレビューをPrintPreviewControlコントロール(PrintPreviewControl1)に表示させています。なお、Button1とPrintPreviewControl1はすでにフォームに配置されているものとします。
'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
//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メソッドは先の例と同じですので、省略します。
'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
//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にして、アンチエイリアシングで文字列を表示するようにしています。)
'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
//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; } }
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。