Четверг, 25.04.2024, 04:28
Приветствую Вас Гость | RSS

Лекции

Меню сайта
Форма входа
Категории раздела
ТАУ (Теория автоматического управления) [31]
лекции по ТАУ
Экология [151]
учебник
Бухгалтерский учет и налогообложение в строительстве [56]
Дементьев А.Ю. - Практическое пособие
Психология [104]
Пип
информатика [80]
с# Карли Ватсон
современные стулья [0]
новинки
Поиск

Главная » 2010 » Февраль » 11 » Вывод на печать нескольких страниц
00:37
Вывод на печать нескольких страниц
Вывод на печать нескольких страниц
Событие PrintPage вызывается для каждой страницы, подлежащей выводу на
печать. Необходимо передать Printcontroiier информацию о том, что страница,
выводящаяся на печать в данный момент времени, не является последней, посред-
ством присваивания СВОЙСТВУ HasMorePages Класса PrintPageEventArgs значения
true.
Практикум: модификация OnPrintPage для вывода нескольких страниц
1. Необходимо объявить переменную lines типа string [] и переменную
linesPrinted типа int В классе SimpleEditorForm:
private string[]lines;
private int linesPrinted;
2. Внесите следующие изменения в обработчик OnPrintPage ().
В реализации OnPrintPage (), которая использовалась до настоящего
момента, мы осуществляли разбиение текста на строки. Поскольку
метод OnPrintPage о вызывается для каждой страницы, разбиение
текста на строки оказывается необходимым выполнять только один
раз — перед началом процедуры вывода на печать. Удалите весь код
из метода OnPrintPage о и вместо него введите новую реализацию:
private void OnPrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
'. • t - „ ,: _ . _
int x = 20;
int у = 20;
412 Глава 15
while {linesPrinted < lines.Length)
: ; . . ' : ; • ? • • . - , ; : , ' - : •••;.• : ; ; {
e.Graphics -DrawString{lines СlinesPrinted++],
new Font("Arial", 10), Brushes.Black, x, y) /
' ' '•-у'-: •:•-'•. .: •••'•\.;-"-:-l '.• " ' '^/ у += 15; -•'•'• •' ' ;'••: • '.
if {y >= e.PageBounds.Height - 80)
{ . ;;..",:-
e.HasMorePages = true;
linesPrinted = 0;
e.HasMorePages = false;
3. Добавьте Обработчик События BeginPrint объекта print.Document.
Метод onBeginPrint () вызывается всего один раз для каждого
задания вывода на печать, и в нем мы создаем массив lines:
private void OnBeginPrint{object sender,
System.Drawing.Printing.PrintEventArgs e)
{ : .... . ... _ .... ^ . . . . , . . .. ;
char[] param = {'\n'};
lines = textBoxEdit.Text.Split(param);
int i = 0;
char[] trimParam = {'\r'};
foreach {string s in lines)
lines [i++] = s.TrimEnd(trimParam).;
4. Построив проект, вы можете приступать к осуществлению задачи
вывода на печать многостраничного документа.
Как это работает
Выполнение задачи вывода на печать начинается с вызова метода Print о клас-
са PrintDocument, который, в свою очередь, сначала единственный раз вызывает
метод BeginPrint о , а затем — метод onPrintPage () для каждой страницы.
В методе BeginPrint о производится разбиение текста, находящегося в тексто-
вом окне, на массив строк. Каждая строка в массиве представляет собой отдель-
ную строку, поскольку мы выполняем разбиение по символу перехода к новой
строке (\п), а все символы возврат каретки (\г) удаляются — так же, как это де-
лалось раньше.
chart] param = {'\n'};
lines = textBoxEdit.Text.Split(param);
. . : i n t i = 0 ; . : ••• •• •• : ' ^ • . • • • . ' •• •: ' ••• :.••.••••.• ' : •• '. . ••: . . . : • • ' . - :
chart] trimParam = {'\r'};
foreach (string s in lines)
{ ._ • • ' ' •
lines[i++] = s.TrimEnd(trimParam);
}
Метод OnPrintPage() вызывается после метода BeginPrint(). Нам требуется
продолжать вывод на печать, пока число отпечатанных строк меньше числа строк,
выводимых на печать. Свойство lines.Length позволяет получить число строк,
Использование диалоговых окон 413
находящихся в массиве lines. Переменная linesPrinted увеличивается на единицу
с каждой отправленной на печать строкой:
while (linesPrinted < lines.Length)
e.Graphics.DrawString(1 ines LlinesPrinteci++3/
new Font(*Arial", 10), Brushes.Black, x, y) ;
После того, как строка отпечатана, мы осуществляем проверку, не выходит ли
вновь вычисленное значение позиции по вертикали за границы страницы. Кроме
того, мы уменьшаем границы на 80 пикселей, поскольку не хотим, чтобы печать
производилась по самому нижнему краю страницы, так как многие принтеры за
этим не следят. Если такая позиция достигнута, то свойству HasMorePages класса
PrintPageEventArgs присваивается значение true для того, чтобы проинформиро:
вать контроллер о том, что метод onPrintPage () должен быть вызван еще раз. Не
забудьте, что в методе Printcontroiler используется метод PrintLoopO, который
определяет последовательность выводимой информации для каждой печатающейся
страницы. Если значение свойства HasMorePages будет равно false, он прекратит
работу. В качестве значения свойства HasMorePages по умолчанию используется
false, чтобы печать была прекращена:
у += 15;
if (у >= е.PageBounds.Height)
{
: е.HasMorePages = true;
return;
Задание параметров страницы
На данном этапе значения, определяющие поля страницы, пр чно "зашиты"
в программу. Давайте ее модифицируем так, чтобы пользователь сам определял
поля страницы. Для этого воспользуемся PageSetupDialog — еще одним классом
диалога.
Этот класс позволяет задавать размеры и источник поступления бумаги, ориен-
тацию листов, поля страницы. Поскольку все эти опции зависят от конкретного
принтера, с помощью этого диалога можно также осуществлять и выбор самого
принтера.
Бумага
Если свойству AliowPaper присвоено значение true, то это означает, что поль-
зователь имеет возможность самостоятельно определять размерыушстов бумаги
и ее источник. Свойство PageSetupDiaiog.PageSettings.Papers^ze возвращает
экземпляр Papersize, с котором хранятся высота, ширина и тип йумаги соответст-
венно В свойствах Height, Width И PaperName. PaperName определяется именами
Letter и А4. Свойство Kind имеет значение перечислимого типа PaperKind. Оно
может принимать одно из трех следующих значений, определяющих размеры ис-
пользуемой бумаги: European (европейские), American (американские) И Japanese
(японские).
СВОЙСТВО PageSetupDialog.PageSettings.PaperSource ВОЗВращает экземпляр
PaperSource, в котором находится название источника бумаги для принтера,
и того, какая именно бумага там находится (при условии, что установки принтера
сконфигурированы корректно).
414 Глава 15
Поля
Если свойству AiiowMargins присвоено значение true, то это означает, что
пользователь имеет возможность самостоятельно определять размеры полей при
выводе на печать. С помощью свойства MinMargins существует возможность уста-
новить минимально допустимые значения, которые могут быть введены пользова-
телем. Для считывания значений, определяющих размеры полей, используется
СВОЙСТВО PageSetupDialog.PageSettings.Margins. Возвращаемый объект Margins
Обладает свойствами Bottom, Left, Right И Top.
Ориентация листов
Свойство AilowOrientation определяет, имеется ли у пользователя возмож-
ность выбирать между горизонтальной и вертикальной ориентацией листа бумаги
при выводе на печать. Выбранное значение может быть получено с помощью ло-
гического свойства PageSetupDialog.PageSettings.Landscape, значение true КО-
торого соответствует горизонтальному расположению листа бумаги, a false —
вертикальному.
Page Setup -Ui<J
Source:
1 AHowQrientation •
! <* Portrait
I Automaticaly Sebcl
: ; Margins (f
: Top:
Page Settings. Pa perSource E
,,„.,,,,.,„,,,. .„,,,,.,...,,,,.....,,. ,,,.... , , , „ j
Right:
г-г—: Mjn Margins
Bottom; |1U
Принтер
Свойство AiiowPrinter определяет,
имеет ли пользователь возможность
выбирать принтер. В зависимости от
значения этого свойства разрешается
или запрещается использование кноп-
ки Printer. Обработчик этой кнопки,
в свою очередь, открывает диалоговое
окно PrintDialog, которое мы будем
рассматривать следующим.
Свойства
PageSetupDialog
На рисунке слева представлен об-
зор свойств, которые позволяют или
запрещают использование различных
возможностей, а также указано, какие
свойства могут быть использованы для
получения соответствующих значений.
Практикум: добавление диалогового окна для задания свойств страницы
1. Перенесите компонент PageSetupDialog из окна с инструментами
в программу разработки Windows Forms. Присвойте свойству Name
значение dlgPageSetup, а СВОЙСТВУ Document — printDocument,
для того чтобы привязать к диалогу документ, подлежащий
выводу на печать.
Затем добавьте обработчик событий "щелчок мыши" во вхождение
меню Page Setup, а также код, ответственный за вывод диалогового
окна на экран с помощью метода showDialog (). В данном случае
необходимость проверять возвращаемые методом showDialog о
Использование диалоговых окоп 415
значения отсутствует, поскольку используемая реализация
обработчика событий "нажатие кнопки ОК" уже предполагает
присваивание новых значений привязанному объекту printDocument:
private void menuItemFilePageSetup_Click(object sender,
System.EventArgs e)
... { _ .. . : . _ .
dlgPageSetup.ShowDialog();
2. Теперь необходимо внести изменения в реализацию метода
onPrintPage(), которые позволят использовать значения
размеров ПОЛеЙ, Заданные С ПОМОЩЬЮ диалога PageSetupDialog.
В используемой нами программе значения переменных х и у
присваиваются Свойствам MarginBounds.Left И MarginBounds.Right
класса PrintPageEventArgs. Проверка на предмет достижения
конца страницы осуществляется с помощью
свойства MarginBounds.Bottom!
private void OnPrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
. {
int x - e.MarginBounds.Left;
J ; int у - e.MarginBounds .Top;
while (linesPrinted < lines.Length)
{
e.Graphics.DrawString(lines[linesPrinted++],
new Font ("Arial", 10), Brushes.Black, x, y) ;
у += 15;
if (y >= e.MarginBounds.Bottom)
{
e.HasMorePages = true;
return;
linesPrinted = 0;
e.HasMorePages = false;
"• Orientation •. r Margjs
1 f Left-
I С Ur.dscc.pe I-
3
Хор: JTo bottom: (To"
j .СМбЫ>
3. Теперь можно построить проект и запустить
приложение. Выбрав File | Page Setup,
вы получите диалог, показанный ниже.
Если вы измените границы, то печать будет
осуществляться в этих измененных i раницах
(см. рис. слева).
Если вывод диалогового окна PageSetupDialog
на экран оказывается невозможным, то
генерируется исключительная ситуация типа
Syetem.ArgumentException; ЭТО, В частности,
может происходить потому, что вы забыли
прИВЯЗаТЬ объект PrintDocument К ДИЭЛОГу
PageSetupDialog. Диалогу PageSetupDialog
наличие привязанного объекта PrintDocument
необходимо — он использует его для
считывания и записи различных значений,
используемых в процессе диалога.
416 Глава 15
Диалог вывода на печать
Класс PrintDialog позволяет пользователю выбирать принтер из числа инстал-
лированных, а также задавать число копий и некоторые установки принтера, на-
пример представление вывода и источник бумаги для принтера. Поскольку
использовать диалог PrintDialog очень просто, мы сразу переходим к процедуре
включения этого диалога в наше приложение Editor.
Практикуй: добавление диалогового окна PrintDialog
1. Добавьте в форму компонент PrintDialog из окна с инструментами.
Измените его СВОЙСТВО Name на dlgPrint, а СВОЙСТВО Document —
на printDocument.
Замените реализацию обработчика событий "щелчок мышью"
дая меню Print на следующий код:
private void miFilePrint_Click(object sender, System.EventArgs e)
if {dlgPrint. ShowDialog () ='= DialogResult. OK)
printDocument.Print(); • •.; •
2. Постройте и запустите приложение.
Выбрав File | Print, вы откроете диалог
PrintDialog. Теперь есть возможность
выбрать принтер, на котором вы будете
распечатывать документ (см. рис. слева).
Опции диалогового окна
вывода на печать
В Программе SimpleEditor МЫ не ВНОСИЛИ
НИКаКИХ Изменений В СВОЙСТВа PrintDialog. Но
у этого диалогового окна также имеется не-
сколько опций. В приведенном выше диалого-
вом окне имеющиеся опции разбиты на три
группы: Printer, Print Range и Copies.
• В группе Printer можно выбрать не только принтер — в ней также
существует опция Print to File (вывод в файл). По умолчанию
эта опция находится в рабочем состоянии, но не является выбранной.
Установка флажка в соответствующем окне выбора дает возможность
пользователю направлять выходной поток, предназначенный для вывода
на печать, в некоторый файл вместо принтера. Эта опция может быть
ОТКЛЮЧена, еСЛИ ПРИСВОИТЬ СВОЙСТВУ AllowPrintToFile значение false.
Если пользователь выбирает эту опцию, то метод
printDocument.Print о открывает диалоговое
окно, представленное на рисунке справа.
В названном окне запрашивается имя файла,
в который следует записывать выходной поток,
предназначенный для вывода на печать.
.U 211
gUiput Bs Name:
Использование диалоговых окон 417
Q В разделе диалогового окна Print Range можно выбрать только
опцию АН (все) — опции Pages и Selection по умолчанию отключены.
С тем, каким образом эти опции могут быть реализованы,
мы познакомимся в следующем разделе.
Q Группа Copies позволяет задавать число получаемых копий.
Вывод на печать выбранного текста
Если требуется реализовать возможность вывода на печать выбранного только
текста, то для этого необходимо активизировать соответствующий переключатель,
присвоив свойству AiiowSeiection значение true. Для этого также необходимо из-
менить код, отвечающий за вывод на печать, с тем чтобы он выводил на печать
только выбранный текст.
Практикум: добавление возможности вывода на печать выбранного текста
1. Добавьте код, выделенный серым цветом, в обработчик событий
"щелчок мышью" кнопки Print:
private void miFilePrint_Click(object sender, System.EventArgs e)
if (textBoxEdit.SelectedText » = "")
dlgPrint.AiiowSeiection = true;
if (dlgPrint.ShowDialogO == DialogResult.OK)
printDocument.Print();
В нашей программе все строки, подлежащие выводу на печать,
задаются в обработчике OnBeginPrint о . В реализацию этого метода
также необходимо внести некоторые изменения:
private void OnBeginPrint(object sender,
System.Drawing.Printing.PrintEventArgs e)
char[] param = {'\n'};
if (dlgPrint.PrinterSettings.PrintRange == PrintRange.Selection)
V { ' •: • ' • •• .••• ' ' •••• - • • • • : • • • • • • • •'•• • '• • • • • : • • • • . :
lines = textBoxEdit.SelectedText.Split(param);
lines = textBoxEdit.Text.Split(param);
int i = 0;
char[] trimParam = {'\r'};
foreach (string s in lines)
lines[i++] = s.TrimEnd(trimParam);
Теперь можно построить и запустить программу.
Откройте какой-либо файл, выберите некоторый текст, запустите
диалоговое окно вывода на печать с помощью меню File | Print
418 Глава 15
[Pikachu РЮ?£Д«? ..
Туре:
CM
4 Г
3 document woili»4J
Xerox С ocuPririt N2125.
.Augarterv.
1
I
Г*
F • -
OK
и выберите кнопку Selection в группе Print
Range (см. рис. слева). Если с такими
установками нажать на кнопку Print,
то на печать будет выведен только
выбранный текст.
Как это работает
Мы присваиваем СВОЙСТВУ AllowSelection
значение true только в том случае, если есть
какой-либо выбранный текст. Перед тем как
открыть PrintDialog, необходимо проверить,
выбран какой-либо текст или нет, т. е. убедить-
ся В ТОМ, ЧТО Значение СВОЙСТВа SelectedText
не есть null. Если есть какой-либо выбранный
текст, ТО СВОЙСТВУ AllowSelection ПрИСВаива-
* ется значение true:
if {textBoxEdit.SelectedText != •*)
dlgPrint.AllowSelection = true;
Метод onBeginprint () вызывается в начале каждого задания по выводу на печать.
Обращаясь К СВОЙСТВУ PrintDialog.PrinterSettings.PrintRange МЫ получаем ИН-
формацию о том, что пользователем выбрана опция Selection. Свойство PrintRange
возвращает значение перечислимого типа PrintRange, которое может быть одним
ИЗ следующих: AllPages (все страницы), Selection (выбор) ИЛИ SomePages (некото-
рые страницы):
if (print.Dialog.PrinterSettings.PrintRange =- PrintRange.Selection)
Если выбрана опция Selection, мы берем строку из выбранного текста, облада-
ющую свойством SelectedText класса Textbox. Эта строка подвергается точно та-
кому же разбиению, как и весь текст:
lines = textBoxEdit.SelectedText.Split(param);
ДЛЯ ТОГО, ЧТОбы ИМеТЬ ВОЗМОЖНОСТЬ ИСПОЛЬЗОВаТЬ перечИСЛИМЫЙ ТИП P r i n t R a n g e ,
необходимо ВКЛЮЧИТЬ пространство имен System.Drawing. Painting В самое начало
программы:
using System.Drawing.Painting;
Вывод на печать диапазонов страниц
Вывод на печать определенного диапазона страниц может быть реализован спо-
собом, аналогичным выводу на печать выбранного текста. Кнопка выбора данной
опции может быть активизирована путем присваивания свойству AiiowSomePages
значения true. В этом случае пользователь получает возможность выбрать диапа-
зон страниц, подлежащих выводу на печать. Каким образом можно определить
границы страниц в программе Simple Editor? Какая страница является последней?
Для того чтобы задать последнюю страницу, необходимо присвоить соответствую-
щее Значение СВОЙСТВУ PrintDialog.PrinterSettings.ToPage. Каким образом ПОЛЬ-
зователь сможет узнать номера страниц, которые ему требуется вывести на печать?
Использование диалоговых окон 419
Это не составляет никакого труда в приложениях, предназначенных для работы
с документами, например в Microsoft Word, в котором в качестве режима вывода
на экран может быть выбран Print Layout. Простой управляющий элемент Textbox,
используемый в нашем прило-
жении Simple Editor, не предо-
ставляет таких возможностей.
Именно по этой причине мы не
будем реализовывать данную
возможность в нашем прило-
жении.
Свойства
PrintDialog
Сведем все свойства, оказы-
вающие влияние на представ-
ление PrintDialog, на ОДНОМ
рисунке (см. рис. слева).
Status
Type- HP U?erJe* 5а"Ю Series- PS
Where: 192,168.240136
Предварительный просмотр
Возможно, пользователь пожелает посмотреть, как будет выглядеть выводимая
на печать информация. Именно для этой цели используется Print Preview (предва-
рительный просмотр). Реализовать Print Preview в .NET оказывается очень просто.
ДЛЯ ЭТОГО МОЖНО ВОСПОЛЬЗОВаТЬСЯ КЛаССОМ PrintPreviewControl, КОТОрЫЙ ПОЗВО-
ляет осуществлять предварительный просмотр документа в том виде, в котором он
будет выводиться на печать. PrintPreviewControl — это диалог, который пред-
ставляет собой оболочку для данной возможности.
Диалоговое окно PrintPreviewDiaiog
Взглянув на свойства и список наследования класса PrintPreviewDiaiog в доку-
ментации MSDN, вы легко сможете обнаружить, что они представляют собой са-
мостоятельную форму, а не оболочку для общего диалога — этот класс является
производным от System.windows.Forms.Form, и работать с ним следует так же, как
с формами, созданными в предыдущей главе.
Мы включим класс PrintPreviewDiaiog в приложение Simple Editor.
Практикум: добавление диалогового окна предварительного просмотра
1.Добавьте в программу разработки Windows
Forms компонент PrintPreviewDiaiog.
Присвойте ему ИМЯ dlgPrintPreview,
а свойству Document — значение
printDocument. Добавьте и реализуйте
обработчик события click для вхождения
меню Print Preview (см. рис. справа):
private void"3iiFilePrintPreview_Click( object
sender, System.EventArgs e)
{
dlgPrintPreview.ShowDialog();
420 Глава 15
Класс PrintPreviewControI
Предварительный просмотр в приложениях Microsoft Word и WordPad отлича-
ется от PrintPreviewDialog тем, что в этих приложениях для него не используется
отдельное диалоговое окно — просмотр осуществляется в основном окне этих
приложений.
Чтобы добиться такого эффекта, можно по-
местить В форму класс PrintPreviewControI.
Свойству Document следует присвоить объект
PrintDocument, а СВОЙСТВУ Visible — значение
false. В обработчике можно присвоить свой-
ству visible значение true для предваритель-
ного просмотра документа. В этом случае
средство управления PrintPreviewControI За-
слонит собой все остальные средства управле-
ния, как показано на рисунке слева.
По названию и единственному пункту меню
File можно определить, что это — основное
окно приложения Simple Editor. Теперь осталось
хШг'х
j
- -
добавить еще несколько элементов, которые
В классе PrintPreviewControI отвечают за
увеличение изображения, печать и вывод 2, 3,
4, 6 и т. д. страниц. Для того чтобы восполь-
зоваться этими возможностями следует обра-
титься к особой панели инструментов. В классе
PrintPreviewDialog это все уже реализовано,
как это видно на рисунке справа, на котором
изображен предварительный просмотр четырех
страниц (см. рис. справа).
%
111
I I I
I I I
1 i
:
-г £ Sis
1
Si
l~
...
11?







Категория: информатика | Просмотров: 2035 | Добавил: basic | Рейтинг: 0.0/0
Всего комментариев: 1
1 buitjuime  
0
[url

Имя *:
Email *:
Код *:
Календарь
«  Февраль 2010  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

krutoto.ucoz.ru
Бесплатный конструктор сайтов - uCoz