- •Создание Windows-приложения «Редактор текста» в среде разработки Visual Studio содержание
- •Создание редактора текста
- •Добавление меню
- •Переименование меню и строк меню
- •Вставка поля редактирования
- •Обработка событий
- •Работа с файлами документа
- •Создание нового документа
- •Открытие существующего файла
- •Сохранение файла
- •Печать документа
- •Печать документа Добавление программных компонентов для печати
- •Настройка параметров страницы документа
- •Предварительный просмотр документа перед печатью
- •Отображение окна печати документа
- •Закрытие главного окна редактора текста
- •Закрытие главного окна формы
- •Реализация функция меню «правка»
- •Реализация функций меню «правка»
- •Реализация функций меню формат
- •Шрифт символов
- •Цвет символов
- •Стиль символов
- •Выравнивание параграфов
- •Реализация функций меню «справка»
- •Добавление новой формы
- •Отображение формы
- •Создание инструментальной панели
- •Добавление инструментальной панели в окно приложения
- •Добавление изображений в проект.
- •Редактирование кнопок инструментальной панели
- •Строка состояния
- •Строка состояния
Настройка параметров страницы документа
Реализацию функциональности, имеющей отношение к печати документов, мы начнем с самого простого - отображения диалогового окна, предназначенного для настройки параметров страницы документа.
Добавьте в событие пункта меню «Параметры страницы» класса 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;
}