Работа с принтерами
В этой лекции вы узнаете, как:
- печатать графические изображения;
- печатать текст;
- печатать многостраничные документы;
- использовать диалоговые окна Print (Печать), Page Setup (Параметры страницы) и Print Preview (Предварительный просмотр).
Вам предстоит узнать, как добавлять в ваши приложения на основе форм Windows поддержку принтера. На этом изучение дополнительных компонент интерфейса пользователя закончится. Visual Basic .NET поддерживает печать, предоставляя класс PrintDocument и множество его объектов, методов и свойств, осуществляющих процесс печати. В этой лекции вы узнаете, как из программ на Visual Basic печатать графику и текст, управлять многостраничными заданиями печати и добавлять в ваш интерфейс пользователя диалоговые окна печати.
С моей точки зрения, эта лекция является одной из лучших в этой книге. В ней приведено много фрагментов кода, которые вы можете немедленно встраивать в реальные программные проекты. Поддержка печати в Visual Basic .NET не осуществляется автоматически, но процедуры из этой лекции помогут вам печатать длинные документы и отображать полезные диалоговые окна, такие, как Page Setup (Параметры страницы), Print (Печать) и Print Preview (Предварительный просмотр).
Что нового в Visual Basic .NET?
- В Visual Basic 6 печать выполнялась с помощью методов и свойств объекта Printer. Например, метод Printer.Print посылал строку текста на принтер по умолчанию. В Visual Basic .NET печать выполняется с помощью нового класса PrintDocument, который предоставляет больше функций, чем старый метод, но при этом и более сложен.
- В Visual Basic 6 был доступ к одному готовому диалоговому окну для печати - Print (Печать), который предоставлялся ActiveX-элементом управления CommonDialog. В Visual Basic .NET есть доступ к нескольким готовым элементам управления диалоговых окон печати, включая PrintDialog, PrintPreviewDialog и PageSetupDialog.
- Чтобы реализовать в Visual Basic .NET многостраничную печать, необходимо создать обработчик события PrintPage, который печатает каждую страницу вашего документа по отдельности. Хотя управление этим процессом может быть несколько сложным, он упрощается службами из пространства имен System.Drawing.Printing.
Использование класса PrintDocument
Большинство приложений для Microsoft Windows позволяют пользователям печатать созданные ими документы. В том, что касается возможностей печати в программах, Visual Basic .NET значительно превосходит Visual Basic 6, хотя новая функциональность дается не даром. Получить вывод на печать в программах на Visual Basic .NET - нетривиальная задача, и методы, используемые вами, зависят от типа и количества генерируемого вывода для печати. Однако во всех классах базовым механизмом, который управляет печатью в Visual Basic .NET, является класс PrintDocument, который вы можете использовать в проекте, добавив в форму элемент управления PrintDocument, или определив его программно с помощью нескольких строк кода на Visual Basic. Класс PrintDocument предоставляет для печати текста и графики несколько полезных объектов. Объект PrinterSettings содержит настройки принтера по умолчанию, объект PageSettings содержит настройки печати для конкретной страницы, а объект PrintPageEventArgs содержит событийную информацию о печатаемой странице. Класс PrintDocument расположен в пространстве имен System.Drawing.Printing. Если вы добавляете в форму элемент управления PrintDocument, некоторые из объектов класса PrintDocument автоматически встраиваются в ваш проект, но вам по-прежнему требуется добавить в верхнюю часть кода формы следующий оператор Imports:
Imports System.Drawing.Printing
Он определяет PrintPageEventArgs и другие значения.
Чтобы узнать, как использовать класс PrintDocument в вашей программе, выполните следующее упражнение. В нем вы научитесь добавлять в ваш проект элемент управления PrintDocument и использовать его для печати графического файла.
Использование элемента управления PrintDocument
- Запустите Microsoft Visual Studio и создайте в папке c:\vbnet03sbs\ Гл.18 новый проект с именем My Print Graphics. В среде разработки Visual Studio появится пустая форма.
- Используйте элемент управления Label и нарисуйте в верхней части формы метку. Сделайте метку достаточно широкой, чтобы отображать строку, содержащую указания для пользователя.
- Используйте элемент управления TextBox и нарисуйте под меткой текстовое поле. Это поле будет использоваться для ввода имени графического файла, который вы хотите открыть. Для этого будет достаточно однострочного текстового поля.
- Используйте элемент управления Button и нарисуйте под объектом текстового поля кнопку. Эта кнопка будет печатать графический файл. Теперь добавьте в вашу форму элемент управления PrintDocument.
- Прокрутите вниз панель Windows Forms окна Области элементов, пока не увидите элемент управления PrintDocument, а затем сделайте на нем двойной щелчок мышью. Аналогично элементу управления Timer, элемент управления PrintDocument во время выполнения программы не отображается, так что при его создании он помещается в область компонент под формой. Теперь ваш проект имеет доступ к классу PrintDocument и его объектам печати.
-
Установите для объектов формы следующие свойства:
Объект Свойство Установка Label1 Text Введите имя распечатываемого графического файла TextBox1 Text "c:\vbnet03sbs\Гл.16\sun.ico" Button1 Text Печать графики Form1 Text Печать графики Ваша форма будет выглядеть примерно так, как показано на рисунке ниже.
Теперь добавьте код программы, необходимый для печати графического файла (растрового изображения, значка, метафайла, файла JPEG и т.д.).
- Сделайте двойной щелчок мышью на кнопке Печать графики. В Редакторе кода появится процедура события Button1_Click.
-
Прокрутите код формы в самый верх, а затем введите следующий оператор программы:
Imports System.Drawing.Printing
Этот оператор Imports объявляет пространство имен System.Drawing.Printing, которое требуется для определения объекта PrintPageEventArgs в процедуре PrintGraphic. Процедура PrintGraphic будет добавлена на одном из следующих шагов. (Другие объекты PrintDocument получат свои определения из элемента управления PrintDocument.)
-
Теперь снова прокрутите код вниз до процедуры события Button1_Click, а затем введите следующий код программы:
'Печать с использованием обработчика ошибок для перехвата проблем Try AddHandler PrintDocument1.PrintPage, AddressOf Me.PrintGraphic PrintDocument1.Print() 'печать графики Catch ex As Exception 'перехват исключения печати MessageBox.Show("Извините, возникли проблемы с печатью", _ ex.ToString()) End Try
Этот код использует оператор AddHandler, который указывает, что при возникновении события PrintPage объекта PrintDocument1 должен вызываться обработчик события PrintGraphic. В предыдущих лекциях вы видели обработчики ошибок. Обработчик события тесно связан с ними. Он обрабатывает системные события, которые с технической точки зрения не являются ошибками, а представляют собой ключевые действия в жизненном цикле объекта. В данном случае указанный обработчик события связан со службами печати, и запрос к нему содержит конкретную информацию о печатаемой странице, текущих установках принтера и других атрибутах класса PrintDocument. Технически, оператор AddressOf используется для указания обработчика события PrintGraphic, определяя его внутренний адрес и сохраняя его. Оператор AddressOf неявно создает объект, известный как делегат. При возникновении события он передает вызовы в соответствующий обработчик события.
Третья строка этого кода использует для отправки запроса на печать в процедуру события PrintGraphic, которую вы создадите в следующем шаге, метод Print объекта PrintDocument1. Этот запрос на печать расположен внутри блока Try, который перехватывает все проблемы, которые могут возникнуть при выполнении печати. Заметьте, что в блоке Catch я использую несколько иной синтаксис, чем был показан в "Перехват ошибок с помощью структурной обработки ошибок" . Здесь объявляется переменная ex типа Exception, которая содержит подробное сообщение о любой возникающей ошибке. Использование типа Exception является еще одним способом получения условий, которые привели к возникновению ошибки.
-
Прокрутите процедуру события Button1_Click вверх до области глобальных объявлений, расположенной под меткой "Windows Form Designer generated code" ("Код, автоматически созданный конструктором форм Windows"). Введите следующее объявление процедуры:
'Sub для печати графики Private Sub PrintGraphic(ByVal sender As Object, _ ByVal ev As PrintPageEventArgs) ' Создаем графику с помощью DrawImage ev.Graphics.DrawImage(Image.FromFile (TextBox1.Text), _ ev.Graphics.VisibleClipBounds) ' Указываем, что это последняя печатаемая страница ev.HasMorePages = False End Sub
Это процедура обрабатывает событие печати, генерируемое методом PrintDocument1.Print. Я объявил Sub-процедуру в коде формы, но вы также можете объявить ее как процедуру общего назначения и поместить в стандартный модуль. Обратите внимание на переменную ev в списке аргументов процедуры PrintGraphic. Это важный носитель информации о текущей печатаемой странице. Она имеет тип PrintPageEventArgs из пространства имен System.Drawing.Printing.
Чтобы собственно напечатать графику, процедура использует метод Graphics.DrawImage, ассоциированный с текущей печатаемой страницей. Этот метод загружает графический файл, имя которого указано в свойстве Text объекта TextBox1. (По умолчанию я устанавливаю это свойство равным c:\vbnet03sbs\Гл.16\sun.ico - значок Солнца, который использовался в "Добавление графики и эффектов анимации" . Вы можете изменить это значение во время выполнения программы и напечатать любой другой графический файл.) Наконец я установил свойство ev.HasMorePages на значение False, чтобы Visual Basic понял, что задание на печать не содержит много страниц.
- Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на панели инструментов.
Теперь запустите эту программу. Найдите в вашей системе графические файлы, которые вы хотите распечатать. (Просто запомните их пути и введите их в текстовое поле.)