Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка ПрИн академия 2013.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
5.56 Mб
Скачать
  1. Печать документа

Добавление программных компонентов для печати

Добавьте в окно дизайнера форм компоненты: PrintDocument, PrintDialog, PrintPreviewDialog, PageSetupDialog, как это показано на рисунке 4.19 (если все программные компоненты не помещаются в видимую часто окна, щелкните окно с компонентами правой клавишей мыши и выберите строку Line Up Icons, для того чтобы упорядочить значки компонентов).

Далее Вам нужно будет настроить свойства добавленных компонентов.

Компонент PrintDocument предназначен для вывода данных документа на принтер. Сразу после добавления этот компонент получает идентификатор printDocument1. Свойства компонента  PrintDocument  описывают, как именно нужно распечатывать документ.

Компонент PrintDocument  впишите в свойство:

DocumentName на SimpleNotepadDocument.

Выберите в свойстве  Document остальных  компонентов строку  SimpleNotepadDocument.

Рисунок 4.19 - Добавлены компоненты для печати документов

Для компонента PrintDialog устанавливаем следующие свойства:

AllowSelection – true - Разрешение на печать выделенного фрагмента документа

AllowSomePages – true - Разрешение на печать нескольких страниц

PrintDocument – SimpleNotepadDocument - Связывание с экземпляром объекта PrintDocument.

Для работы с классами, предназначенными для выполнения операций с потоками и печати, добавьте в начало листинга нашей программы следующие строки: using System.Drawing.Printing;

Добавите в конструктор класса формы, соответствующий код:

public SimpleNotepad()

{

InitializeComponent();

//Определяем номер страницы,

// с которой следует начать печать

printDialog1.PrinterSettings.FromPage = 1;

//Определяем максимальный номер печатаемой страницы.

printDialog1.PrinterSettings.ToPage =

printDialog1.PrinterSettings.MaximumPage;

}

//Переменная для хранения текста для печати.

//В нее мы будем помещать текст из RichTextBox

string stringPrintText;

//Переменная, определяющая номер страницы,

// с которой нужно начать печать

int StartPage;

//Переменная, определяющая количество страниц для печати:

int NumPages;

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

int PageNumber;

Следует обратить внимание на переменную stringPrintText — именно она будет отвечать за передачу текста в объект печати. Поскольку мы определили для нее строковый тип, это означает, что мы не сможем вывести на печать рисунки в тексте - как мы знаем, элемент RichTextBox поддерживает их наличие.

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

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

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

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

private void menuFilePageSetup_Click(object sender, EventArgs e)

{

pageSetapDialogl.ShowDialog();

}

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

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

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

private void menuFilePrintPreview_Click(object sender, EventArgs e)

{

//Инициалдизируем переменные

stringPrintiext = richiextBoxStream.Text;

StartPage = 1;

NumPages = printDialogl.PrinterSettings.Maximurlage;

PageNundoer = 1;

//Показываем диалог

printPreviewnialog1.ShowDialog();

}

Для компонента 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;

}

Отображение окна печати документа

Для отображения стандартного диалогового окна печати документов добавьте в класс SimpleNotepadForm следующий код:

private void menuFilePrint_Click(object sender, EventArgs e)

{

printDialogl.AllowSelection = richTextBoxStream.SelectionLength > 0; if (printDialogl.ShowDialog() == DLalcgResult.OK)

{

SimpleNotepadDocument.DocumentName = Text;

//определяем диапазон страницдля печати

switch (printDialogl.PrinterSettings.PrintRange)

{

//Выбраны все страницы

case PrintRange.A11Pages;

stringPrintText = richTextBoxStream.Text;

Start page = 1;

NumPages = printDialogl.PrinterSettings.MaximumPage;

break;

//Bыбрана выделенная область

case PrIntRange.Selection;

stringPrintText = richTextBoxStream.SelectedText;

Start page = 1;

NumPages = printDialogl.PrinterSettings.MaximumPage;

break;

//Выбран ряд страниц

case PrIntRange.SomePages;

stringPrintText = richTextBoxStream.Text;

Start Page = printDialog1.PrinterSettings.FromPage;

NumPages = printDialogl.PrinterSettings.ToPage - StartPage 1;

break;

}

PageNumber = 1;

//Вызываем встроенный метод для начала печати

SimpleNotepadDocument.Print();

Запустите полученное приложение на выполнение.