【入門編】Windows Formsの印刷プレビューにおける独自ヘッダー・フッターの動的描画:PrintPageEventArgsの完全制御 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

伝説の帳票エンジンへの招待:PrintPageEventArgsを完全支配せよ

こんにちは。業務自動化の深淵へようこそ。
Excelマクロ(VBA)で「印刷範囲の調整」に苦しんだ経験はありませんか? 「なぜヘッダーがずれるのか」「なぜ改ページ位置を制御できないのか」。その悩み、VB.NETの`PrintDocument`クラスと`PrintPageEventArgs`をマスターすれば、すべて過去のものになります。

今日は、標準機能では不可能な「社外秘透かし」や「高度なページ制御」を、あなたの手で実装する方法を伝授します。

—

1. なぜ「PrintDocument」なのか?

VB.NETの印刷は、「紙という仮想キャンバスに、描画命令を叩き込む」という非常にクリエイティブなプロセスです。

  • PrintDocument: 印刷の「心臓部」。
  • PrintPageイベント: 1ページ描画するたびに呼ばれる「魔法の関数」。
  • PrintPageEventArgs: そのページの「ペンと紙の権利」を握るオブジェクト。

この`PrintPageEventArgs`こそが、今回の主役です。

—

2. 「PrintPage」イベントを掌握する

まずは、コードの骨格を見てみましょう。`e.Graphics`を使って、座標を指定して描画を行います。

.net
‘ 印刷開始時に一度だけ呼ばれるハンドラ
Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
‘ 1. 「社外秘」の透かしを描画(背景として先に描く)
Dim fontHeader As New Font(“Arial”, 60, FontStyle.Bold)
Dim brushGray As New SolidBrush(Color.FromArgb(50, Color.Gray)) ‘ 透明度付きグレー
e.Graphics.DrawString(“社外秘”, fontHeader, brushGray, 100, 400)

‘ 2. ページ番号の描画(e.PageSettingsで余白も取得可能)
Dim pageInfo As String = $”Page {currentPageNumber}”
e.Graphics.DrawString(pageInfo, New Font(“Meiryo”, 10), Brushes.Black, 700, 1050)

‘ 3. メインの帳票データ描画(ここに表計算ロジックを入れる)
‘ e.HasMorePages = True にすると、次ページを生成し続ける
End Sub

—

3. 陥りやすい「3つの罠」と回避策

初心者が必ずここで躓くポイントを、ベテランの視点で先回りして解説します。

① 「なぜページが止まらない?」

`e.HasMorePages = True` を設定すると、無限ループに入ります。必ず「全データの行数」をカウントし、`If currentLine >= totalLines Then e.HasMorePages = False` という条件分岐を忘れないでください。

② 「座標の基準点はどこ?」

`e.Graphics`の座標(0,0)は、用紙の左上の物理的な端です。ハードウェア(プリンタ)の余白設定によっては、端が切れることがあります。必ず `e.MarginBounds` を参照して、「描画してよい安全領域」を計算しましょう。

③ 「オブジェクトの寿命(Dispose)」

`Font`や`Brush`は、使い終わったら必ず`Dispose()`するか、`Using`ステートメントで解放してください。これを怠ると、長時間印刷時にメモリリークが発生し、アプリが突然死します。

—

4. 実践:ページをまたぐ「表」の描き方

実務では、表がページを跨ぐ際、ヘッダー行を次のページにも自動挿入する必要がありますね。

.net
‘ 簡易的なロジック例
Dim y As Integer = 100 ‘ 現在の描画Y座標
For i As Integer = startRow To endRow
‘ 描画処理…
y += 30

‘ 次ページへ溢れるか判定
If y > e.MarginBounds.Bottom Then
e.HasMorePages = True
startRow = i + 1 ‘ 次のページはここから開始
Exit Sub
End If
Next

e.HasMorePages = False ‘ 全データ終了

—

最後に:自動化の先にあるもの

「コードを書く」ということは、手作業という名の「反復労働」を、ロジックという名の「知的な資産」に変換することです。

今回紹介した`PrintPageEventArgs`の制御は、VB.NETによる帳票開発のほんの入り口に過ぎません。しかし、この「座標を制御し、ページを判断する」という基礎さえあれば、どんなに複雑なインボイスや見積書だって、あなたのプログラムで自由自在に描画できるようになります。

まずは、真っ白な用紙に「Hello World」と印刷するところから始めてみてください。その小さな一歩が、あなたのエンジニアとしてのキャリアを大きく飛躍させるはずです。

何か詰まったら、いつでも戻ってきてくださいね。あなたの挑戦を、心から応援しています!

タイトルとURLをコピーしました