Печать с помощью предварительного просмотра печати (Windows Forms .NET)
В Windows Forms программирование часто предлагает предварительную версию печати в дополнение к службам печати. Легким способом добавления предварительного просмотра в приложение является использование элемента управления PrintPreviewDialog в сочетании с логикой обработки событий PrintPage для печати файла.
Предварительный просмотр текстового документа с помощью элемента управления PrintPreviewDialog
В Visual Studio используйте область Обозреватель решений и дважды щелкните форму, из которой вы хотите распечатать. Откроется визуальный конструктор.
На панели элементов дважды щелкните PrintDocument компонент и PrintPreviewDialog компонент, чтобы добавить их в форму.
Добавьте в
Button
форму или используйте кнопку, которая уже находится в форме.В визуальном конструкторе формы нажмите кнопку. В области "Свойства" нажмите кнопку фильтра событий и дважды щелкните
Click
событие, чтобы создать обработчик событий.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
Вернитесь в
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)
Как и при печати документа, для расчета числа строк на странице и отрисовки содержимого документа в обработчике событий 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
Присвойте свойству Document элемента управления PrintPreviewDialog значение компонента PrintDocument в форме.
printPreviewDialog1.Document = printDocument1;
PrintPreviewDialog1.Document = PrintDocument1
Вызовите метод 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
См. также
.NET Desktop feedback