|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Багатосторінковий
вивід
Процес багатосторінкового
друку заснований на невеликій хитрості: якщо процедура обробки події Pri ntpage
задає властивості Hasmorepages об'єкту Pri ntpageeventargs значення True, то об'єкт
Printdocument дізнається про наявність додаткових сторінок для друку і автоматично
ініціює наново подію Pagepri n't. Проблеми, що
виникають при багатосторінковому друці, мають мало загального з самим друком. Вони
властиві будь-якому складному виводу на графічній поверхні: програма повинна
пам'ятати про все. Припустимо, ви хочете написати невелику програму
для виведення вмісту текстового поля або текстового файлу. У псевдокоді все
виглядає просто.
Проте перевірка можливості
розміщення нового рядка на сторінці не має нічого спільного з друком; у
ній використовуються різні метрики, що обчислюються на підставі ширини і висоти
текстового рядка. У свою чергу, ці параметри залежать від сімейства і розміру
використовуваного шрифту. На щастя, ви можете покластися на такі методи, як Measurestri
ng; ці методи використовують метрики, пов'язані з поточним контекстом пристрою.
Об'єкт Printpageeventargs
містить дві ReadOnly-свойства, за допомогою яких можна отримати інформацію
про розміри сторінки. Значення обох властивостей задаються в сотих долях дюйма.
У властивості
Pagesettings об'єкту Printpageeventargs зберігається додаткова інформація.
У таблиці. 8.2 перераховані найважливіші властивості класу Pagesetti ngs (більшість
принтерів дозволяють читати ці властивості, але не всі принтери підтримують запис). Таблиця
8.2.
Властивості класу Pagesettings
Наприклад,
багато принтерів не дозволяють друкувати ближче, ніж в 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)
Елемент
Printdialog і конфігурація друку
Користувач
програми повинен мати можливість вибрати принтер і внести інші зміни
до конфігурації друку. Таку можливість надає елемент Printdialog.
У програмі відповідний фрагмент може виглядати приблизно так: Private Sub Buttonl_click(Byval sender As System.Object,_ Byval e As System.EventArgs)Handles
Buttonl.Click Dim Phntdialogl
As New Printdialog() '
Наступний рядок необхідний, тому що інформація '
об'єкту Printersettings потрібна об'єкту Printdialog перед
виводом Printdialogl.Document
= Printdocumentl If Printdialogl.ShowDialog()
= Dialogresult.OK Then Printdocumentl.
PRINTO End If End Sub
Виділений рядок повідомляє екземпляр Printoialog, що пов'язаний з ним документ
має бути екземпляром Printdocumentl (передбачається, що цей об'єкт був
створений раніше). Цей рядок необхідний, оскільки елемент Printdialog повинен
отримати деякі параметри друку (у вигляді об'єкту Pri ntsetti ngs) перед
виводом вікна. Щоб передати йому цю інформацію, найпростіше призначити об'єкт Printdocument
властивості Document.
Самостійне
програмування друку
У багатьох випадках
цілком достатньо елементу Pri ntdialog і коди, що автоматично
згенерувала, але час від часу потрібно реалізувати нестандартні можливості друку.
Для цього необхідно написати процедуру з наступною сигнатурою: Private Sub Proceduretodotheprinting(Byval Sender As Object,_ Byval e As System.Drawing.Printing.PrintPageEventArgs) Потім процедура
за допомогою делегата підключається до події Printpage класу Printdocument. Наприклад,
для виклику об'єкту aprintdocument класу Printdocument з приведеною вище процедурою
apri ntdocument_printpage використовується команда наступного вигляду: Addhandler aprintdocument.PrintPage,
Addressof Me.aPrintDocument_PrintPage У наступному
фрагменті показано, як виглядає можлива реалізація друку в обробнику команди
меню Print: Private Sub mnuprint_click(Byval sender As System.Object,_ Byval e As System.EventArgs)Handles
mnuprint.Click Dim aprintdocument
As New Printdocument() Addhandler aprintdocument.PrintPage. Addressof Me.aPrintDocument_PrintPage aprintdocument.Print() End Sub
Мал.
8.25. Режим
попереднього перегляду Попередній перегляд Друк простих документів
в VB .NET вимагає декілька великих зусиль, чим в Vb6, зате режим попереднього
перегляду реалізується набагато простіше. Для цього від вас потрібно буде
лише призначити об'єкт Printdocument властивості Document екземпляра Printprevl
ewdialog. Так, наступний фрагмент майже повністю збігається з кодом, приведеним
вище, проте він реалізує попередній перегляд замість виводу на принтер.
Результати його виконання показані на мал. 8.25: Private Sub
btnpreview_click(Byval sender As System.Object. Byval e As System.EventArgs)
Handles btnpreview.Click Dim Printpreviewdialogl
As New Prlntpreviewdialog() Printpreviewdlalogl.Document
= Printdocumentl If Printpreviewdialogl.ShowDialog() = Dialogresult.OK Then Printdocumentl.Print() End If End
Sub
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||