Программирование >>  Программирование с использованием ajax 

1 ... 175 176 177 [ 178 ] 179 180 181 ... 396


f$i Simple Editor

Pr>nt

Prmt Preview.

Ptt9 S tup

Рис. 17.20. Расширение меню File

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

ПуМИ WlOCKOe

занятие

Добавление компонента PrintDocument

1. Добавьте следующие директивы using в начальную часть кода, чтобы можно было использовать классы печати:

using System.Drawing;

using System.Drawing.Printing;

2. Перетащите компонент PrintDocument из панели инструментов Toolbox на серую область, расположенную под формой. Измените значение свойства Name на PrintDocument и добавьте обработчик события OnPrintPage к событию PrintPage, выбирая кнопку Events в окне Properties. Затем добавьте следующий код в реализацию обработчика события:

private void OnPrintPage(object sender, PrintPageEventArgs e) {

string [ ] lines = text:BoxEdit. Text. Split ( \n) ; int i = 0;

foreach (string s in lines) {

lines[i++] = s.TrimEnd(\r);

int X = 20; int у = 20;

foreach (string line in lines) {

e. Graphics. Drawstring (line, new Font ( Arial , 10) , Brushes. Black, x, y) ; у += 15;

3. Добавьте к событию Click меню Print обработчик, вызывающий метод Print () класса PrintDocument. При отсутствии допустимого принтера генерируется исключение типа InvalidPrinterException, которое перехватывается для отображения сообщения об ошибке:

private void OnFilePrint(object sender, EventArgs e)

try {



ргintDociiment. Print () ;

catch (InvalidPrinterException ex) {

MessageBox. Show (ex .Message, Simple Editor , MessageBoxButtons.OK, MessageBoxIcon.Error);

Теперь можно скомпоновать и запустить приложение и напечатать документ. Естественно, чтобы пример работал, в системе должен быть установлен принтер.

Описание полученных результатов

Метод Print О объекта printDocument с помощью класса PrintController вызывает событие PrintPage:

printDocument.Print() ;

В обработчике OnPrintPage () с помощью метода String. Split () и символа новой строки \п мы разделяем текст в текстовом поле на строки. Результирующие строки записываются в массив lines типа string:

string[] lines = textBoxEdit.Text.Split(\n) ;

В зависимости от способа создания текстового файла, строки могут разделяться не только символом новой строки \п, но и символом возврата \г. Метод TrimEndO класса Storing удаляет символ \г из каждой строки:

int 1 = 0;

foreach(string s in lines) {

lines[i + +] = s.TrimEnd(\r ) ;

Второй оператор foreach в следующем коде выполняет итерацию по строкам и посредством обращения к е. Graphics . DrawString () отправляет каждую из них на принтер, е - переменная типа PrintPageEventArgs, а свойство Graphics связано с контекстом принтера. Контекст принтера позволяет выполнять прорисовку на устройстве печати. Класс Graphics предлагает ряд методов для выполнения прорисовки в этот контекст.

Пока мы еще не можем выбирать принтер, поэтому приложение использует принтер, установленный по умолчанию (сведения о котором хранятся в системном реестре Windows).

Для осуществления печатного вывода в методе DrawString () мы используем шрифт Arial размером в 10 пунктов и черную кисть. Позиция вывода определяется переменными х и у. Позиция по горизонтали фиксирована и равна 20 пикселям, а позиция по вертикали увеличивается с каждой строкой:

int X = 20; int у = 20;

foreach (string line in lines) {

e.Graphics.DrawString (line, new Font( Arial , 10), Brushes.Black, x, y) ;

У += 15;



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

□ Многостраничная печать не работает. Если печатный документ состоит из нескольких страниц, на печать выводится только первая из них. Желательно было бы также обеспечить печать верхнего колонтитула (например, имени файла) и нижнего колонтитула (например, номера страницы).

□ Значения границ страницы жестко определены в программе. Чтобы предоставить пользователям возможность устанавливать другие значения границ страницы мы используем класс PageSetupDialog.

□ Выходные данные печати отправляются на принтер, заданный по умолчанию, устанавливаемый пользователем через панель управления. Предпочтительнее было бы, чтобы пользователь мог выбирать принтер в приложении. Для исправления этой ситуации мы используем класс PrintDialog.

□ Приложение применяет фиксированный шрифт. Чтобы предоставить пользователю возможность выбора шрифта, можно использовать класс FontDialog, который подробнее описан в последующих разделах.

Итак, продолжим реализацию процесса печати для устранения указанных недостатков.

Печать нескольких страниц

Событие PrintPage вызывается для каждой печатаемой страницы. В следующем практическом занятии мы информируем PrintController о том, что текущая напечатанная страница не была последней страницей, устанавливая значение свойства HasMorePages класса PrintPageEventArgs равным true.

Изменение метода OnPrintPageO для печати нескольких страниц

1. Вначале объявите переменную-член lines типа string [] и переменную

linesPrinted типа int в классе SimpleEditorForm:

Переменные для печати private string[] lines; private int linesPrinted;

2. Измените обработчик OnPrintPageO. В предыдущей реализации метода OnPrintPage () текст был разбит на строки. Поскольку метод OnPrintPage () вызывается с каждой страницей, и разбиение на строки требуется выполнить только один раз при запуске операции печати, удалите весь код из этого метода и замените его новой реализацией:

private void OnPrintPage(object sender, PrintPageEventArgs e) {

int X = 20; int у = 20;

while (linesPrinted < lines.Length) {

e.Graphics.DrawString (lines[linesPrinted++],

new Font ( Arial , 10), Brushes.Black, x, y) ;

у += 15;

if (y = e.PageBounds.Height - 80) {



1 ... 175 176 177 [ 178 ] 179 180 181 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика