Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНЫЕ РАБОТЫ по РПП.doc
Скачиваний:
77
Добавлен:
09.05.2015
Размер:
1.72 Mб
Скачать

Настройка параметров страницы документа

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

Добавьте в событие пункта меню «Параметры страницы» класса SimpleNotepadForm  соответствующий код:

Запустите приложение и посмотрите параметры страницы.

Предварительный просмотр документа перед печатью

Добавьте в класс SimpleNotepadForm обработчик события предварительного просмотра:

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

Далее Вам придется набрать вручную довольно объемистый исходный текст обработчика, представленный ниже:

private void SimpleNotepadDocument_PrintPage(object sender, PrintPageEventArgs e)

{

//Создаем экземпляр graph класса Graphics

Graphics graph = e.Graphics;

//Создаем объект font, которому устанавливаем шрифт элемента rtbText

Font font = richTextBoxStream.Font;

//Получаем значение межстрочного интервала - высоту шрифта Т1, 134

float HeightFont = font.GetHeight(graph);

//Создаем экземпляр stringformat класса StringFormat для определения

//дополнительных параметров форматирования текста.

StringFormat stringformat = new StringFormat();

//Создаем экземляры rectanglefFull и rectanglefText класса RectangleF для определния областей печати и текста. Т1, 104

RectangleF rectanglefFull, rectanglefText;

//Создаем переменные для подсчета числа символов и строк.

int NumberSymbols, NumberLines;

//В качестве области печати устанавливаем объект rectanglefFull

if (graph.VisibleClipBounds.X < 0) rectanglefFull = e.MarginBounds;

else

//Определяем объект rectanglefFull

rectanglefFull = new RectangleF(

//Устанавливаем координату X

e.MarginBounds.Left - (e.PageBounds.Width - graph.VisibleClipBounds.Width) / 2,

//Устанавливаем координату Y

e.MarginBounds.Top - (e.PageBounds.Height - graph.VisibleClipBounds.Height) / 2,

//Устанавливаем ширину области

e.MarginBounds.Width,

//Устанавливаем высоту области

e.MarginBounds.Height);

rectanglefText = RectangleF.Inflate(rectanglefFull, 0, -2 * HeightFont);

//Определяем число строк

int NumDisplayLines = (int)Math.Floor(rectanglefText.Height / HeightFont);

//Устанавливаем высоту области

rectanglefText.Height = NumDisplayLines * HeightFont;

if (richTextBoxStream.WordWrap)

{ stringformat.Trimming = StringTrimming.Word; }

else

{

stringformat.Trimming = StringTrimming.EllipsisCharacter;

stringformat.FormatFlags |= StringFormatFlags.NoWrap;

}

//При печати выбранных страниц переходим к первой стартовой странице

while ((PageNumber < StartPage) && (stringPrintText.Length > 0))

{

if (richTextBoxStream.WordWrap)

//Измеряем текстовые переменные,формирующие печать, и возвращаем число символов NumberSymbols и число строк NumberLines

graph.MeasureString(stringPrintText, font, rectanglefText.Size, stringformat, out NumberSymbols, out NumberLines);

else

NumberSymbols = SymbolsInLines(stringPrintText, NumDisplayLines);

stringPrintText = stringPrintText.Substring(NumberSymbols);

//Увеличиваем число страниц

PageNumber++;

}

//Если длина строки stringPrintText равняется нулю

(нет текста для печати) Останавливаем печать

if (stringPrintText.Length == 0)

{

e.Cancel = true;

return;

}

//Выводим (рисуем) текст для печати - stringPrintText,

используем для этого шрифт font, кисть черного цвета - Brushes.Black,

область печати - rectanglefText,

передаем строку дополнительного форматирования stringformat

graph.DrawString(stringPrintText, font, Brushes.Black, rectanglefText, stringformat);

//Получаем текст для следующей страницы

if (richTextBoxStream.WordWrap)

graph.MeasureString(stringPrintText, font, rectanglefText.Size, stringformat, out NumberSymbols, out NumberLines);

else

NumberSymbols = SymbolsInLines(stringPrintText, NumDisplayLines);

stringPrintText = stringPrintText.Substring(NumberSymbols);

//Очищаем объект stringformat, использованный для формирования полей.

stringformat = new StringFormat();

//Добавляем вывод на каждую страницу ее номер

stringformat.Alignment = StringAlignment.Far;

graph.DrawString("Страница " + PageNumber, font, Brushes.Black, rectanglefFull, stringformat);

PageNumber++;

//Cнова проверяем, имеется ли текст для печати и номер страницы, заданной для печати

e.HasMorePages = (stringPrintText.Length > 0) && (PageNumber < StartPage + NumPages);

//Для печати из окна предварительного просмотра снова инициализируем переменные

if (!e.HasMorePages)

{

stringPrintText = richTextBoxStream.Text;

StartPage = 1;

NumPages = printDialog1.PrinterSettings.MaximumPage;

PageNumber = 1;

}

}

int SymbolsInLines(string stringPrintText, int NumLines)

{

int index = 0;

for (int i = 0; i < NumLines; i++)

{

index = 1 + stringPrintText.IndexOf('\n', index);

if (index == 0)

return stringPrintText.Length;

}

return index;

}