Поделиться через


Печать с помощью предварительного просмотра печати (Windows Forms .NET)

В Windows Forms программирование часто предлагает предварительную версию печати в дополнение к службам печати. Легким способом добавления предварительного просмотра в приложение является использование элемента управления PrintPreviewDialog в сочетании с логикой обработки событий PrintPage для печати файла.

Предварительный просмотр текстового документа с помощью элемента управления PrintPreviewDialog

  1. В Visual Studio используйте область Обозреватель решений и дважды щелкните форму, из которой вы хотите распечатать. Откроется визуальный конструктор.

  2. На панели элементов дважды щелкните PrintDocument компонент и PrintPreviewDialog компонент, чтобы добавить их в форму.

  3. Добавьте в Button форму или используйте кнопку, которая уже находится в форме.

  4. В визуальном конструкторе формы нажмите кнопку. В области "Свойства" нажмите кнопку фильтра событий и дважды щелкните Click событие, чтобы создать обработчик событий.

  5. Click Код события должен быть видимым. Вне область обработчика событий добавьте две частные строковые переменные в класс с именем documentContents иstringToPrint:

    // 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 и содержимое файла. После рисования каждой страницы проверка, чтобы узнать, является ли она последней PrintPageEventArgs страницей, и задайте HasMorePages соответствующее свойство. Событие PrintPage возникает до тех пор, пока значение свойства HasMorePages не станет равно false. После завершения отрисовки документа сбросьте строку, подлежащую отрисовке. Кроме того, убедитесь, что PrintPage событие связано с методом обработки событий.

    Примечание.

    Если вы реализовали печать в приложении, возможно, вы уже выполнили шаг 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 . Обратите внимание, что выделенный код, указанный ниже, обычно вызывается ShowDialog из Click метода обработки событий кнопки. Вызов метода 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
    

См. также