Многостраничный вывод. О классе PrintPageEventArgs.
Процесс многостраничной печати основан на небольшой хитрости: если процедура обработки события PrintPage задает свойству HasMorePages объекта PrintPageEventArgs значение True, то объект PrintDocument узнает о наличии дополнительных страниц для печати и автоматически инициирует заново событие PagePrint.
Проблемы, возникающие при многостраничной печати, имеют мало общего с самой печатью. Они присущи любому сложному выводу на графической поверхности: программа должна помнить обо всем. Предположим, вы хотите написать небольшую программу для вывода содержимого текстового поля или текстового файла. В псевдокоде все выглядит просто.
- Прочитать строку из поля или из файла.
- Не превышает ли длина строки предельное допустимое значение? Если превышает, разбить на несколько фрагментов.
- Помещаются ли эти фрагменты на текущей странице?
- Если помещаются, напечатать их функцией DrawString начиная с текущей позиции. Если не помещаются, напечатать сколько удастся, начать новую страницу и вывести на ней остальные фрагменты.
- Повторить процесс до тех пор, пока не будут обработаны все строки текстового поля или файла.
Однако проверка возможности размещения новой строки на странице не имеет ничего общего с печатью; в ней используются различные метрики, вычисляемые на основании ширины и высоты текстовой строки. В свою очередь, эти параметры зависят от семейства и размера используемого шрифта. К счастью, вы можете положиться на такие методы, как MeasureString; эти методы используют метрики, связанные с текущим контекстом устройства.
О классе PrintPageEventArgs
Объект PrintPageEventArgs содержит два ReadOnly-свойства, при помощи которых можно получить информацию о размерах страницы. Значения обоих свойств задаются в сотых долях дюйма.
- PageBounds: возвращает размеры прямоугольной области всей страницы.
- MarginBounds: возвращает размеры прямоугольной области, ограниченной полями.
В свойстве PageSettings объекта PrintPageEventArgs хранится дополнительная информация. В табл. 8.2 перечислены важнейшие свойства класса PageSettings (большинство принтеров позволяет читать эти свойства, но не все принтеры поддерживают запись).
Таблица 8.2. Свойства класса PageSettings.
Свойство | Описание |
---|---|
Bounds | Возвращает размеры страницы с учетом возможной альбомной ориентации печати. Свойство доступно только для чтения |
Color | Признак печати страницы в цвете. Логическое свойство, доступное для чтения и записи |
Landscape | Ориентация страницы. Логическое свойство, доступное для чтения и записи |
Margins | Размеры полей (по умолчанию равны 1 дюйму). Свойство доступно для чтения и записи |
PaperSize | Размеры бумаги. Свойство доступно для чтения и записи |
PaperSource | Источник бумаги. Свойство доступно для чтения и записи |
PrinterResolution | Разрешение принтера. Некоторые принтеры поддерживают нестандартные разрешения, другие позволяют выбирать только между черновой и качественной печатью. Свойство доступно для чтения и записи |
PrinterSettings | Настройка принтера для данной страницы. Свойство доступно для чтения и записи |
Например, многие принтеры не позволяют печатать ближе, чем в 0.5 дюйма от края бумаги. В этом случае минимальные поля задаются следующей командой:
е.PageSettings.Margins = New System.Drawing.Printing.Margins(50.50.50.50)
Следующий фрагмент начинает печать с левого верхнего края области, ограниченной полями:
Dim g As Graphics g = e.Graphics g.DrawImage(PictureBoxl.Image, e.MarginBounds.Left, e.MarginBounds.Top)