VB.NET で印刷
(Visual Studio 2015 版)

投稿日 2015/09/12

[Home] 

はじめに

Visual Basic には印刷機能がありますが、その関連コントロールが Visual Studio のツールボックスにもあります。ここではこれらのコントロールを使った印刷の例を紹介します。


ここで作成したサンプルプログラムは下の画像のようになっています。



コントロール

PrintDocument

印刷対象をカプセル化したコントールです。このコントロールのイベント PrintPage のハンドラで実際の印刷を実行します。このサンプルでは Name プロパティは PrintDocument1 という名前になっています。また、PrintPage イベントハンドラは PrintDocument という名前になっています。


PrintPreviewDialog

このコントロールはプレビューを表示するダイアログを開くためのコントロールです。Document プロパティに PrintDocument1 を設定しておきます。


PrintDialog

このコントロールはプリンタを選択して印刷する場合のダイアログを開きます。ダイアログには「印刷ボタン」があってプリンタを選択するのと同時に印刷もできます。Document プロパティに PrintDocument1 を設定しておきます。


PageSetupDialog

このコントロールは印刷先の用紙を設定する場合のダイアログを開きます。Document プロパティに PrintDocument1 を設定しておきます。


ソースコード

プロパティエディタでプロパティを設定してある個所があることに注意。PrintPage イベントハンドラもプロパティエディタで設定しています。印刷ページは1枚に収まることを前提にしています。

印刷は PrintDocument の Print メソッドで開始します。実際の印刷処理は PrintPage イベントハンドラ (このサンプルでは PrintDocument()) で行います。印刷処理はグラフィックス (Graphics) の処理です。つまり画面にグラフィックスを表示するのと同じメソッドを使って描画します。ただし、ページがあるのでその分、処理が複雑になります。そのため、このサンプルでは1ページのみということを前提にしています。

Imports System.IO
Imports System.Text

''' <summary>
''' メインフォーム
''' </summary>
Public Class Form1
    ''' <summary>
    ''' テキストファイルのパスが設定されていないときのメッセージ
    ''' </summary>
    Private Const ERROR_MESSAGE1 = "パス名を指定してください。"
    
    ''' <summary>
    ''' フォームがロードしたとき
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' プレビューダイアログのサイズを大きくする。
        PrintPreviewDialog1.Size = New Size(640, 800)
    End Sub
    
    ''' <summary>
    ''' 参照ボタン
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub btnBrowse_Click(sender As Object, e As EventArgs) Handles btnBrowse.Click
        ' 印刷するテキストファイルを取得する。
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            txtPath.Text = OpenFileDialog1.FileName
        End If
    End Sub
    
    ''' <summary>
    ''' 「閉じる」ボタン
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click
        Close()
    End Sub
    
    ''' <summary>
    ''' プレビューボタン
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub btnPreview_Click(sender As Object, e As EventArgs) Handles btnPreview.Click
        ' テキストファイルのパスが設定されているかチェックする。
        ErrorProvider1.Clear()
        If String.IsNullOrEmpty(txtPath.Text) Then
            ErrorProvider1.SetError(txtPath, ERROR_MESSAGE1)
            Return
        End If
        
        ' プレビューを表示する。
        PrintPreviewDialog1.ShowDialog()
    End Sub
    
    ''' <summary>
    ''' 印刷ボタン
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub btnPrint_Click(sender As Object, e As EventArgs) Handles btnPrint.Click
        ' テキストファイルのパスが設定されているかチェックする。
        ErrorProvider1.Clear()
        If String.IsNullOrEmpty(txtPath.Text) Then
            ErrorProvider1.SetError(txtPath, ERROR_MESSAGE1)
            Return
        End If
        ' 印刷開始
        Try
            PrintDocument1.DocumentName = New FileInfo(txtPath.Text).Name
            PrintDocument1.Print()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "致命的エラー")
        End Try
    End Sub
    
    ''' <summary>
    ''' プリンター選択と印刷
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub lbtnPrinter_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles lbtnPrinter.LinkClicked
        ' テキストファイルのパスが設定されているかチェックする。
        ErrorProvider1.Clear()
        If String.IsNullOrEmpty(txtPath.Text) Then
            ErrorProvider1.SetError(txtPath, ERROR_MESSAGE1)
            Return
        End If
        ' PrintDialog1 の「印刷」ボタンがクリックされたら印刷開始する。
        If PrintDialog1.ShowDialog() = DialogResult.OK Then
            PrintDocument1.DocumentName = New FileInfo(txtPath.Text).Name
            PrintDocument1.Print()
        End If
    End Sub
    
    ''' <summary>
    ''' ページ設定
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub lbtnPageSetup_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles lbtnPageSetup.LinkClicked
        If PageSetupDialog1.ShowDialog() = DialogResult.OK Then
            ' PageSetupDialog1 の設定を PrintDocument1 に設定する。
            PrintDocument1.DefaultPageSettings = PageSetupDialog1.PageSettings
        End If
    End Sub
    
    ''' <summary>
    ''' 印刷イベントハンドラ
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks>印刷行数は1ページに収まる長さでなければならない。</remarks>
Private Sub PrintDocument(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim g As Graphics = e.Graphics
        Dim line As String
        Dim font As Font = New Font("メイリオ", 11.0)
        Dim brush As Brush = New SolidBrush(Color.Black)
        Dim x, y As Single
        
        ' 行の印刷位置の初期値
        x = 20.0F
        y = 20.0F
        ' テキストファイルを1行づつ印刷する。
        Using reader = New StreamReader(txtPath.Text, Encoding.Default)
            ' ファイルの終わりまで繰り返す。
            While Not reader.EndOfStream
                line = reader.ReadLine()
                g.DrawString(line, font, brush, x, y)
                y += 20.0F
            End While
        End Using
End Sub
End Class

 

 


 

 開設 2014年12月   著作権 2014-2015 bonk.red  連絡先: こちらからメッセージを送ってください。

 このページの先頭へ..