Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Добавление к строкам меню сочетания клавиш.

Поиск

Выделяете в Properties свойство ShortcutKeys и установите нужное сочетание клавиш.

Измените значение свойства ShowShortcutKeys установив значение true.

В результате выполненных действии получаем меню следующего вида (рис. 4.11):

 

Рисунок 4.11 – Сочетания клавиш меню

 

Добавьте сочетания клавиш для следующих пунктов меню:

Правка – menuEdit

- Отмена – menuFileUndo (CNTR+Z)

- Вырезать – menuFileCut (CNTR+X)

- Копировать – menuFileCopy (CNTR+C)

- Вставить - menuFilePaste(CNTR+V)

- Удалить – menuFileDelete (Del)

- Выделить все – menuFileSelectAll (CNTR+A)

Вставка поля редактирования

Редактирование текста в нашем приложении будет выполнять компонент RichTextBox.

Перетащите из панели Toolbox в форму приложения simpleNotepad компонент RichTextBox и назовем его RichTextBoxStream.

Настройте свойства компонента, чтобы он занимал все окно приложения - отредактируйте свойство Dock. Это свойство задает расположение выбранного компонента внутри содержащей его формы (рис. 4.12).

Рисунок 4.12 - Редактирование свойства Dock

Запустите полученное приложение на выполнение. В результате на экране должно появиться окно, показанное на рисунке 4.13 (в нем мы уже набрали две строки текста).

 

 

Рисунок 4.13 - Текстовый редактор

Работа над дизайном редактора текста завершена.

 

Обработка событий

Создайте обработчик события для строки меню, для этого ее нужно щелкнуть дважды левой клавишей мыши. Все обработчики событий создаются с пустым телом:

private void menuFileNew_Click(object sender, System.EventArgs e)

{

… // код обработки события

}

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

Первый параметр, sender, предоставляет ссылку на объект, вызвавший событие.

Второй параметр, e, в примере передает объект, связанный с обрабатываемым событием. С помощью ссылки на свойства объекта (а также на его методы) можно получить сведения, например о расположении мыши в событиях, вызываемых с помощью мыши, или о данных, которые передаются в ходе событий, возникающих при перетаскивании.

 

2. Работа с файлами документа

Создание нового документа

Если пользователь выберет строку Новый из меню Файл, редактор текста SimpleNotepad должен создать новый текстовый документ. В простейшем случае для этого достаточно просто очистить содержимое окна редактирования, вызвав метод Clear:

private void menuFileNew_Click(object sender, EventArgs e)

{

richTextBoxStream.Clear();

}

Метод Clear вызывается для объекта richTextBoxStream, т.е. для нашего окна редактирования, занимающего все пространство формы.

Открытие существующего файла

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

Значок компонента OpenFileDialog будет показан в нижней части формы (рис.4.14), причем этот компонент получит идентификатор openFileDialog1. Этот идентификатор будет использован нами в программном коде, открывающем исходный файл.

 

Рисунок 4.14 - Добавление компонента OpenFileDialog

 

Добавьте в класс SimpleNotepadForm новый метод MenuFileOpen, предназначенный для открытия существующего файла. Вот его исходный текст:

// меню Открыть

private void menuFileOpen_Click(object sender, EventArgs e)

{

MenuEileOPen(); // вызов метода открытия файла

}

private void MenuFileOpen()

{

openFileDialogl.FileName = “”;

openFileDialogl.Multiselect = false; // запрещено выбирать боль-

// ше 1-го файла

If (openFileDialogl.ShowDialog() == System.Windows.Forms.DialcgResult.0K && openFileDialogl.FileName.Length > 0)

{

try

{

// вывод текста

richTextBoxStream.LoadFile(openFileDialogl.FileName,

RichTextBoxStreamType.RichText);

}

catch (System.ArgumentException ex)

{

richTextBoxStream.LoadFile(openFileDialogl.FileName,

RichTextBoxStreamType.PlainText);

}

this. Text = “ Файл [" + openFileDialogl.FileName + "]";

}

}

Если в окне выбора файла пользователь щелкнул кнопку Open, метод ShowDialog возвращает значение

System.Windows.Forms.DialogResult.OK.

В этом случае мы также дополнительно проверяем, что файл был выбран. Для этого мы сравниваем длину строки полного пути к выбранному файлу openFileDialog1.FileName.Length с нулем:

if(openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
openFileDialog1.FileName.Length > 0) { … }

В том случае, когда пользователь выбрал файл, метод MenuFileOpen предпринимает попытку загрузить этот файл в редактор richTextBox1, вызывая для этого метод LoadFile:

try
{
richTextBox1.LoadFile(openFileDialog1.FileName,
RichTextBoxStreamType.RichText);
}
catch (System.ArgumentException ex)
{
richTextBox1.LoadFile(openFileDialog1.FileName,
RichTextBoxStreamType.PlainText);
}

В качестве первого параметра этому методу передается путь к файлу, а в качестве второго - тип файла RichTextBoxStreamType.RichText. Этот тип соответствует формату RTF.

В том случае, если выбранный файл имеет формат, отличный от RTF, в методе LoadFile возникает исключение System.ArgumentException. Наш обработчик этого исключения выполняет повторную попытку загрузить файл, но на этот раз уже как обычный текст. Для этого мы передаем в качестве второго параметра методу LoadFile значение RichTextBoxStreamType.PlainText.

Если все сделано правильно, то после трансляции исходного приложения редактор сможет открывать существующие файлы для редактирования.

Как работает метод MenuFileOpen?

Получив управление, он вызывает метод openFileDialog1.ShowDialog, отображающий на экране стандартное диалоговое окно выбора файла (рис. 4.15).

 

Рисунок 4.15 - Стандартное диалоговое окно выбора файла

 

Настраивая свойства компонента openFileDialog1, можно изменять внешний вид этого окна.

Задайте фильтр имен открываемых файлов. Для этого выделите компонент openFileDialog в окне дизайнера форм левой клавишей мыши, а затем измените свойство Filter. Присвойте этому свойству следующую текстовую строку:

RTF files|*.rtf|Text files|*.txt|All files|*.*

Строка фильтра состоит из блоков, разделенных символом |.

Первый блок задает название типа файла RTFfiles, отображаемое в поле Files of type диалогового окна выбора файла, а второе - маску для имен файлов. Таким образом, для открытия документов RTF используется маска *.rtf.

Далее следует название формата Text files, соответствующее обычным текстовым файлам. Для этого формата применяется маска *.txt.

И, наконец, чтобы приложение могло открывать файлы любых типов (All files), используется маска *.*.

Продолжим работу. Оттранслируйте и запустите наше приложение. Выбрав с помощью только что описанного окна текстовый файл или файл RTF, щелкните кнопку Open. Выбранный файл будет загружен в окно нашего редактора текста (рис.4.16).

 

Рисунок 4.16 - Загружен файл для редактирования

 

Полный путь к редактируемому файлу будет отображен в заголовке главного окна нашего приложения.

Сохранение файла

Чтобы добавить в наше приложение возможность сохранения документов, перетащите из панели инструментов Toolbox в окно дизайнера форм компонент SaveFileDialog. Этот компонент получит идентификатор saveFileDialog1 (рис. 4.17).

 

Рисунок 4.17 - Добавление омпонента SaveFileDialog

 

После добавления этого компонента отредактируйте его свойства Filter и FileName.

Свойство Filter должно иметь значение, обеспечивающее работу с документами RTF и текстовыми файлами: RTF files|*.rtf | Text files|*.txt

Для свойства FileNam задайте значение doc. При этом по умолчанию документы будут сохраняться в файле с этим именем (рис. 4.18).

Для сохранения документов в файле добавьте в класс SimpleNotepadForm следующий метод с именем MenuFileSaveAs:

private void menuFileSave_Click(object sender, EventArgs e)

{

MenuFileSaveAs();

}

// Сохранениедокумента в новом файле

private void MenuFileSaveAs()

{

saveFileDialogl.Filter = "RTF filesl..rtflText fileslk.txt";

if (saveFileDialogl.ShowDialog() == DialogResult.OK

&& saveFileDialog1.FileName.Length 1 0)
{

switch (saveFileDialog1.FilterIndex)

{

case 1:

richTextBoxStream.SaveFile(saveFileDialogl.FileName,

RichTextBoxStreamType.RichText);

case 2:

richTextBoxStream.SaveFile(saveFileDialogl.FileName,

RichTextBoxitreamType.UnicodePlainText);

break;

}

}

this.Text = ",Daikm [" + saveFileDialogl.FileName + "]"

};

 

 

Рисунок 4.18 - Стандартное диалоговое окно сохранения файла

 

Здесь метод saveFileDialog1.ShowDialog отображает стандартный диалог сохранения файлов, показанный на рисунке 4.18. Если пользователь указал имя файла и щелкнул в этом диалоге кнопку «Сохранить», метод MenuFileSaveAs сохраняет документ в файле, вызывая для этого метод richTextBox1.SaveFile.

Далее этот метод отображает имя сохраненного файла в заголовке окна нашего приложения:

this.Text = "Файл [" + saveFileDialog1.FileName + "]";

Заметим, что существует несколько перегруженных вариантов метода SaveFile.

Если методу SaveFile задан один параметр (путь к сохраняемому файлу), то документ будет сохранен в формате RTF.

Второй параметр позволяет выбрать тип сохраняемого файла.

Если передать через этот параметр значение RichTextBoxStreamType.PlainText, документ будет сохранен в виде текстового файла с потерей форматирования.

В том случае, когда нужно сохранить документ в формате RTF, используйте значение RichTextBoxStreamType.RichText.

Можно также сохранить документ и как текст Unicode, для чего нужно передать через второй параметр методу SaveFile значение RichTextBoxStreamType.UnicodePlainText.

Определив в исходном тексте нашего приложения метод MenuFileSaveAs, добавьте его вызов в обработчики событий от строк Сохранить и Сохранить как.

Для простоты мы сделаем функции этих строк меню одинаковыми.

 

3. Печать документа

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

Добавьте в окно дизайнера форм компоненты: 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();

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

 

4. Закрытие главного окна редактора текста

-ЗАКРЫТИЕ ГЛАВНОГО ОКНА ФОРМЫ

Окно нашего редактора текста должно быть закрыто, когда пользователь выбирает из меню Файл строку Выход. Это легко достигается добавлением метода Close в тело обработчика сообщения menuFileExit_Click:

private void menuFileExit_Click(object sender, EventArgs e)

{

this.Close(); // Изменения в документе будут потеряны

}

Однако здесь возникает проблема: окно редактора текста будет закрыто и в том случае, если пользователь не сохранил сделанные им изменения.

Чтобы решить эту проблему, нам нужно каким-то образом отслеживать наличие изменений в окне редактирования текста.

Определим в классе SimpleNotepadForm поле m_DocumentChanged, в котором будем хранить флаг, отмечающий изменения, сделанные пользователем в документе:

public SimpleNotepadForm()

{

InitializeComponent();

….

}

private bool m_DocumentChanged = false; // Поле которое добавили после класса SimpleNotepadForm

В новом или только что загруженном документе изменений нет, поэтому начальное значение этого флага равно false.

Далее откройте окно визуального проектирования формы и щелкните дважды левой клавишей мыши редактор текста richTextBox1. В результате дизайнер форм создаст для нас обработчик события richTextBox1_TextChanged. Этот обработчик получит управление, как только пользователь внесет любые изменения в содержимое редактируемого документа.

Вам остается только обеспечить изменение состояния флага m_DocumentChanged внутри этого обработчика:

private vcid richiextBoxStreamiextChanged(object sender, EventArgs e)

{

m_DocumentChanged = true,

}

Если пользователь редактировал документ, а потом решил создать новый, выбрав из меню Файл строку Новый, изменения, внесенные в старый документ, могут быть потеряны. Чтобы избежать этого, проверьте флаг m _DocumentChanged перед тем как очищать содержимое редактора текста. Если в редакторе есть не сохраненные изменения, необходимо вызвать метод MenuFileSaveAs, предназначенный для сохранения документа:

private void menuFileNew_Click(object sender, EventArgs e);

{

if (m_DocumentChanged)

{

MenuFileSaveAs();

richiextBoxStream.Clear();

}

}

После того как пользователь сохранил изменения в документе, флаг m_DocumentChanged необходимо сбросить. Для этого отредактируйте исходный текст метода MenuFileSaveAs, добавив в него строку сброса указанного флага:

Добавили строку
// Сохранение документа в новом файле

private void MenuFileSaveAs()

{

saveFileDialogl.Filter = "RTF files|*.rtf|Text files |*.txt”;

if (saveFileDialogl.ShowDialog() == DialogResult.OK

&& saveFileDialcgl.FileName.Length > 0)

{

switch (saveFileDialcgl.FilterIndex)

{

case 1;

richTextBoxStream.SaveFile(saveFileDialogl.FileName,

RichTextBoxStreamType.RichText);

m_DocumentChanged = false;

break;

case 2;

richTextBoxStream.SaveFile(saveFileDialcgl.FileName,

RichTextRoxStreamType.UnicodePlainIext);

m_DocumentChanged = false;

break;

}

}

this. Text = "Файл [" + saveFileDialog1.FileName + "]";

}

Теперь, когда пользователь попытается закрыть программу редактора с помощью строки Выход меню Файл или с помощью соответствующей кнопки строки заголовка окна, не сохранив сделанные изменения, на экране появится стандартное диалоговое окно, предлагающее ему сохранить документ.

Доработаем наш код, чтобы при закрытии окна выводилось сообщение, добавим обработчик формы событие SimpleNotepad_FormClosing:

private void SirpleNotepad_FormClosing(object sender, FormClosingEventArgs e)

{

if (m_DocumentChanged)

{

switch (MessageBox.Show(" Сохранить изменеия в файле ?”,

"Сообщение", MessageBщxButtщns.YesNoCancel))

{

case DialcgResult.Yes;

// "Yes" processing\

MenuFileSaveAs();

break;

case DialcgResult.Cancel;

e.Cancel = true; // Отмена = истина

break;

}

}

}

При закрытии формы появляется сообщение (рис. 4.20):

 

 

Рисунок 4.20 – Окно сообщения о сохранении изменений

 

При выборе ответа «Да», откроется окно сохранения файла, при выборе ответа «Нет», форма закроется, «Отмена» - вернемся на форму.

Аналогичным образом добавьте вывод сообщения в пункт меню Файл – Выход.

- РЕАЛИЗАЦИЯ ФУНКЦИЯ МЕНЮ «ПРАВКА»

5. Реализация функций меню «Правка»

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

Все, что Вам нужно сделать, это вызвать эти методы в соответствующих обработчиках событий.

Подготовьте обработчики событий от всех строк меню Правка следующим образом:

private void menuFileUndo_Click(object sender, EventArgs e)

{

richIextBoxStream.Undo();

}

private void menuFileCut_Click(object sender, EventArgs e)

{

richTextBoxStream.Cut();

}

private void menuFileCopy_Click(object sender, EventArgs e)

{

richTextBoxStream.Copy();

}

private void menuFilePaste_Click(object sender, EventArgs e)

{

richiextBoxStream.Paste();

}

private void menuFileDelete_Click(object sender, EventArgs e)

{

richTextBoxStream.Cut();

}

private void menuFileSelectAll_Click(object sender, EventArgs e)

{

richTextBoxStream.SelectAll();

}

Рисунок 4.21 - В документ вставлен текст и графическое изображение

Теперь наше приложение Simple Notepad сможет обмениваться текстовыми и графическими данными с другими приложениями Microsoft Windows через универсальный буфер обмена Clipboard (рис. 4.21).

 

6. Реализация функций меню «Формат»

Прежде чем продолжить работу над нашим приложением, модифицируйте меню Формат, добавив в него строку - Цвет шрифта, а также два меню второго уровня - Начертание (рис. 4.22) и Выравнивание (рис.4.23)

 

.

Рисунок 4.22 - Меню второго уровня Начертание

 

 

Рисунок 4.23 - Меню второго уровня Выравнивание

 

Для того чтобы добавить меню второго уровня, Вам нужно вначале ввести с клавиатуры его название (как Вы это делаете для строк меню первого уровня). Затем необходимо ввести названия строк меню второго уровня в поле Type Here, расположенном справа от только что введенной строки первого уровня.

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

Измените названия:

Изменить цвет – menuFormatColor

Начертание - menuFormatCharacterStyle

- Жирный – menuFormatCharacterStyleBold

- Курсив – menuFormatCharacterStyleItalic

- Подчеркнутый – menuFormatCharacterStyleUnderline

- Зачеркнутый – menuFormatCharacterStyleStrkeout

Выравнивание – menuFormatParagraphAlignment

- По левому краю – menuFormatParagraphAlignmentLeft

- По центру – menuFormatParagraphAlignmentCenter

- По правому краю – menuFormatParagraphAlignmentRight

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

Шрифт символов

Чтобы пользователь мог выбирать шрифт фрагмента текста, выделенного в окне редактирования программы SimpleNotepad, перетащите мышью из панели Toolbox в окно дизайнера формы компонент FontDialog.

Этот компонент отображает на экране стандартное диалоговое окно выбора шрифта, показанное на рисунке 4.24.

 

 

Рисунок 4.24 - Стандартное диалоговое окно выбора шрифта Font

Чтобы отобразить это диалоговое окно, добавьте вызов метода fontDialog1.ShowDialog в тело обработчика события menuFormatFont_Click, получающего управление при выборе строки Шрифт из меню Формат:

private void menuFileFont_Click(object sender, EventArgs e)

{

if(fontDialogl.ShowDialog ()==DialogResult.OK)

{

richTextgoxStream.SelectionFont=fontDialogl.Font)

}

}

После того как пользователь выбрал нужный ему шрифт, обработчик события переписывает этот шрифт из свойства fontDialog1.Font в свойство richTextBox1.SelectionFont. Свойство SelectionFont позволяет изменить шрифт фрагмента текста, выделенного пользователем (или программой) в окне редактирования.

Цвет символов

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

Этот компонент отображает на экране стандартное диалоговое окно выбора цвета (рис.4.25).

 

 

Рисунок 4.25 - Стандартное диалоговое окно выбора цвета Color

Далее модифицируйте обработчик событий для строки «Изменить цвет» меню «Формат» следующим образом:

private void menuFormatColor_Click(object sender, EventArgs e)

{

if (colorDialogl.ShowDialog() == DialogResult.OK)

{

richTextBoxStream.SelectionColor = colorDialogl.Color);

}

}

Здесь программа вначале отображает диалоговое окно выбора цвета, вызывая для этого метод colorDialog1.ShowDialog. Затем она переписывает выбранный цвет из свойства colorDialog1.Color диалогового окна в свойство richTextBox1.SelectionColor окна редактирования текста. В результате цвет фрагмента текста, выделенного пользователем перед выполнением данной операции, будет изменен.

Стиль символов

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

Реализация соответствующей функциональности возложена на методы SetBold, SetItalic, SetUnderline и SetStrikeout, которые мы добавили в обработчики сообщений строк меню Начертание:

 

private void menuFormatFontCharacterStyleBold_Click(object sender,
System.EventArgs e)
{
SetBold(); //
вызов метода – жирный шрифт
}
private void menuFormatFontCharacterStyleItalic_Click(object sender,
System.EventArgs e)
{
SetItalic();//
вызов метода –курсив
}
private void menuFormatFontCharacterStyleUnderline_Click(
object sender, System.EventArgs e)
{
SetUnderline();//
вызов метода – подчеркнутый шрифт
}
private void menuFormatFontCharacterStyleStrikeout_Click(
object sender, System.EventArgs e)
{
SetStrikeout();//
вызов метода – зачеркнутый шрифт
}

Все эти методы имеют одинаковую внутреннюю структуру, поэтому подробно мы расскажем только об одном из них — о методе SetBold.

Вот исходный текст данного метода:

 

private void SetBold()

{

if (richTextBox1.SelecticnFont!= null)

{

System.Drawing.Font current Font = richTextBox1.SelectionFront;

System.Drawing.FontStyle newFontStyle;

if (richTextBox1.SelectionFont.Bold == true)

{

newFontStyle = FontStyle.Regular;

}

else

{

newFontStyle = FontStyle.Bold;

}

richTextBox1.SelecticnFant = new Font(ourrentFont.FontFamily, ourrentFont.Sice, newFontStyle);

CheckMenuFontCharacterStyle();

Получив управление, метод SetBold определяет шрифт фрагмента текста, выделенного пользователем, анализируя свойство richTextBox1.SelectionFont. Если шрифт определить не удалось, и это свойство содержит значение null, наша программа не делает никаких изменений.

Далее метод SetBold проверяет, был ли выделен фрагмент текста жирным шрифтом, анализируя свойство richTextBox1.SelectionFont.Bold. Если это свойство содержит значение true, то метод SetBold снимает выделение, если нет, то устанавливает его.

Для снятия выделения программа записывает в переменную newFontStyle значение FontStyle.Regular, а для установки — значение FontStyle.Bold.

В дальнейшем содержимое переменной newFontStyle будет использована методом SetBold для изменения оформления выделенного фрагмента текста. Это изменение выполняется следующим образом:

richTextBox1.SelectionFont = new Font(currentFont.FontFamily currentFont.Size,newFontStyle);

Здесь программа вначале создает новый шрифт как объект класса Font, передавая конструктору размер текущего шрифта currentFont.Size, а также новый стиль шрифта из переменной newFontStyle.

Далее этот шрифт записывается в свойство richTextBox1.SelectionFont, что и приводит к изменению стиля символов выделенного фрагмента текста.

Обратите также внимание, что при выделении фрагмента текста жирным шрифтом мы одновременно отмечаем «галочкой» строку меню Жирный. С этой целью мы вызываем созданный нами метод CheckMenuFontCharacterStyle:

/// <summary>

/// Установка отметки строк меню Font->CharacterStyle

/// </summary>

private void CheckMenuFontCharacterStyle()

{

if (richTextBoxStream.SelectionFont.Bold == true)

{

menuFormatCharacterStyleBold.Checked = true;

}

else

{

menuFormatCharacterStyleBold.Checked = false;

}

if (richTextboxStream.SelectionFont.Italic == true)

{

menuFormatCharacterStyleItalic.Checked = true;

}

e1se

{

menuFormatCharacterStyleItalic.Checked = false;

}

if (richTextBoxStream.SelectionFont.Underline == true)

{

menuFormatCharacterStyleUnderline.Checked = true;

}

ese

{

menuFormatCharacterStyleUnderline.Checked = false;

}

if (richTextgoxStream.SelectionFont.Strikeout == true)

{

menuFormatCharacterStyleStrkeout.Checked = true;

}

else

{

menuFormatCharacterStyleStrkeout.Checked = false;

}

}

Метод CheckMenuFontCharacterStyle по очереди проверяет стилевое оформление выделенных фрагментов, отмечая «галочками» соответствующие строки меню CharacterStyle или снимая со строк этого меню отметки.

Если фрагмент текста, выделенный пользователем, оформлен жирным шрифтом, свойство richTextBox1.SelectionFont.Bol содержит значение true. В этом случае наша программа отмечает «галочкой» строку Жирный меню Начертания, записывая значение true в свойство Checked данной строки:

menuFormatFontCharacterStyleBold.Checked = true;

Когда оформление жирным шрифтом снимается, программа убирает галочку, записывая в свойство Checkedзначение false:

menuFormatFontCharacterStyleBold.Checked = false;

Исходные тексты методов SetItalic, SetUnderline и SetStrikeout приведены ниже:

Установка стиля символов Italic

//Установка стиля символов Italic

private void SetItalic()

{

if (richTextboxStream.SelectionFont!= null)

{

System.Drawing.Font currentFont = richTextboxStream.SelectionFont;

System.Drawing.FontStyle newFontStyle;

if (richTextBoxStream.SelectionFont.Italic == true)

{

newFontStyle = FontStyle.Regular;

}

else

{

newFontStyle = FontStyle.Italic;

}

richTextBoxStream.SelectionFont = new Font(

currentFont.FontFamily, currentFont.Size, newFontStyle);

CheckMenuFontCharacterStyle();

}

}

Установка стиля символов Underline

// Установка стиля символов Underline

private void SetUnderline()

{

if (richTextBoxStream.SelectionFont!= null)

{

System.Drawing.Font currentFont richiextBoxStream.SelectionFont;

System.Drawing.FontStyle newFontStyle;

 

if (richTextBoxStream.SelectionFont.Underline == true)

{

newFontStyle = FontStyle.Regular;

}

else

{

newFontStyle = FontStyle.Underline;

}

richiextBoxStream.SelectionFont = new Font(

currentFont.FontFamily, ourrentFont.Size, newFontStyle);

CheckMenuFontCharacterStyle();

}

}

Установка стиля символов Strikeout

// Установка стиля символов Strikeout

private void SetStrikeout()

{

if (richTextBoxStream.SelectionFont!= null)

{

System.Drawing.Font cusrentFont = richTextBoxStream.SelectionFont;

System.Drawing.FontStyle newFontStyle;

if (richTextBoxStream.SelectionFont.Strikeout == true)

{

newFontStyle = FontStyle.Regular;

}

e1se

{

newFontStyle = FontStyle.Strikeout;

{

richTextBoxStream.SelectionFont = new Font(

currentFont.FontFamily, currentFont.Size, newFontStyle);

CheckMenuFontCharacterStyle();

}

}

7. Выравнивание параграфов

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

После небольшой доработки наш редактор текста тоже сможет выравнивать параграфы текста, а также графические изображения.

Для изменения выравнивания текста мы создали в меню Формат меню второго Выравнивание (рис. 4.23).

Подготовьте обработчики событий для строк меню следующим образом:

private void menuFormatParagraphAlignmentLeft_Click(chject sender, EventArgs e)

{

richTextBoxStream.SelectionAlignment = HorizontalAlignment.Left;

}

private void menuFormatParagraphAlignmentCenter_Click(object sender, EventArgs e)

{

richTextBoxStream.SelectionAlignment = HorizontalAlignment.Center;

}

private void menuFormatParagraphAlignmentRight_Click(object sender, EventArgs e)

{

richTextBoxStream.SelectionAlignment = HcrizontalAlignment.Right;

}

Все эти обработчики событий строк меню изменяют значение свойства richTextBox1.SelectionAlignment, задающего выравнивание параграфа текста, выделенного пользователем.

Чтобы текущий (выделенный) параграф выровнять по левой границе документа, в это свойство нужно записать значение HorizontalAlignment.Left. Для выравнивания по правой границе воспользуйтесь значением HorizontalAlignment.Right. И, наконец, для центровки параграфа потребуется значение HorizontalAlignment.Center.

 

8. Реализация функций меню «Справка»

Разработаем диалоговое окно, содержащее сведения о приложении, такие как название, версия, имена и электронные адреса авторов приложения и пр.

Для создания такого окна в приложении SimpleNotepad мы добавим в проект новую форму. В окне этой формы и будет отображаться вся информация о нашем приложении.

Добавление новой формы



Поделиться:


Познавательные статьи:




Последнее изменение этой страницы: 2016-06-29; просмотров: 120; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.198.51 (0.011 с.)