印刷プレビューを使用して印刷する (Windows フォーム .NET)

Windows フォームのプログラミングでは印刷サービスに加え印刷プレビューを提供することがよくあります。 印刷プレビューのサービスをアプリケーションに追加する簡単な方法は、ファイルの印刷に PrintPreviewDialog コントロールを PrintPage イベント処理ロジックと組み合わせて使用することです。

PrintPreviewDialog コントロールのテキスト ドキュメントをプレビューするには

  1. Visual Studio で [ソリューション エクスプローラー] ウィンドウを使用し、印刷元のフォームをダブルクリックします。 これでビジュアル デザイナーが開きます。

  2. [ツールボックス] ウィンドウで PrintDocument コンポーネントと PrintPreviewDialog コンポーネントの両方をダブルクリックして、フォームに追加します。

  3. Button をフォームに追加するか、フォームに既に存在するボタンを使用します。

  4. フォームのビジュアル デザイナーでボタンを選択します。 [プロパティ] ペインで [イベント] フィルター ボタンを選び、Click イベントをダブルクリックしてイベント ハンドラーを生成します。

  5. Click イベント コードが表示されるはずです。 イベント ハンドラーのスコープ外で、documentContentsstringToPrint という名前のクラスに 2 つのプライベート文字列変数を追加します。

    // Declare a string to hold the entire document contents.
    private string documentContents="";
    
    // Declare a variable to hold the portion of the document that
    // is not printed.
    private string stringToPrint="";
    
    ' Declare a string to hold the entire document contents.
    Private documentContents As String
    ' Declare a variable to hold the portion of the document that
    ' is not printed.
    Private stringToPrint As String
    
  6. Click イベント ハンドラーのコードに戻り、DocumentName プロパティを印刷するドキュメントに設定し、ドキュメントの内容を開き、前に追加した文字列に読み込みます。

    string docName = "testPage.txt";
    string docPath = @"C:\";
    string fullPath = System.IO.Path.Combine(docPath, docName);
    printDocument1.DocumentName = docName;
    stringToPrint = System.IO.File.ReadAllText(fullPath);
    
    Dim docName As String = "testPage.txt"
    Dim docPath As String = "C:\Users\v-rsatao\Desktop\"
    Dim fullPath As String = System.IO.Path.Combine(docPath, docName)
    
    PrintDocument1.DocumentName = docName
    stringToPrint = System.IO.File.ReadAllText(fullPath)
    
  7. ドキュメントの印刷の場合と同様、 PrintPage イベント ハンドラーで Graphics クラスの PrintPageEventArgs プロパティと、ファイルの内容を使用して、1 ページあたりの行数を計算し、ドキュメントの内容を表示します。 各ページを描画した後で、最後のページかどうか確認し、PrintPageEventArgsHasMorePages プロパティを適切に設定します。 PrintPageHasMorePages になるまで falseイベントが発生します。 ドキュメントの表示が完了したら、表示される文字列をリセットします。 また、PrintPage イベントがイベント処理メソッドに関連付けられていることを確認します。

    Note

    アプリケーションに印刷を実装済みの場合は、既に手順 5 と手順 6 を完了している可能性があります。

    次のコード例では、イベント ハンドラーが、フォームで使用されているものと同じフォントで "testPage.txt" ファイルの内容を印刷するために使用されます。

    void PrintDocument1_PrintPage(object sender, PrintPageEventArgs e)
    {
        int charactersOnPage = 0;
        int linesPerPage = 0;
    
        // Sets the value of charactersOnPage to the number of characters
        // of stringToPrint that will fit within the bounds of the page.
        e.Graphics.MeasureString(stringToPrint, this.Font,
            e.MarginBounds.Size, StringFormat.GenericTypographic,
            out charactersOnPage, out linesPerPage);
    
        // Draws the string within the bounds of the page.
        e.Graphics.DrawString(stringToPrint, this.Font, Brushes.Black,
        e.MarginBounds, StringFormat.GenericTypographic);
    
        // Remove the portion of the string that has been printed.
        stringToPrint = stringToPrint.Substring(charactersOnPage);
    
        // Check to see if more pages are to be printed.
        e.HasMorePages = (stringToPrint.Length > 0);
    
        // If there are no more pages, reset the string to be printed.
        if (!e.HasMorePages)
            stringToPrint = documentContents;
    }
    
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
    
        Dim charactersOnPage As Integer = 0
        Dim linesPerPage As Integer = 0
    
        ' Sets the value of charactersOnPage to the number of characters 
        ' of stringToPrint that will fit within the bounds of the page.
        e.Graphics.MeasureString(stringToPrint, Me.Font, e.MarginBounds.Size,
            StringFormat.GenericTypographic, charactersOnPage, linesPerPage)
    
        ' Draws the string within the bounds of the page.
        e.Graphics.DrawString(stringToPrint, Me.Font, Brushes.Black,
            e.MarginBounds, StringFormat.GenericTypographic)
    
        ' Remove the portion of the string that has been printed.
        stringToPrint = StringToPrint.Substring(charactersOnPage)
    
        ' Check to see if more pages are to be printed.
        e.HasMorePages = stringToPrint.Length > 0
    
        ' If there are no more pages, reset the string to be printed.
        If Not e.HasMorePages Then
            stringToPrint = documentContents
        End If
    
    End Sub
    
  8. Document コントロールの PrintPreviewDialog のプロパティをフォームの PrintDocument コンポーネントに設定します。

    printPreviewDialog1.Document = printDocument1;
    
    PrintPreviewDialog1.Document = PrintDocument1
    
  9. ShowDialog コントロールの PrintPreviewDialog メソッドを呼び出します。 以下に示す強調表示されたコードに注意してください。通常は、ボタンの Click イベント処理メソッドから ShowDialog を呼び出します。 ShowDialog を呼び出すことで PrintPage イベントが発生し、 PrintPreviewDialog コントロールに出力を表示します。 ユーザーがダイアログの印刷アイコンを選択すると、PrintPage イベントがもう一度発生し、プレビュー ダイアログではなくプリンターに出力を送信します。 このため、手順 4 のレンダリング プロセスの最後に文字列がリセットされます。

    次のコード例は、フォームのボタンの Click イベント処理メソッドを示します。 イベント処理メソッドは、ドキュメントを読み込み、印刷プレビューのダイアログを表示するメソッドを呼び出します。

    private void Button1_Click(object sender, EventArgs e)
    {
        string docName = "testPage.txt";
        string docPath = @"C:\";
        string fullPath = System.IO.Path.Combine(docPath, docName);
        printDocument1.DocumentName = docName;
        stringToPrint = System.IO.File.ReadAllText(fullPath);
    
        printPreviewDialog1.Document = printDocument1;
    
        printPreviewDialog1.ShowDialog();
    }
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
        Dim docName As String = "testPage.txt"
        Dim docPath As String = "C:\Users\v-rsatao\Desktop\"
        Dim fullPath As String = System.IO.Path.Combine(docPath, docName)
    
        PrintDocument1.DocumentName = docName
        stringToPrint = System.IO.File.ReadAllText(fullPath)
    
        PrintPreviewDialog1.Document = PrintDocument1
    
        PrintPreviewDialog1.ShowDialog()
    
    End Sub
    

関連項目