Работа с принтерами
Добавление кода для объектов btnPrint и PrintDocument1
- Снова отобразите форму, а затем дважды щелкните мышью на кнопке Print ( btnPrint ), чтобы вывести в Редакторе кода ее процедуру события.
-
Введите следующий код программы:
Try 'Указываем текущие параметры страницы PrintDocument1.DefaultPageSettings = PrintPageSettings 'Указываем документ для диалогового окна печати и показываем его StringToPrint = RichTextBox1.Text PrintDialog1.Document = PrintDocument1 Dim result As DialogResult = PrintDialog1.ShowDialog() 'Если сделан щелчок на OK, печатаем документ на принтере If result = DialogResult.OK Then PrintDocument1.Print() End If Catch ex As Exception 'Отображаем сообщение об ошибке MessageBox.Show(ex.Message) End Try
Эта процедура события устанавливает параметры принтера по умолчанию для документа и, если пользователь изменил текст в объекте форматированного текста, присваивает содержимое объекта RichTextBox1 строковой переменной StringToPrint (определенной в верхней части кода формы). Затем она открывает диалоговое окно Print и позволяет пользователю настроить любые параметры печати, которые можно изменить (принтер, число копий, опцию печати в файл и т.д.). Если пользователь щелкает на кнопке OK, процедура события посылает задание печати на принтер, вызывая следующий оператор:
PrintDocument1.Print()
- Снова отобразите форму, а затем дважды щелкните мышью на объекте PrintDocument1 в области компонент. Visual Studio добавит в объект PrintDocument1 процедуру события PrintPage.
-
Введите в процедуре события PrintDocument1_PrintPage следующий код программы:
Dim numChars As Integer Dim numLines As Integer Dim stringForPage As String Dim strFormat As New StringFormat 'На основании параметров страницы определяем прямоугольную область 'печати Dim rectDraw As New RectangleF( _ e.MarginBounds.Left, e.MarginBounds.Top, _ e.MarginBounds.Width, e.MarginBounds.Height) 'Определяем область для вычисления объема умещающегося на странице 'текста 'Делаем высоту на одну строку меньше, чтобы гарантировать, что текст не 'будет обрезан Dim sizeMeasure As New SizeF(e.MarginBounds.Width, _ e.MarginBounds.Height - PrintFont.GetHeight(e.Graphics)) 'При печати длинных строк разбиваем их по словам strFormat.Trimming = StringTrimming.Word 'Вычисляем, сколько символов и строк поместится в области sizeMeasure e.Graphics.MeasureString(StringToPrint, PrintFont, _ sizeMeasure, strFormat, numChars, numLines) 'Вычисляем строку, которая уместится на странице stringForPage = StringToPrint.Substring(0, numChars) 'Печатаем строку на текущей странице e.Graphics.DrawString(stringForPage, PrintFont, _ Brushes.Black, rectDraw, strFormat) 'Если еще есть текст, указываем, что есть следующая страница If numChars < StringToPrint.Length Then 'Удаляем из строки уже напечатанный текст StringToPrint = StringToPrint.Substring(numChars) e.HasMorePages = True Else e.HasMorePages = False 'Весь текст был напечатан, так что восстанавливаем строку StringToPrint = RichTextBox1.Text End If
Эта процедура события выполняет собственно печать текстового документа, и делает она это, точно определяя область печати (или прямоугольник области печати) на основе параметров диалогового окна Page Setup. Весь текст, который помещается в этой области, может быть распечатан обычным образом; текст, который выходит за границы этой области, должен быть разбит на несколько строк или страниц, как это происходит в стандартных приложениях Windows.
Область печати определяется с помощью переменной rectDraw, которая основана на классе RectangleF. Для обрезания строк, которые выходят за границу правого поля печати, используются переменная strFormat и метод Trimming. Готовая текстовая строка печатается методом DrawString, которую вы уже использовали в этой лекции. Свойство e.HasMorePages используется для указания того, есть ли еще страницы для печати. Если страниц больше не осталось, свойство HasMorePage устанавливается на значение False, и содержимое переменной StringToPrint становится равным содержимому объекта RichTextBox1.
- Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на панели инструментов.
Здесь пришлось ввести много кода! Запустите программу и посмотрите, как работает печать текстовых файлов на нескольких страницах.