Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual C++(.Net) / Visual C++(.Net).doc
Скачиваний:
167
Добавлен:
09.05.2015
Размер:
1.18 Mб
Скачать

Диалог выбора шрифта

Компонент FontDialogобеспечивает выбор шрифта и его атрибутов (стиля, размера, цвета и т.п.) в диалоговом режиме.

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

Диалог выбора цвета

Компонент ColorDialogделает возможным выбор цвета в диалоговом окне, работает точно так же, как и остальные диалоговые компоненты: выполняется методShowDialog(), открывается палитра цветов, из которой нужно выбрать необходимый цвет. Значение цвета помещается в свойствоColorкомпонента, после чего цвет может использоваться в дальнейшем.

Компонент PrintDialog

Компонент находится в списке Printingпалитры компонентов. С помощью этого компонента можно открыть диалоговое окно настройки печати, где можно выбрать принтер, а также страницы, которые следует вывести на печать, и установить некоторые свойства печати.

Обработчик кнопки, вызывающий метод ShowDialog()компонента, имеет вид:printDialog1->ShowDialog();

Диалоговые окна в текстовом редакторе

Разместим все описанные выше диалоги на форме «Блокнот» и дадим им следующие имена: диалоги открытия и сохранения файлов назовем ODиSD, соответственно, диалог выбора цвета –CD, а диалог выбора шрифта –FD. Диалог, отвечающий за печать, назовемPRN.

Для всех диалоговых окон введем заголовки в свойствах Title, для диалогов открытия и сохранения файлов укажем способ фильтрации и определим свойствоDefaultExtдля диалога сохранения файлов как «txt».

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

Чтобы установить выбранный цвет в качестве фонового в текстовом редакторе, необходимо в обработчике события Clickдля пункта менюBkColorвызвать соответствующий диалог и только в случае, еслиDialogResultбудет совпадать со значениемOK, перекрасить форму в выбранный цвет. Перед вызовом диалога передадим в его свойствоColorцвет, установленный для компонентаtextBox1 в свойствеBackColor.

Для этого создадим обработчик соответствующего события и запишем в нем оператор присваивания цвета и условный оператор:

CD->Color=textBox1->BackColor;

if (CD->ShowDialog()==System::Windows::Forms::DialogResult::OK)

textBox1->BackColor=CD->Color;

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

FD->Font=textBox1->Font;

if (FD->ShowDialog()==System::Windows::Forms::DialogResult::OK)

textBox1->Font=FD->Font;

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

В секции private создадим строковую переменную, в которой будем хранить текущее имя файла: String ^f_name;

Создадим функцию TextToFile, для записи текста в файл. Функция возвращает целочисленное значение, и если оно равно -1 или 0, это будет означать, что пользователь в диалоговом окне выбрал кнопку «Отмена».

Заголовок функции и вспомогательные переменные выглядят следующим образом:

private: int TextToFile(){

System::Windows::Forms::DialogResult DR;

int r=0;

Далее проверим, сохраняем ли новый документ (тот, для которого не выбрано имени – строка с именем файла пуста), и если пользователь выбрал имя файла для сохранения, мы записываем его в переменную f_name. В противном случае возвращаемой переменной присваиваем значение -1.

if (f_name==String::Empty){

DR=SD->ShowDialog();

if (DR==System::Windows::Forms::DialogResult::OK){

f_name=SD->FileName;

r=0;

} else r=-1;

}

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

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

Наконец, заметим, что в параметрах окна сообщения в качестве иконки на этот раз будем использовать изображение MessageBoxIcon::Error.

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

if (r==0){

try{

System::IO::FileInfo ^f_inf=gcnew System::IO::FileInfo(f_name);

System::IO::StreamWriter ^s_write=f_inf->CreateText();

s_write->Write(textBox1->Text);

s_write->Close();

textChanged=false;

r=0;

}

catch (System::IO::IOException ^e){

MessageBox::Show(e->ToString(),"Блокнот", MessageBoxButtons::OK, MessageBoxIcon::Error);

}

}

return r;

}//Конец функции

Эта функция только записывает в файл всю имеющуюся в текстовом компоненте информацию. Напишем еще одну функцию, на этот раз возвращающую void, которая проверяет, были ли произведены какие-либо изменения в тексте и только после этого вызывает функциюTextToFile.

Назовем функцию SaveDocument. Она будет выглядеть следующим образом.

private: void SaveDocument(){

int r=0;

if (textCahnged){

r=TextToFile();

textChanged=false;

}

}

Далее остается только при обработке события Clickдля пункта меню «Сохранить» вызвать функциюSaveDocument().

Приступим теперь к открытию файла. Функция OpenDocument(), также как и функция сохранения, не имеет параметров и возвращаетvoid. Эта функция работает аналогичноTextToFile: выбирается файл, открывается файловый поток для чтения, в компонентtextBox1переносится весь содержащийся в файле текст, а затем поток закрывается. Имя открываемого файла отображается в заголовке окна: свойствуTextформы присваивается значение переменнойf_name.

Текст функции выглядит следующим образом.

private: void OpenDocument(){

System::Windows::Forms::DialogResult DR;

int r;

r=Save_Text();

if (r==0){

OD->FileName=String::Empty;

DR=OD->ShowDialog();

if (DR==System::Windows::Forms::DialogResult::OK){

f_name=OD->FileName;

Text=f_name;

try{

System::IO::StreamReader ^s_read;

s_read=gcnew System::IO::StreamReader(f_name);

textBox1->Text=s_read->ReadToEnd();

textBox1->SelectionStart=textBox1->TextLength;

s_read->Close();

textChanged=false;

}catch(System::IO::FileLoadException ^e){

MessageBox::Show("Ошибка: \n"+e->Message,"Блокнот", MessageBoxButtons::OK, MessageBoxIcon::Error);

}

}

}

}

Заметим, что в функции встречается ссылка на функцию int Save_Text(), не описанную ранее. Эта функция проверяет, были ли внесены в текст какие-либо изменения, и если изменения вносились, предлагает сохранить файл. На примере этой функции рассмотрим ситуацию, когда необходимо создатьMessageBoxс несколькими кнопками.

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

Текст функции приведен ниже.

private: int Save_Text(){

System::Windows::Forms::DialogResult DR;

int r=0;

if (textChanged){

DR=MessageBox::Show("В текст внесены изменения. Сохранить?", "Блокнот",

MessageBoxButtons::YesNoCancel, MessageBoxIcon::Warning);

switch (DR){

case System::Windows::Forms::DialogResult::Yes:

{ r=TextToFile();

break;}

case System::Windows::Forms::DialogResult::No:{

r=0;

break;}

case System::Windows::Forms::DialogResult::Cancel:{

r=-1;

break;}

};

}

return r;

}

Теперь запишем вызов функции OpenDocument в обработчик события Click соответствующего пункта меню.

Теперь немного модифицируем обработчик Click, отвечающий за создание нового документа. Кроме очистки рабочего поля, необходимо проверить, были ли в документ внесены какие-либо изменения. Если они были внесены – сохранить измененный файл. В противном случае – просто очистить компонентtextBox1. Измененный код в этом обработчике будет выглядеть так:

int r=Save_Text();

if (r==0){

textBox1->Clear();

textChanged=false;

f_name=String::Empty;

}

Теперь приложение можно запустить и проверить его работу.

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

Строковые типы в VC++