「プリンタ選択ダイアログを表示して印刷する」で紹介したように、PrintDialogクラスを使って印刷ダイアログを表示する時AllowSomePagesプロパティをTrueにすると、印刷ダイアログでユーザーが印刷範囲を指定できるようになります。しかしこれだけで指定されたページのみが印刷されるようになるわけではありません。実際に指定されたページのみ印刷されるようにするには、そうなるように自分でコーディングする必要があります。
方法としては、PrintDialog.PrinterSettingsプロパティからPrinterSettingsオブジェクトを取得して、そのPrinterSettings.PrintRangeプロパティがPrintRange.SomePagesになっている時(つまり、「ページ指定」が指定された時)にPrinterSettings.FromPageプロパティとPrinterSettings.ToPageプロパティを調べて、その範囲のページだけを印刷します。
次に具体的なサンプルを示します。ここではButton1がクリックされた時に印刷ダイアログを表示し、「OK」ボタンがクリックされた時に印刷が開始されるようにしています。印刷されるページは10ページあります。「ページ指定」が指定されていると、指定されたページのみが印刷されます。
'Imports System.Windows.Forms 'Imports System.Drawing '現在のページ Private currentPage As Integer = 1 'Button1のクリックイベントハンドラ 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 'PrintDialogクラスの作成 Dim pdlg As New PrintDialog 'PrintDocumentを指定 pdlg.Document = pd 'ページ指定できるようにする pdlg.AllowSomePages = True 'ページ指定の最小値と最大値を指定する pdlg.PrinterSettings.MinimumPage = 1 pdlg.PrinterSettings.MaximumPage = 10 '印刷開始と終了ページを指定する pdlg.PrinterSettings.FromPage = pdlg.PrinterSettings.MinimumPage pdlg.PrinterSettings.ToPage = pdlg.PrinterSettings.MaximumPage '印刷の選択ダイアログを表示する 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) 'ページ範囲が指定されており、始めのページのときは、 '印刷開始ページまで飛ばす If e.PageSettings.PrinterSettings.PrintRange = _ System.Drawing.Printing.PrintRange.SomePages AndAlso _ currentPage = 1 Then currentPage = e.PageSettings.PrinterSettings.FromPage End If 'currentPageで指定されたページを描画する Dim f As New Font("Arial", 100) e.Graphics.DrawString(currentPage.ToString(), f, Brushes.Black, 0, 0) f.Dispose() '次のページがあるか調べる If currentPage >= 10 OrElse _ (e.PageSettings.PrinterSettings.PrintRange = _ System.Drawing.Printing.PrintRange.SomePages AndAlso _ e.PageSettings.PrinterSettings.ToPage <= currentPage) Then '次のページがないことを通知する e.HasMorePages = False currentPage = 1 Else e.HasMorePages = True currentPage += 1 End If End Sub
//using System.Windows.Forms; //using System.Drawing; //現在のページ private int currentPage = 1; //Button1のクリックイベントハンドラ 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; //ページ指定できるようにする pdlg.AllowSomePages = true; //ページ指定の最小値と最大値を指定する pdlg.PrinterSettings.MinimumPage = 1; pdlg.PrinterSettings.MaximumPage = 10; //印刷開始と終了ページを指定する pdlg.PrinterSettings.FromPage = pdlg.PrinterSettings.MinimumPage; pdlg.PrinterSettings.ToPage = pdlg.PrinterSettings.MaximumPage; //印刷の選択ダイアログを表示する if (pdlg.ShowDialog() == DialogResult.OK) { //OKがクリックされた時は印刷する pd.Print(); } } private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { //ページ範囲が指定されており、始めのページのときは、 //印刷開始ページまで飛ばす if (e.PageSettings.PrinterSettings.PrintRange == System.Drawing.Printing.PrintRange.SomePages && currentPage == 1) { currentPage = e.PageSettings.PrinterSettings.FromPage; } //currentPageで指定されたページを描画する Font f = new Font("Arial", 100); e.Graphics.DrawString(currentPage.ToString(), f, Brushes.Black, 0, 0); f.Dispose(); //次のページがあるか調べる if (currentPage >= 10 || (e.PageSettings.PrinterSettings.PrintRange == System.Drawing.Printing.PrintRange.SomePages && e.PageSettings.PrinterSettings.ToPage <= currentPage)) { //次のページがないことを通知する e.HasMorePages = false; currentPage = 1; } else { e.HasMorePages = true; currentPage++; } }
(この記事は、「.NETプログラミング研究 第43号」で紹介したものを基にしています。)
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。