
- •Часть 2. Сборник рецептов по визуальному программированию Введение в объектно-ориентированное программирование
- •Создание проекта в VisualStudio
- •Файлы проекта
- •Сведения об объекте
- •Общие свойства всех объектов
- •Класс Form
- •Помещение компонента в форму и прочие действия с дизайнером форм
- •Свойства форм
- •События формы
- •Методы формы
- •Компоненты ввода и отображения текстовой информации Компонент Label
- •Некоторые свойства компонента Label
- •Компонент TextBox
- •Методы TextBox
- •Компонент RichTextBox
- •Ввод числовых значений в компонент TextBox
- •Проверка, введены ли значения
- •Компонент ListBox
- •Компонент ComboBox
- •Ввод данных из файла
- •Компонент MaskedTextBox
- •Кнопки, индикаторы и управляющие элементы Компонент Button
- •Компонент Panel
- •Компоненты RadioButtonиCheckBox
- •Компонент GroupBox
- •Пример. Комплектация автомобиля
- •Работа с меню Главное меню
- •Контекстное меню
- •Создание текстового редактора
- •Системные диалоги
- •Компонент OpenFileDialog
- •Компонент SaveFileDialog
- •Диалог выбора шрифта
- •Диалог выбора цвета
- •Компонент PrintDialog
- •Диалоговые окна в текстовом редакторе
- •Расширенные символы Unicode
- •Работа с графикой Использование графических файлов
- •Создание фотоальбома
- •Методы для рисования на форме и прочих компонентах
- •Работа с таймером
- •Работа с датой и временем
- •Добавление новых форм к проекту
- •Многостраничные панели
- •Способы задания страниц
- •Методы TabControl
Диалог выбора шрифта
Компонент 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++