Visual Basic .NET на уроках информатики

Работа с принтерами

Разбить на страницы
Показывать лекцию целиком

В этой лекции вы узнаете, как:

  • печатать графические изображения;
  • печатать текст;
  • печатать многостраничные документы;
  • использовать диалоговые окна 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 я использую несколько иной синтаксис, чем был показан в лекции 9 . Здесь объявляется переменная 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 - значок Солнца, который использовался в лекции 16 . Вы можете изменить это значение во время выполнения программы и напечатать любой другой графический файл.) Наконец я установил свойство ev.HasMorePages на значение False, чтобы Visual Basic понял, что задание на печать не содержит много страниц.

  • Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на панели инструментов.
  • Теперь запустите эту программу. Найдите в вашей системе графические файлы, которые вы хотите распечатать. (Просто запомните их пути и введите их в текстовое поле.)

    Запуск программы Print Graphics

  • Щелкните на кнопке Start (Начать) панели инструментов.

    Примечание. Готовая программа Print Graphics лежит в папке c:\vbnet03sbs\Гл.18\print graphics.

    Ваша программа запустится на выполнение в среде разработки. Вы увидите такую форму.

  • Включите ваш принтер и убедитесь, что в нем есть бумага.
  • Если вы установили файлы примеров в папку по умолчанию c:\vbnet03sbs, щелкните на кнопке Печать графики и распечатайте значок Sun.ico. Если вы не использовали расположение файлов примеров по умолчанию, или если вы хотите распечатать другой графический файл, измените содержимое текстового поля, а затем щелкните на кнопке Print Graphic. Метод DrawImage увеличит изображение до максимального размера, который может быть напечатан на вашем принтере на одной странице, а затем отправит его на принтер. (Эта функция увеличения позволяет лучше рассмотреть изображение.) Если вы хотите изменить расположение или размер распечатки, поищите в справочной системе Visual Basic термин "Graphics.DrawImage", а затем изучите различные доступные аргументы и их значения и измените код программы. Если вы внимательно посмотрите, то увидите, что когда Visual Basic отправляет ваше задание печати на принтер, появляется следующее диалоговое окно.

    Это окно состояния также является результатом работы класса PrintDocument и предоставляет пользователям профессионально выглядящий интерфейс печати, включая номер для каждой печатаемой страницы.

  • Введите другие пути, а затем щелкните на кнопке Печать графики, чтобы получить новые распечатки.
  • Когда закончите экспериментировать с этой программой, щелкните на кнопке Закрыть формы. Программа остановится. Не плохо для первой попытки печатать из программы на Visual Basic!
  • Печать текста из объекта Text Box

    Вы познакомились с элементом управления PrintDocument и печатью графики. Теперь попробуйте использовать аналогичную методику для печати содержимого текстового поля формы Visual Basic. В следующем упражнении вы создадите проект, который с помощью класса PrintDocument печатает текст, но на этот раз вы определите класс с помощью кода программы, и не будете добавлять элемент управления PrintDocument в вашу форму. В дополнение к этому вы будете использовать для отправки всего содержимого объекта текстового поля на принтер по умолчанию метод Graphics.DrawString.

    Примечание. Следующая программа разработана для печати только одной страницы текста или менее. Чтобы печатать несколько страниц, вы должны добавить дополнительный код программы, который изучается далее в этой лекции.

    Использование метода Graphics.DrawString для печати текста

  • Щелкните на команде Close Solution (Закрыть решение) в меню File (Файл), а затем создайте в папке c:\vbnet03sbs\Гл.18 новый проект с именем My Print Text. Появится пустая форма.
  • Используйте элемент управления Label и нарисуйте в верхней части формы метку. Эта метка также будет отображать строку с инструкциями для пользователя.
  • Используйте элемент управления TextBox и нарисуйте под меткой текстовое поле. Это поле будет содержать текст, который вы хотите распечатать.
  • Установите свойство Multiline этого текстового поля на значение True, а затем увеличьте текстовое поле так, чтобы оно стало достаточно большим для ввода нескольких строк текста.
  • Используйте элемент управления Button и нарисуйте под объектом текстового поля объект кнопки. Этот объект кнопки будет печатать текстовый файл.
  • Установите для объектов формы следующие свойства:

    Объект Свойство Установка
    Label1 Text Введите в объект текстового поля какой-нибудь текст, а затем щелкните на кнопке Печать текста.
    TextBox1 ScrollBars Vertical
    Text пустой (empty)
    Button1 Text Печать текста
    Form1 Text Печать текста

    Ваша форма будет выглядеть примерно так.

    Теперь добавьте код программы, необходимый для печати содержимого текстового поля.

  • Сделайте двойной щелчок мышью на кнопке Печать текста. В Редакторе кода появится процедура события Button1_Click.
  • Прокрутите код формы в самый верх, а затем введите следующее объявление Imports:

    Imports System.Drawing.Printing

    Оно определяет пространство имен System.Drawing.Printing, которое требуется для определения класса PrintDocument и необходимых объектов этого класса.

  • Теперь снова прокрутите код вниз до процедуры события Button1_Click, а затем введите следующий код программы:

    'Печать с использованием обработчика ошибок для перехвата проблем
    Try
    	'Объявляем переменную PrintDoc типа PrintDocument
    	Dim PrintDoc As New PrintDocument
    	AddHandler PrintDoc.PrintPage, AddressOf Me.PrintText
    	PrintDoc.Print()		'печать текста
    	Catch ex As Exception	'перехват исключения печати
    	MessageBox.Show("Извините, возникли проблемы с печатью", _
    	ex.ToString())
    End Try

    Строки, являющиеся новыми или изменившиеся по сравнению с программой Print Graphics, выделены жирным шрифтом. Вместо того чтобы добавлять элемент управления PrintDocument в вашу форму, на этот раз вы просто создали PrintDocument программно. Для этого вы использовали ключевое слово Dim и тип PrintDocument, который был определен в вашей программе при определении пространства имен System.Drawing.Printing. После этого переменная PrintDoc представляет объект PrintDocument и используется для объявления обработчика ошибок и печати текстового документа. Обратите внимание, что для ясности я переименовал процедуру, которая будет обрабатывать событие печати в PrintText (вместо PrintGraphic ).

  • Прокрутите процедуру события Button1_Click в Редакторе кода вверх до области глобальных объявлений. Введите следующее объявление Sub-процедуры:

    'Sub для печати текста
    Private Sub PrintText(ByVal sender As Object, _
    	ByVal ev As PrintPageEventArgs)
    	'Используем DrawString для создания текста в объекте Graphics
    	ev.Graphics.DrawString(TextBox1.Text, New Font("Arial", _
    	11, FontStyle.Regular), Brushes.Black, 120, 120)
    	'Указываем, что это последняя печатаемая страница
    	ev.HasMorePages = False
    End Sub

    Это процедура, которая обрабатывает событие печати, генерируемое методом PrintDoc.Print. Изменения по сравнению с процедурой PrintGraphic из предыдущего упражнения также выделены жирным шрифтом. При печати текста вы используете новый метод. Вместо использования Graphics.DrawImage, который рисует графическое изображение, вы должны использовать Graphics.DrawString, который печатает текстовую строку. Я указал текст для печати в свойстве Text объекта текстового поля, базовое форматирование (Arial, 11 пунктов, обычный стиль, черный цвет) и координаты (x, y) начала печати на странице, равные (120, 120). Это придает печатной странице внешний вид, похожий на текстовое поле на экране. Как и в прошлый раз, я установил свойство ev.HasMorePages на значение False, чтобы указать, что задание на печать не содержит нескольких страниц.

  • Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на панели инструментов.
  • Запустите программу, чтобы увидеть, как печатается объект текстового поля.

    Запуск программы Print Text

  • Щелкните на кнопке Start (Начать) панели инструментов.

    Примечание. Готовая программа Print Text лежит в папке c:\vbnet03sbs\Гл.18\print text.

    Ваша программа запустится в среде разработки.

  • Проверьте, что принтер включен.
  • Введите в текстовое поле какой-нибудь текст. Если вы введете несколько строк, убедитесь, что в конце каждой строки вы ввели возврат каретки. Перенос строк в этой демонстрационной программе не поддерживается - слишком длинные строки будут вылезать за правую границу печати. Ваша форма должна выглядеть примерно так.

  • Щелкните на кнопке Печать текста. Программа отобразит диалоговое окно печати и распечатает содержимое вашего текстового поля.
  • Измените текстовое поле и снова попробуйте его распечатать.
  • Когда вы закончите, щелкните на кнопке Закрыть формы. Программа остановится. Теперь вы знаете, как печатать текст и графику.
  • Печать многостраничных текстовых файлов

    Методики печати, которые вы только что изучили, используются для простых текстовых документов. Они обладают некоторыми ограничениями. Во-первых, метод, который я использовал, не позволяет печатать длинные строки - другими словами, текст, который выходит за рамки полей страницы. В отличие от объекта текстового поля, объект PrintDocument автоматически не переносит строки, когда они выходят за границы печати. Если у вас есть файлы, не содержащие в конце строк символ возврата каретки, вы должны написать код, который обрабатывает эти длинные строки.

    Второе ограничение состоит в том, что программа Print Text не может печатать более одной страницы текста. На самом деле, она вообще не понимает, что такое страница текста - процедура печати просто посылает текст на принтер по умолчанию. Если текстовый блок слишком длинный для одной страницы, то оставшийся текст просто не будет напечатан. Чтобы справиться с многостраничной печатью, вы должны создать виртуальную страницу текста, которая называется PrintPage, а затем добавлять на нее текст до тех пор, пока она не заполнится. Когда эта страница заполнится, она будет отправлена на принтер. Этот процесс продолжается до тех пор, пока весь печатаемый текст не будет отправлен на принтер. После этого задание печати заканчивается.

    Если обработка этих ограничений кажется сложной, не отчаивайтесь - существует несколько удобных механизмов, которые помогают создавать на Visual Basic виртуальные текстовые страницы и печатать текстовые файлы с длинными строками и несколькими страницами текста. Первый механизм - это событие PrintPage, которое возникает при печати страницы. PrintPage получает аргумент типа PrintPageEventArgs, который предоставляет вам размеры и характеристики текущей страницы принтера. Еще одним механизмом является метод Graphics.MeasureString. Метод MeasureString может быть использован для определения того, сколько символов и строк может поместиться в прямоугольной области страницы. Используя эти, а также некоторые другие механизмы, можно довольно просто создать процедуры, которые выполняют многостраничную печать.

    Чтобы создать программу с именем Print File, которая открывает текстовые файлы любой длины и печатает их, выполните следующие действия. Программа Print File также демонстрирует, как использовать элементы управления RichTextBox, PrintDialog и OpenFileDialog. Элемент управления RichTextBox является более мощной версией элемента управления TextBox, который вы использовали только что для отображения текста. Элемент управления PrintDialog отображает стандартное диалоговое окно Print (Печать), так что вы можете указать различные параметры принтера. Элемент управления OpenFileDialog позволяет выбирать текст для печати. (Вы использовали OpenFileDialog в лекции 4.)

    Управление запросами на печать с использованием элементов управления RichTextBox, OpenFileDialog и PrintDialog

  • Щелкните на команде Close Solution (Закрыть решение) в меню File (Файл), а затем создайте в папке c:\vbnet03sbs\Гл.18 новый проект с именем My Print File. Появится пустая форма.
  • Используя элемент управления Button из Области элементов, нарисуйте в верхнем левом углу формы две кнопки. Эта программа имеет простой интерфейс пользователя, но методы печати, о которых вы узнаете, легко адаптируются к более сложным решениям.
  • Щелкните в Области элементов на элементе управления RichTextBox, а затем нарисуйте объект поля форматированного текста, который будет закрывать нижнюю половину формы.
  • Сделайте двойной щелчок мышью на элементе управления OpenFileDialog и добавьте в область компонент под вашей формой объект диалога открытия файла. Вы будете использовать объект диалога открытия файла для поиска текстовых файлов в вашей системе.
  • Сделайте двойной щелчок мышью на элементе управления PrintDocument и добавьте в область компонент объект печати документа. Вы будете использовать объект печати документа для поддержки печати в вашем приложении.
  • Сделайте двойной щелчок мышью на элементе управления PrintDialog и добавьте в область компонент объект диалога печати. Вы будете использовать объект диалога печати для открытия в вашей программе диалогового окна Print (Печать).
  • Теперь установите для объектов формы следующие свойства:

    Объект Свойство Установка
    Button1 Name btnOpen
    Text "Открыть"
    Button2 Name btnPrint
    Enabled False
    Text "Печать"
    RichTextBox1 Text пустой (empty)
    Form1 Text "Печать файла"

    Ваша форма будет выглядеть примерно так, как показано на рисунке ниже.

    Теперь добавьте код программы, необходимый для открытия текстового файла и его печати.

  • Сделайте двойной щелчок мышью на кнопке Открыть. В Редакторе кода появится процедура события btnOpen_Click.
  • Прокрутите код программы в самое начало и введите следующий код:

    Imports System.Drawing.Printing

    Эти определения библиотек делают доступными классы для печати.

  • Переместите курсор под метку "Windows Form Designer generated code" ("Код, автоматически созданный конструктором форм Windows"), а затем введите следующие объявления переменных:

    Private PrintPageSettings As New PageSettings
    Private StringToPrint As String
    Private PrintFont As New Font("Arial", 10)

    Эти операторы определяют важную информацию о печатаемых страницах.

  • Прокрутите код до процедуры события btnOpen_Click, а затем введите следующий код программы:

    Dim AllText, LineOfText As String
    'отображаем диалоговое окно Открыть
    OpenFileDialog1.Filter = "Текстовые файлы (*.TXT)|*.TXT"
    OpenFileDialog1.ShowDialog()
    If OpenFileDialog1.FileName <> "" Then
    	Try 'открываем файл и перехватываем все ошибки с помощью обработчика
    		FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)
    		Do Until EOF(1) 'читаем строки из файла
    			LineOfText = LineInput(1)
    			'добавляем каждую строку в переменную AllText
    			AllText = AllText  LineOfText  vbCrLf
    		Loop                   'обновляем метку
    		RichTextBox1.Text = AllText  'отображаем файл
    		RichTextBox1.Select(1, 0)   'удаляем выделение текста
    		RichTextBox1.Enabled = True 'включаем текстовый курсор
    		'Включаем кнопку Print
    		btnPrint.Enabled = True
    	Catch ex As Exception
    		'display error messages if they appear
    		MessageBox.Show(ex.Message)
    	Finally
    		FileClose(1) 'закрываем файл
    	End Try
    End If

    Когда пользователь щелкает на кнопке Открыть, эта процедура события отображает диалоговое окно Open, используя для него фильтр, который отображает только текстовые файлы. Когда пользователь выбирает файл, имя файла присваивается открытой строковой переменной с именем FilePath, которая объявлена в верхней части процедуры события. Затем процедура использует для загрузки текстового файла в объект RichTextBox1 обработчик ошибок Try...Catch. Наконец, процедура события включает кнопку Print ( btnPrint ), так что пользователь может распечатать файл. Эта процедура открывает файл и включает кнопку печати в форме, но не выполняет самой печати.

  • Теперь добавьте необходимый код программы, который отображает диалоговое окно Print и печатает файл с помощью логики, отслеживающей размеры текущей тестовой страницы.

    Добавление кода для объектов 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 (Сохранить все) на панели инструментов.
  • Здесь пришлось ввести много кода! Запустите программу и посмотрите, как работает печать текстовых файлов на нескольких страницах.

    Запуск программы Print File

  • Щелкните на кнопке Start (Начать) панели инструментов.

    Примечание. Готовая программа Print File лежит в папке c:\vbnet03sbs\Гл.18\print File.

    Ваша программа запустится на выполнение в среде разработки. Обратите внимание, что кнопка Печать при этом отключена, так как вы еще не выбрали файл.

  • Щелкните на кнопке Открыть. Программа отобразит диалоговое окно Открыть.
  • Перейдите в папку c:\vbnet03sbs\Гл.18, а затем щелкните на файле longFile.txt. Ваше диалоговое окно будет выглядеть так.

  • Чтобы выбрать этот файл, щелкните на Открыть. Ваша программа загрузит текстовый файл в объект поля форматированного текста, а затем включит кнопку Печать. Этот файл имеет большой размер и в нем есть строки, которые переносятся так, что вы сможете протестировать возможность указания ширины печати и многостраничную печать. Ваша форма будет выглядеть примерно так.

  • Убедитесь, что ваш принтер включен, а затем щелкните на кнопке Печать.
  • Visual Basic отобразит диалоговое окно Печать, показанное на следующей иллюстрации.

    Будут активизированы многие опции диалогового окна Печать, и вы можете поэкспериментировать с ними, как вы делаете это в обычном приложении Windows.

  • Щелкните на OK, чтобы напечатать документ. Ваша программа передаст на принтер задание на печать четырех страниц. Через некоторое время ваш принтер начнет печатать документ. Как и в предыдущих упражнениях, автоматически появится диалоговое окно, показывающее состояние печати и информирующее о том, сколько будет напечатано страниц документа.
  • Чтобы завершить выполнение программы, щелкните на кнопке Закрыть формы. Программа остановится. Вы только что создали набор универсальных процедур печати!
  • Следующий шаг: добавление диалоговых окон Print Preview и Page Setup

    Приложение Print File готово к выполнению нескольких заданий печати, но ее интерфейс не настолько нагляден, как в коммерческих приложениях Windows. Вы можете сделать вашу программу более гибкой и интересной, добавив в нее несколько вспомогательных диалоговых окон, дополняющих диалоговое окно Печать, с которым вы экспериментировали в предыдущем упражнении. На закладке Windows Forms окна Области элементов доступны следующие дополнительные элементы управления печатью, которые работают аналогично элементам управления PrintDialog и OpenFileDialog, которые вы уже использовали:

  • PrintPreviewDialog - элемент управления, который отображает диалоговое окно Print Preview (Предварительный просмотр);
  • PageSetupDialog - элемент управления, который отображает диалоговое окно Page Setup (Параметры страницы).
  • Как и другие диалоговые окна, эти элементы управления печатью могут быть добавлены с помощью Области элементов или созданы программно.

    В следующем упражнении вы добавите в программу Print File, с которой вы только что работали, диалоговые окна предварительного просмотра печати и параметров страницы. В готовых файлах практических занятий я назвал этот проект Print Dialogs, так что вы можете сразу перейти к готовому коду проекта, но если хотите, можете просто добавить функции диалоговых окон непосредственно в проект Print File.

    Добавление элементов управления PrintPreviewDialog и PageSetupDialog

  • Если вы не выполняли последнее упражнение, откройте проект Print File из папки c:\vbnet03sbs\Гл.18\print File. Проект Print File является отправной точкой этого проекта.
  • Отобразите форму, а затем используйте элемент управления Button и добавьте в верхней части формы две дополнительные кнопки.
  • Дважды щелкните мышью в окне Области элементов на элементе управления PrintPreviewDialog на закладке Windows Forms. Объект диалога предварительного просмотра печати добавится в область компонент.
  • Дважды щелкните мышью в окне Области элементов на элементе управления PageSetupDialog на закладке Windows Forms. В область компонент добавится объект диалога параметров страницы. Если эти объекты в области компонент закрывают друг друга, вы можете перетащить их и разместить более удобно, а можете щелкнуть правой кнопкой мыши на области компонент и выбрать опцию Line Up Icons (Упорядочить значки).
  • Установите для объектов кнопок формы следующие свойства:

    Объект Свойство Установка
    Button1 Name btnSetup
    Enabled False
    Text Параметры страницы
    Button2 Name btnPreview
    Enabled False
    Text Предварительный просмотр

    Ваша форма будет выглядеть примерно так.

  • Чтобы отобразить в Редакторе кода процедуру события btnSetup_Click, дважды щелкните мышью на кнопке Параметры страницы ( btnSetup ).
  • Введите следующий код программы:

    Try
    	'Загружаем параметры страницы и отображаем диалоговое окно
    	'параметров страницы
    	PageSetupDialog1.PageSettings = PrintPageSettings
    	PageSetupDialog1.ShowDialog()
    	Catch ex As Exception
    	'Отображаем сообщение об ошибке
    	MessageBox.Show(ex.Message)
    End Try

    Код для создания диалогового окна Параметры страницы в этой программе довольно прост, так как в верхней части кода формы уже была определена переменная PrintPageSettings. Эта переменная хранит информацию об определении текущей страницы. Когда она присваивается свойству PageSettings объекта PageSetupDialog1, метод ShowDialog автоматически загружает диалоговое окно, которое позволяет пользователю ориентацию страницы, полей и другие параметры страницы. Обработчик ошибок Try...Catch просто обрабатывает все ошибки, которые могут произойти при использовании метода ShowDialog.

  • Снова отобразите форму, а затем дважды щелкните мышью на кнопке Предварительный просмотр (btnPreview), чтобы отобразить процедуру события btnPreview_Click.
  • Введите следующий код программы:

    Try
    	'Указываем текущие параметры страницы
    	PrintDocument1.DefaultPageSettings = PrintPageSettings
    	'Указываем документ для диалогового окна предварительного просмотра
    	'и показываем его
    	StringToPrint = RichTextBox1.Text
    	PrintPreviewDialog1.Document = PrintDocument1
    	PrintPreviewDialog1.ShowDialog()
    	Catch ex As Exception
    	'Отображаем сообщение об ошибке
    	MessageBox.Show(ex.Message)
    End Try

    Аналогичным образом процедура события btnPreview_Click присваивает переменную PrintPageSettings свойству DefaultPageSettings объекта PrintDocument1, а затем копирует текст из объекта форматированного текста в переменную StringToPrint и открывает диалоговое окно Предварительный просмотр. Предварительный просмотр автоматически использует данные параметров страницы для отображения визуального представления документа так, как он будет напечатан - вам не требуется отображать эту информацию вручную. Теперь сделайте небольшое изменение в коде программы в процедуре события btnOpen_Click.

  • Прокрутите код в Редакторе кода до процедуры события btnOpen_Click. Это процедура, которая отображает диалоговое окно Открыть, открывает текстовый файл и включает кнопку печати. Так как вы только что добавили две новые кнопки печати, добавьте код программы, чтобы включать кнопки Параметры страницы и Предварительный просмотр.
  • Прокрутите код в конец этой процедуры события непосредственно перед блоком кода Catch и найдите следующий оператор программы:

    btnPrint.Enabled = True
  • Под этим оператором добавьте следующие строки кода:

    btnSetup.Enabled = True
    btnPreview.Enabled = True

    Теперь ваша программа включит кнопки печати, когда будет открыт документ для печати.

  • Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на панели инструментов.
  • Тестирование функций Page Setup и Print Preview

  • Щелкните на кнопке Start (Начать) панели инструментов.

    Примечание. Готовая программа Print Dialogs лежит в папке c:\vbnet03sbs\Гл.18\print dialogs.

    Программа запустится, и будет включена только первая кнопка.

  • Щелкните на кнопке Открыть, а затем откройте файл longFile.txt, расположенный в папке c:\vbnet03sbs\Гл.18. После этого включатся три остальные кнопки, как показано ниже.

  • Щелкните на кнопке Параметры страницы. Ваша программа откроет диалоговое окно Page Setup, показанное ниже.

    Page Setup содержит множество полезных опций, включая возможность изменить размер и источник страниц, ориентацию печати: Portrait (Портретная) или Landscape (Альбомная); и поля страниц: Left (левое), Right (правое), Top (верхнее) и Bottom (нижнее).

  • Измените поле Left на 2, а затем щелкните на OK. Левое поле теперь будет равно 2 дюймам.
  • Щелкните на кнопке Предварительный просмотр. Ваша программа откроет диалоговое окно Предварительный просмотр, показанное на следующей иллюстрации.

    Диалоговое окно Предварительный просмотр имеет несколько знакомых кнопок и функций предварительного просмотра, особенно если вы использовали команду Предварительный просмотр из Microsoft Word или Microsoft Excel. Элементы управления Zoom (Масштаб), One Page (Одна страница), Two Pages (Две страницы), Three Pages (Три страницы), Four Pages (Четыре страницы), Six Pages (Шесть страниц) и Page Select (Выбор страницы) этого диалогового окна работают автоматически. Для их работы не требуется никакого кода.

  • Щелкните на кнопке Four Pages (Четыре страницы), чтобы увидеть одновременно четыре страницы вашего документа.
  • Чтобы увидеть полный размер окна Предварительный просмотр, дважды щелкните мышью на кнопке Maximize в строке его заголовка.
  • Щелкните на стрелке справа от кнопки Zoom (Масштаб) и на 150%. Ваш экран будет выглядеть примерно так, как показано на рисунке на следующей странице.
  • Щелкните на кнопке One Page (Одна страница), а затем на стрелке вверх поля Page Select, чтобы увидеть страницы 2-4. Это окно Предварительный просмотр впечатляет - и вы встроили его в вашу программу, добавив всего несколько строк кода!

  • Щелкните на кнопке Закрыть, чтобы закрыть диалоговое окно Предварительный просмотр, а затем на кнопке Закрыть, чтобы закрыть программу. На этом работа с принтерами пока закончена.
  • Краткая справка по лекции 18

    Чтобы Сделайте следующее
    Встроить в ваши проекты класс PrintDocument и подготовить печать

    Добавьте в верхнюю часть кода формы следующий оператор Imports:

    Imports System.Drawing.Printing
    Создать обработчик события печати

    Используйте оператор AddHandler и оператор AddressOf. Например:

    AddHandler PrintDocument1.PrintPage, _
    AddressOf Me.PrintGraphic
    Создать в вашем проекте объект PrintDocument

    Сделайте двойной щелчок мышью в окне Toolbox (Область элементов) на элементе управления PrintDocument на закладке Windows Forms или включите в ваш код программы следующее объявление переменной:

    Dim PrintDoc As New PrintDocument
    Напечатать графику из обработчика события печати

    Используйте метод Graphics.DrawImage. Например:

    ev.Graphics.DrawImage(Image.FromFile _
    (TextBox1.Text), ev.Graphics.VisibleClipBounds)
    Напечатать текст из обработчика события печати

    Используйте в обработчике события метод Graphics.DrawString. Например:

    ev.Graphics.DrawString(TextBox1.Text, _
    New Font("Arial", 11, FontStyle.Regular), _
    Brushes.Black, 120, 120)
    Вызвать обработчик события печати

    Используйте метод Print объекта типа PrintDocument. Например:

    PrintDoc.Print()
    Напечатать многостраничный текстовый документ Напишите обработчик для события PrintPage, который получает аргумент типа PrintPageEventArgs. Затем вычислите прямоугольную область страницы, используйте метод MeasureString для определения того, сколько текста влезет на текущую страницу, и метод DrawString для печати этого текста на странице. Если требуется напечатать дополнительные страницы, установите свойство HasMorePages на значение True. Когда все страницы будут напечатаны, установите HasMorePages на значение False.
    Открыть текстовый файл с помощью класса FileStream и загрузить его в объект RichTextBox

    Создайте переменную типа FileStream, указав путь и режим открытия файла, загрузите поток в RichTextBox, а затем закройте поток. Например:

    Imports System.IO	'в верхней части формы
    ...
    Dim MyFileStream As New FileStream( _
    FilePath, FileMode.Open)
    RichTextBox1.LoadFile(MyFileStream, _
    RichTextBoxStreamType.PlainText)
    MyFileStream.Close()
    Отобразить в программе диалоговые окна печати Используйте элементы управления PrintDialog, PrintPreviewDialog и PageSetupDialog, расположенные на закладке Windows Forms окна Области элементов.
    Страницы:

    В этой лекции вы узнаете, как:

  • печатать графические изображения;
  • печатать текст;
  • печатать многостраничные документы;
  • использовать диалоговые окна 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 я использую несколько иной синтаксис, чем был показан в лекции 9 . Здесь объявляется переменная 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 - значок Солнца, который использовался в лекции 16 . Вы можете изменить это значение во время выполнения программы и напечатать любой другой графический файл.) Наконец я установил свойство ev.HasMorePages на значение False, чтобы Visual Basic понял, что задание на печать не содержит много страниц.

  • Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на панели инструментов.
  • Теперь запустите эту программу. Найдите в вашей системе графические файлы, которые вы хотите распечатать. (Просто запомните их пути и введите их в текстовое поле.)

    Запуск программы Print Graphics

  • Щелкните на кнопке Start (Начать) панели инструментов.

    Примечание. Готовая программа Print Graphics лежит в папке c:\vbnet03sbs\Гл.18\print graphics.

    Ваша программа запустится на выполнение в среде разработки. Вы увидите такую форму.

  • Включите ваш принтер и убедитесь, что в нем есть бумага.
  • Если вы установили файлы примеров в папку по умолчанию c:\vbnet03sbs, щелкните на кнопке Печать графики и распечатайте значок Sun.ico. Если вы не использовали расположение файлов примеров по умолчанию, или если вы хотите распечатать другой графический файл, измените содержимое текстового поля, а затем щелкните на кнопке Print Graphic. Метод DrawImage увеличит изображение до максимального размера, который может быть напечатан на вашем принтере на одной странице, а затем отправит его на принтер. (Эта функция увеличения позволяет лучше рассмотреть изображение.) Если вы хотите изменить расположение или размер распечатки, поищите в справочной системе Visual Basic термин "Graphics.DrawImage", а затем изучите различные доступные аргументы и их значения и измените код программы. Если вы внимательно посмотрите, то увидите, что когда Visual Basic отправляет ваше задание печати на принтер, появляется следующее диалоговое окно.

    Это окно состояния также является результатом работы класса PrintDocument и предоставляет пользователям профессионально выглядящий интерфейс печати, включая номер для каждой печатаемой страницы.

  • Введите другие пути, а затем щелкните на кнопке Печать графики, чтобы получить новые распечатки.
  • Когда закончите экспериментировать с этой программой, щелкните на кнопке Закрыть формы. Программа остановится. Не плохо для первой попытки печатать из программы на Visual Basic!
  • Печать текста из объекта Text Box

    Вы познакомились с элементом управления PrintDocument и печатью графики. Теперь попробуйте использовать аналогичную методику для печати содержимого текстового поля формы Visual Basic. В следующем упражнении вы создадите проект, который с помощью класса PrintDocument печатает текст, но на этот раз вы определите класс с помощью кода программы, и не будете добавлять элемент управления PrintDocument в вашу форму. В дополнение к этому вы будете использовать для отправки всего содержимого объекта текстового поля на принтер по умолчанию метод Graphics.DrawString.

    Примечание. Следующая программа разработана для печати только одной страницы текста или менее. Чтобы печатать несколько страниц, вы должны добавить дополнительный код программы, который изучается далее в этой лекции.

    Использование метода Graphics.DrawString для печати текста

  • Щелкните на команде Close Solution (Закрыть решение) в меню File (Файл), а затем создайте в папке c:\vbnet03sbs\Гл.18 новый проект с именем My Print Text. Появится пустая форма.
  • Используйте элемент управления Label и нарисуйте в верхней части формы метку. Эта метка также будет отображать строку с инструкциями для пользователя.
  • Используйте элемент управления TextBox и нарисуйте под меткой текстовое поле. Это поле будет содержать текст, который вы хотите распечатать.
  • Установите свойство Multiline этого текстового поля на значение True, а затем увеличьте текстовое поле так, чтобы оно стало достаточно большим для ввода нескольких строк текста.
  • Используйте элемент управления Button и нарисуйте под объектом текстового поля объект кнопки. Этот объект кнопки будет печатать текстовый файл.
  • Установите для объектов формы следующие свойства:

    Объект Свойство Установка
    Label1 Text Введите в объект текстового поля какой-нибудь текст, а затем щелкните на кнопке Печать текста.
    TextBox1 ScrollBars Vertical
    Text пустой (empty)
    Button1 Text Печать текста
    Form1 Text Печать текста

    Ваша форма будет выглядеть примерно так.

    Теперь добавьте код программы, необходимый для печати содержимого текстового поля.

  • Сделайте двойной щелчок мышью на кнопке Печать текста. В Редакторе кода появится процедура события Button1_Click.
  • Прокрутите код формы в самый верх, а затем введите следующее объявление Imports:

    Imports System.Drawing.Printing

    Оно определяет пространство имен System.Drawing.Printing, которое требуется для определения класса PrintDocument и необходимых объектов этого класса.

  • Теперь снова прокрутите код вниз до процедуры события Button1_Click, а затем введите следующий код программы:

    'Печать с использованием обработчика ошибок для перехвата проблем
    Try
    	'Объявляем переменную PrintDoc типа PrintDocument
    	Dim PrintDoc As New PrintDocument
    	AddHandler PrintDoc.PrintPage, AddressOf Me.PrintText
    	PrintDoc.Print()		'печать текста
    	Catch ex As Exception	'перехват исключения печати
    	MessageBox.Show("Извините, возникли проблемы с печатью", _
    	ex.ToString())
    End Try

    Строки, являющиеся новыми или изменившиеся по сравнению с программой Print Graphics, выделены жирным шрифтом. Вместо того чтобы добавлять элемент управления PrintDocument в вашу форму, на этот раз вы просто создали PrintDocument программно. Для этого вы использовали ключевое слово Dim и тип PrintDocument, который был определен в вашей программе при определении пространства имен System.Drawing.Printing. После этого переменная PrintDoc представляет объект PrintDocument и используется для объявления обработчика ошибок и печати текстового документа. Обратите внимание, что для ясности я переименовал процедуру, которая будет обрабатывать событие печати в PrintText (вместо PrintGraphic ).

  • Прокрутите процедуру события Button1_Click в Редакторе кода вверх до области глобальных объявлений. Введите следующее объявление Sub-процедуры:

    'Sub для печати текста
    Private Sub PrintText(ByVal sender As Object, _
    	ByVal ev As PrintPageEventArgs)
    	'Используем DrawString для создания текста в объекте Graphics
    	ev.Graphics.DrawString(TextBox1.Text, New Font("Arial", _
    	11, FontStyle.Regular), Brushes.Black, 120, 120)
    	'Указываем, что это последняя печатаемая страница
    	ev.HasMorePages = False
    End Sub

    Это процедура, которая обрабатывает событие печати, генерируемое методом PrintDoc.Print. Изменения по сравнению с процедурой PrintGraphic из предыдущего упражнения также выделены жирным шрифтом. При печати текста вы используете новый метод. Вместо использования Graphics.DrawImage, который рисует графическое изображение, вы должны использовать Graphics.DrawString, который печатает текстовую строку. Я указал текст для печати в свойстве Text объекта текстового поля, базовое форматирование (Arial, 11 пунктов, обычный стиль, черный цвет) и координаты (x, y) начала печати на странице, равные (120, 120). Это придает печатной странице внешний вид, похожий на текстовое поле на экране. Как и в прошлый раз, я установил свойство ev.HasMorePages на значение False, чтобы указать, что задание на печать не содержит нескольких страниц.

  • Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на панели инструментов.
  • Запустите программу, чтобы увидеть, как печатается объект текстового поля.

    Запуск программы Print Text

  • Щелкните на кнопке Start (Начать) панели инструментов.

    Примечание. Готовая программа Print Text лежит в папке c:\vbnet03sbs\Гл.18\print text.

    Ваша программа запустится в среде разработки.

  • Проверьте, что принтер включен.
  • Введите в текстовое поле какой-нибудь текст. Если вы введете несколько строк, убедитесь, что в конце каждой строки вы ввели возврат каретки. Перенос строк в этой демонстрационной программе не поддерживается - слишком длинные строки будут вылезать за правую границу печати. Ваша форма должна выглядеть примерно так.

  • Щелкните на кнопке Печать текста. Программа отобразит диалоговое окно печати и распечатает содержимое вашего текстового поля.
  • Измените текстовое поле и снова попробуйте его распечатать.
  • Когда вы закончите, щелкните на кнопке Закрыть формы. Программа остановится. Теперь вы знаете, как печатать текст и графику.
  • Печать многостраничных текстовых файлов

    Методики печати, которые вы только что изучили, используются для простых текстовых документов. Они обладают некоторыми ограничениями. Во-первых, метод, который я использовал, не позволяет печатать длинные строки - другими словами, текст, который выходит за рамки полей страницы. В отличие от объекта текстового поля, объект PrintDocument автоматически не переносит строки, когда они выходят за границы печати. Если у вас есть файлы, не содержащие в конце строк символ возврата каретки, вы должны написать код, который обрабатывает эти длинные строки.

    Второе ограничение состоит в том, что программа Print Text не может печатать более одной страницы текста. На самом деле, она вообще не понимает, что такое страница текста - процедура печати просто посылает текст на принтер по умолчанию. Если текстовый блок слишком длинный для одной страницы, то оставшийся текст просто не будет напечатан. Чтобы справиться с многостраничной печатью, вы должны создать виртуальную страницу текста, которая называется PrintPage, а затем добавлять на нее текст до тех пор, пока она не заполнится. Когда эта страница заполнится, она будет отправлена на принтер. Этот процесс продолжается до тех пор, пока весь печатаемый текст не будет отправлен на принтер. После этого задание печати заканчивается.

    Если обработка этих ограничений кажется сложной, не отчаивайтесь - существует несколько удобных механизмов, которые помогают создавать на Visual Basic виртуальные текстовые страницы и печатать текстовые файлы с длинными строками и несколькими страницами текста. Первый механизм - это событие PrintPage, которое возникает при печати страницы. PrintPage получает аргумент типа PrintPageEventArgs, который предоставляет вам размеры и характеристики текущей страницы принтера. Еще одним механизмом является метод Graphics.MeasureString. Метод MeasureString может быть использован для определения того, сколько символов и строк может поместиться в прямоугольной области страницы. Используя эти, а также некоторые другие механизмы, можно довольно просто создать процедуры, которые выполняют многостраничную печать.

    Чтобы создать программу с именем Print File, которая открывает текстовые файлы любой длины и печатает их, выполните следующие действия. Программа Print File также демонстрирует, как использовать элементы управления RichTextBox, PrintDialog и OpenFileDialog. Элемент управления RichTextBox является более мощной версией элемента управления TextBox, который вы использовали только что для отображения текста. Элемент управления PrintDialog отображает стандартное диалоговое окно Print (Печать), так что вы можете указать различные параметры принтера. Элемент управления OpenFileDialog позволяет выбирать текст для печати. (Вы использовали OpenFileDialog в лекции 4.)

    Управление запросами на печать с использованием элементов управления RichTextBox, OpenFileDialog и PrintDialog

  • Щелкните на команде Close Solution (Закрыть решение) в меню File (Файл), а затем создайте в папке c:\vbnet03sbs\Гл.18 новый проект с именем My Print File. Появится пустая форма.
  • Используя элемент управления Button из Области элементов, нарисуйте в верхнем левом углу формы две кнопки. Эта программа имеет простой интерфейс пользователя, но методы печати, о которых вы узнаете, легко адаптируются к более сложным решениям.
  • Щелкните в Области элементов на элементе управления RichTextBox, а затем нарисуйте объект поля форматированного текста, который будет закрывать нижнюю половину формы.
  • Сделайте двойной щелчок мышью на элементе управления OpenFileDialog и добавьте в область компонент под вашей формой объект диалога открытия файла. Вы будете использовать объект диалога открытия файла для поиска текстовых файлов в вашей системе.
  • Сделайте двойной щелчок мышью на элементе управления PrintDocument и добавьте в область компонент объект печати документа. Вы будете использовать объект печати документа для поддержки печати в вашем приложении.
  • Сделайте двойной щелчок мышью на элементе управления PrintDialog и добавьте в область компонент объект диалога печати. Вы будете использовать объект диалога печати для открытия в вашей программе диалогового окна Print (Печать).
  • Теперь установите для объектов формы следующие свойства:

    Объект Свойство Установка
    Button1 Name btnOpen
    Text "Открыть"
    Button2 Name btnPrint
    Enabled False
    Text "Печать"
    RichTextBox1 Text пустой (empty)
    Form1 Text "Печать файла"

    Ваша форма будет выглядеть примерно так, как показано на рисунке ниже.

    Теперь добавьте код программы, необходимый для открытия текстового файла и его печати.

  • Сделайте двойной щелчок мышью на кнопке Открыть. В Редакторе кода появится процедура события btnOpen_Click.
  • Прокрутите код программы в самое начало и введите следующий код:

    Imports System.Drawing.Printing

    Эти определения библиотек делают доступными классы для печати.

  • Переместите курсор под метку "Windows Form Designer generated code" ("Код, автоматически созданный конструктором форм Windows"), а затем введите следующие объявления переменных:

    Private PrintPageSettings As New PageSettings
    Private StringToPrint As String
    Private PrintFont As New Font("Arial", 10)

    Эти операторы определяют важную информацию о печатаемых страницах.

  • Прокрутите код до процедуры события btnOpen_Click, а затем введите следующий код программы:

    Dim AllText, LineOfText As String
    'отображаем диалоговое окно Открыть
    OpenFileDialog1.Filter = "Текстовые файлы (*.TXT)|*.TXT"
    OpenFileDialog1.ShowDialog()
    If OpenFileDialog1.FileName <> "" Then
    	Try 'открываем файл и перехватываем все ошибки с помощью обработчика
    		FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input)
    		Do Until EOF(1) 'читаем строки из файла
    			LineOfText = LineInput(1)
    			'добавляем каждую строку в переменную AllText
    			AllText = AllText  LineOfText  vbCrLf
    		Loop                   'обновляем метку
    		RichTextBox1.Text = AllText  'отображаем файл
    		RichTextBox1.Select(1, 0)   'удаляем выделение текста
    		RichTextBox1.Enabled = True 'включаем текстовый курсор
    		'Включаем кнопку Print
    		btnPrint.Enabled = True
    	Catch ex As Exception
    		'display error messages if they appear
    		MessageBox.Show(ex.Message)
    	Finally
    		FileClose(1) 'закрываем файл
    	End Try
    End If

    Когда пользователь щелкает на кнопке Открыть, эта процедура события отображает диалоговое окно Open, используя для него фильтр, который отображает только текстовые файлы. Когда пользователь выбирает файл, имя файла присваивается открытой строковой переменной с именем FilePath, которая объявлена в верхней части процедуры события. Затем процедура использует для загрузки текстового файла в объект RichTextBox1 обработчик ошибок Try...Catch. Наконец, процедура события включает кнопку Print ( btnPrint ), так что пользователь может распечатать файл. Эта процедура открывает файл и включает кнопку печати в форме, но не выполняет самой печати.

  • Теперь добавьте необходимый код программы, который отображает диалоговое окно Print и печатает файл с помощью логики, отслеживающей размеры текущей тестовой страницы.

    Добавление кода для объектов 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 (Сохранить все) на панели инструментов.
  • Здесь пришлось ввести много кода! Запустите программу и посмотрите, как работает печать текстовых файлов на нескольких страницах.

    Запуск программы Print File

  • Щелкните на кнопке Start (Начать) панели инструментов.

    Примечание. Готовая программа Print File лежит в папке c:\vbnet03sbs\Гл.18\print File.

    Ваша программа запустится на выполнение в среде разработки. Обратите внимание, что кнопка Печать при этом отключена, так как вы еще не выбрали файл.

  • Щелкните на кнопке Открыть. Программа отобразит диалоговое окно Открыть.
  • Перейдите в папку c:\vbnet03sbs\Гл.18, а затем щелкните на файле longFile.txt. Ваше диалоговое окно будет выглядеть так.

  • Чтобы выбрать этот файл, щелкните на Открыть. Ваша программа загрузит текстовый файл в объект поля форматированного текста, а затем включит кнопку Печать. Этот файл имеет большой размер и в нем есть строки, которые переносятся так, что вы сможете протестировать возможность указания ширины печати и многостраничную печать. Ваша форма будет выглядеть примерно так.

  • Убедитесь, что ваш принтер включен, а затем щелкните на кнопке Печать.
  • Visual Basic отобразит диалоговое окно Печать, показанное на следующей иллюстрации.

    Будут активизированы многие опции диалогового окна Печать, и вы можете поэкспериментировать с ними, как вы делаете это в обычном приложении Windows.

  • Щелкните на OK, чтобы напечатать документ. Ваша программа передаст на принтер задание на печать четырех страниц. Через некоторое время ваш принтер начнет печатать документ. Как и в предыдущих упражнениях, автоматически появится диалоговое окно, показывающее состояние печати и информирующее о том, сколько будет напечатано страниц документа.
  • Чтобы завершить выполнение программы, щелкните на кнопке Закрыть формы. Программа остановится. Вы только что создали набор универсальных процедур печати!
  • Следующий шаг: добавление диалоговых окон Print Preview и Page Setup

    Приложение Print File готово к выполнению нескольких заданий печати, но ее интерфейс не настолько нагляден, как в коммерческих приложениях Windows. Вы можете сделать вашу программу более гибкой и интересной, добавив в нее несколько вспомогательных диалоговых окон, дополняющих диалоговое окно Печать, с которым вы экспериментировали в предыдущем упражнении. На закладке Windows Forms окна Области элементов доступны следующие дополнительные элементы управления печатью, которые работают аналогично элементам управления PrintDialog и OpenFileDialog, которые вы уже использовали:

  • PrintPreviewDialog - элемент управления, который отображает диалоговое окно Print Preview (Предварительный просмотр);
  • PageSetupDialog - элемент управления, который отображает диалоговое окно Page Setup (Параметры страницы).
  • Как и другие диалоговые окна, эти элементы управления печатью могут быть добавлены с помощью Области элементов или созданы программно.

    В следующем упражнении вы добавите в программу Print File, с которой вы только что работали, диалоговые окна предварительного просмотра печати и параметров страницы. В готовых файлах практических занятий я назвал этот проект Print Dialogs, так что вы можете сразу перейти к готовому коду проекта, но если хотите, можете просто добавить функции диалоговых окон непосредственно в проект Print File.

    Добавление элементов управления PrintPreviewDialog и PageSetupDialog

  • Если вы не выполняли последнее упражнение, откройте проект Print File из папки c:\vbnet03sbs\Гл.18\print File. Проект Print File является отправной точкой этого проекта.
  • Отобразите форму, а затем используйте элемент управления Button и добавьте в верхней части формы две дополнительные кнопки.
  • Дважды щелкните мышью в окне Области элементов на элементе управления PrintPreviewDialog на закладке Windows Forms. Объект диалога предварительного просмотра печати добавится в область компонент.
  • Дважды щелкните мышью в окне Области элементов на элементе управления PageSetupDialog на закладке Windows Forms. В область компонент добавится объект диалога параметров страницы. Если эти объекты в области компонент закрывают друг друга, вы можете перетащить их и разместить более удобно, а можете щелкнуть правой кнопкой мыши на области компонент и выбрать опцию Line Up Icons (Упорядочить значки).
  • Установите для объектов кнопок формы следующие свойства:

    Объект Свойство Установка
    Button1 Name btnSetup
    Enabled False
    Text Параметры страницы
    Button2 Name btnPreview
    Enabled False
    Text Предварительный просмотр

    Ваша форма будет выглядеть примерно так.

  • Чтобы отобразить в Редакторе кода процедуру события btnSetup_Click, дважды щелкните мышью на кнопке Параметры страницы ( btnSetup ).
  • Введите следующий код программы:

    Try
    	'Загружаем параметры страницы и отображаем диалоговое окно
    	'параметров страницы
    	PageSetupDialog1.PageSettings = PrintPageSettings
    	PageSetupDialog1.ShowDialog()
    	Catch ex As Exception
    	'Отображаем сообщение об ошибке
    	MessageBox.Show(ex.Message)
    End Try

    Код для создания диалогового окна Параметры страницы в этой программе довольно прост, так как в верхней части кода формы уже была определена переменная PrintPageSettings. Эта переменная хранит информацию об определении текущей страницы. Когда она присваивается свойству PageSettings объекта PageSetupDialog1, метод ShowDialog автоматически загружает диалоговое окно, которое позволяет пользователю ориентацию страницы, полей и другие параметры страницы. Обработчик ошибок Try...Catch просто обрабатывает все ошибки, которые могут произойти при использовании метода ShowDialog.

  • Снова отобразите форму, а затем дважды щелкните мышью на кнопке Предварительный просмотр (btnPreview), чтобы отобразить процедуру события btnPreview_Click.
  • Введите следующий код программы:

    Try
    	'Указываем текущие параметры страницы
    	PrintDocument1.DefaultPageSettings = PrintPageSettings
    	'Указываем документ для диалогового окна предварительного просмотра
    	'и показываем его
    	StringToPrint = RichTextBox1.Text
    	PrintPreviewDialog1.Document = PrintDocument1
    	PrintPreviewDialog1.ShowDialog()
    	Catch ex As Exception
    	'Отображаем сообщение об ошибке
    	MessageBox.Show(ex.Message)
    End Try

    Аналогичным образом процедура события btnPreview_Click присваивает переменную PrintPageSettings свойству DefaultPageSettings объекта PrintDocument1, а затем копирует текст из объекта форматированного текста в переменную StringToPrint и открывает диалоговое окно Предварительный просмотр. Предварительный просмотр автоматически использует данные параметров страницы для отображения визуального представления документа так, как он будет напечатан - вам не требуется отображать эту информацию вручную. Теперь сделайте небольшое изменение в коде программы в процедуре события btnOpen_Click.

  • Прокрутите код в Редакторе кода до процедуры события btnOpen_Click. Это процедура, которая отображает диалоговое окно Открыть, открывает текстовый файл и включает кнопку печати. Так как вы только что добавили две новые кнопки печати, добавьте код программы, чтобы включать кнопки Параметры страницы и Предварительный просмотр.
  • Прокрутите код в конец этой процедуры события непосредственно перед блоком кода Catch и найдите следующий оператор программы:

    btnPrint.Enabled = True
  • Под этим оператором добавьте следующие строки кода:

    btnSetup.Enabled = True
    btnPreview.Enabled = True

    Теперь ваша программа включит кнопки печати, когда будет открыт документ для печати.

  • Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на панели инструментов.
  • Тестирование функций Page Setup и Print Preview

  • Щелкните на кнопке Start (Начать) панели инструментов.

    Примечание. Готовая программа Print Dialogs лежит в папке c:\vbnet03sbs\Гл.18\print dialogs.

    Программа запустится, и будет включена только первая кнопка.

  • Щелкните на кнопке Открыть, а затем откройте файл longFile.txt, расположенный в папке c:\vbnet03sbs\Гл.18. После этого включатся три остальные кнопки, как показано ниже.

  • Щелкните на кнопке Параметры страницы. Ваша программа откроет диалоговое окно Page Setup, показанное ниже.

    Page Setup содержит множество полезных опций, включая возможность изменить размер и источник страниц, ориентацию печати: Portrait (Портретная) или Landscape (Альбомная); и поля страниц: Left (левое), Right (правое), Top (верхнее) и Bottom (нижнее).

  • Измените поле Left на 2, а затем щелкните на OK. Левое поле теперь будет равно 2 дюймам.
  • Щелкните на кнопке Предварительный просмотр. Ваша программа откроет диалоговое окно Предварительный просмотр, показанное на следующей иллюстрации.

    Диалоговое окно Предварительный просмотр имеет несколько знакомых кнопок и функций предварительного просмотра, особенно если вы использовали команду Предварительный просмотр из Microsoft Word или Microsoft Excel. Элементы управления Zoom (Масштаб), One Page (Одна страница), Two Pages (Две страницы), Three Pages (Три страницы), Four Pages (Четыре страницы), Six Pages (Шесть страниц) и Page Select (Выбор страницы) этого диалогового окна работают автоматически. Для их работы не требуется никакого кода.

  • Щелкните на кнопке Four Pages (Четыре страницы), чтобы увидеть одновременно четыре страницы вашего документа.
  • Чтобы увидеть полный размер окна Предварительный просмотр, дважды щелкните мышью на кнопке Maximize в строке его заголовка.
  • Щелкните на стрелке справа от кнопки Zoom (Масштаб) и на 150%. Ваш экран будет выглядеть примерно так, как показано на рисунке на следующей странице.
  • Щелкните на кнопке One Page (Одна страница), а затем на стрелке вверх поля Page Select, чтобы увидеть страницы 2-4. Это окно Предварительный просмотр впечатляет - и вы встроили его в вашу программу, добавив всего несколько строк кода!

  • Щелкните на кнопке Закрыть, чтобы закрыть диалоговое окно Предварительный просмотр, а затем на кнопке Закрыть, чтобы закрыть программу. На этом работа с принтерами пока закончена.
  • Краткая справка по лекции 18

    Чтобы Сделайте следующее
    Встроить в ваши проекты класс PrintDocument и подготовить печать

    Добавьте в верхнюю часть кода формы следующий оператор Imports:

    Imports System.Drawing.Printing
    Создать обработчик события печати

    Используйте оператор AddHandler и оператор AddressOf. Например:

    AddHandler PrintDocument1.PrintPage, _
    AddressOf Me.PrintGraphic
    Создать в вашем проекте объект PrintDocument

    Сделайте двойной щелчок мышью в окне Toolbox (Область элементов) на элементе управления PrintDocument на закладке Windows Forms или включите в ваш код программы следующее объявление переменной:

    Dim PrintDoc As New PrintDocument
    Напечатать графику из обработчика события печати

    Используйте метод Graphics.DrawImage. Например:

    ev.Graphics.DrawImage(Image.FromFile _
    (TextBox1.Text), ev.Graphics.VisibleClipBounds)
    Напечатать текст из обработчика события печати

    Используйте в обработчике события метод Graphics.DrawString. Например:

    ev.Graphics.DrawString(TextBox1.Text, _
    New Font("Arial", 11, FontStyle.Regular), _
    Brushes.Black, 120, 120)
    Вызвать обработчик события печати

    Используйте метод Print объекта типа PrintDocument. Например:

    PrintDoc.Print()
    Напечатать многостраничный текстовый документ Напишите обработчик для события PrintPage, который получает аргумент типа PrintPageEventArgs. Затем вычислите прямоугольную область страницы, используйте метод MeasureString для определения того, сколько текста влезет на текущую страницу, и метод DrawString для печати этого текста на странице. Если требуется напечатать дополнительные страницы, установите свойство HasMorePages на значение True. Когда все страницы будут напечатаны, установите HasMorePages на значение False.
    Открыть текстовый файл с помощью класса FileStream и загрузить его в объект RichTextBox

    Создайте переменную типа FileStream, указав путь и режим открытия файла, загрузите поток в RichTextBox, а затем закройте поток. Например:

    Imports System.IO	'в верхней части формы
    ...
    Dim MyFileStream As New FileStream( _
    FilePath, FileMode.Open)
    RichTextBox1.LoadFile(MyFileStream, _
    RichTextBoxStreamType.PlainText)
    MyFileStream.Close()
    Отобразить в программе диалоговые окна печати Используйте элементы управления PrintDialog, PrintPreviewDialog и PageSetupDialog, расположенные на закладке Windows Forms окна Области элементов.
    Вернуться к учебному плану