
- •Часть 2. Сборник рецептов по визуальному программированию Введение в объектно-ориентированное программирование
- •Создание проекта в VisualStudio
- •Файлы проекта
- •Сведения об объекте
- •Общие свойства всех объектов
- •Класс Form
- •Помещение компонента в форму и прочие действия с дизайнером форм
- •Свойства форм
- •События формы
- •Методы формы
- •Компоненты ввода и отображения текстовой информации Компонент Label
- •Некоторые свойства компонента Label
- •Компонент TextBox
- •Методы TextBox
- •Компонент RichTextBox
- •Ввод числовых значений в компонент TextBox
- •Проверка, введены ли значения
- •Компонент ListBox
- •Компонент ComboBox
- •Ввод данных из файла
- •Компонент MaskedTextBox
- •Кнопки, индикаторы и управляющие элементы Компонент Button
- •Компонент Panel
- •Компоненты RadioButtonиCheckBox
- •Компонент GroupBox
- •Пример. Комплектация автомобиля
- •Работа с меню Главное меню
- •Контекстное меню
- •Создание текстового редактора
- •Системные диалоги
- •Компонент OpenFileDialog
- •Компонент SaveFileDialog
- •Диалог выбора шрифта
- •Диалог выбора цвета
- •Компонент PrintDialog
- •Диалоговые окна в текстовом редакторе
- •Расширенные символы Unicode
- •Работа с графикой Использование графических файлов
- •Создание фотоальбома
- •Методы для рисования на форме и прочих компонентах
- •Работа с таймером
- •Работа с датой и временем
- •Добавление новых форм к проекту
- •Многостраничные панели
- •Способы задания страниц
- •Методы TabControl
Создание фотоальбома
Создадим приложение «Фотоальбом», которое позволяет просматривать фотографии. Это приложение демонстрирует пример работы с компонентом PictureBox.
На его форме располагаются следующие компоненты: PictureBox, которую мы назовемPhoto, две кнопки, которые назовем, соответственноPrevиNext(эти кнопки позволят открыть предыдущее и последующее изображения), а также компонентComboBox, в котором располагается название раздела фотоальбома: кошки, собаки, лошади, птицы. На кнопкахPrevиNextне должно быть никаких надписей, на них необходимо загрузить изображения (файл в формате *.png) стрелок прокрутки вправо и влево соответственно. Пример окна приложения приведен на рис.
При выборе того или иного раздела, происходит открытие соответствующей папки, содержащей изображения, относящиеся к выбранному разделу. Создадим эти папки в той же директории, в которую записан код программы и назовем их birds,cats,dogsиhorses. В эти папки загрузим по несколько изображений соответствующих животных в форматеjpg.
Установим свойство SizeModeкомпонентаPictureBoxкакZoom, т.е. будем масштабировать фотографию пропорционально, но отображать в компоненте полностью.
Для работы с приложением объявим три переменные в секции privateкласса формы:
String ^aPath; - в этой переменной будет храниться путь к отображаемому файлу;
System::Collections::Generic::List<String^> ^imgList; - это список всех изображений, находящихся в текущей папке;
int cImg; - счетчик изображений в текущей папке.
Очевидно, что счет изображений в папке ведется с нуля и до значения imgList->Count.
Напишем обработчики событий Clickдля кнопокPrevиNext. Алгоритм обработки этого события одинаков в обоих случаях.
Например, для кнопки Nextон будет выглядеть следующим образом.
Шаг 1. Проверить, активна ли кнопкаPrev. Если она не активна, сделать ее таковой (Prev->Enabled=true;).
Шаг 2.Если номер отображаемого изображенияcImgне превосходит значенияimgList->Count, выполнить шаги 3 и 4, в противном случае перейти на шаг 5.
Шаг 3.Увеличить номер отображаемого изображения (cImg++;). Отобразить текущее изображение (Photo->Image=gcnew Bitmap(aPath+"\\"+imgList[cImg]);).
Шаг 4.ЕслиcImg==imgList->Count-1, то сделать кнопкуNextне активной (Next->Enabled=false;).
Шаг 5.Конец алгоритма.
Алгоритм для кнопки Prevоставим в качестве упражнения.
При выборе категории из списка comboBox1необходимо перейти в соответствующую папку и загрузить информацию обо всех имеющихся в ней изображениях. Назовем эту функциюFillList, и напишем ее чуть позже. Сначала приведем обработчик событияSelectedIndexChanged для компонентаcomboBox1. В этом событии проверяется индекс выбранного из списка элемента (comboBox1->SelectedIndex) и загружается соответствующая папка. Так как папки с изображениями находятся в той же директории, что и сама программе, для задания их адреса достаточно просто указать их названия (в этом случае будет осуществлен поиск папки относительно текущей директории). После выбора папки, загрузим информацию об имеющихся в ней изображениях. Таким образом, тело функции выглядит следующим образом.
switch (comboBox1->SelectedIndex){
case 0: //кошки
{
aPath=gcnew String ("cats");
FillList(aPath);
break;
}
case 1: //собаки
{
aPath=gcnew String ("dogs");
FillList(aPath);
break;
}
case 2: //лошади
{
aPath=gcnew String ("horses");
FillList(aPath);
break;
}
case 3: //птицы
{
aPath=gcnew String ("birds");
FillList(aPath);
break;
}
default: //какая-то лажа
{
MessageBox::Show("Это мы не показываем!", "Фотоальбом");
}
}
Функция FillListбудет возвращать логическое значение:false, если в папке нет картинок иtrue, если в папке есть файлы формата *.jpg. В качестве параметра в эту функцию передадим полный путьaPathк выбранной папке.
Для корректной работы всех операторов этой функции необходимо указать дополнительное пространство имен: using namespace System::IO;в верхних строчках файла. В этом пространстве имен находится используемый функцией классDirectoryInfo, позволяющий получить всю необходимую информацию о выбранной директории.
private: bool FillList (String ^aPath){
DirectoryInfo ^di=gcnew DirectoryInfo(aPath);
Далее, сформируем массив имен файлов, содержащихся в этой директории.
array<FileInfo^> ^fi=di->GetFiles("*.jpg");
Очистим список загруженных имен файлов и инициализируем кнопки для пролистывания файлов в фотоальбоме.
imgList->Clear();
Prev->Enabled=false;
Next->Enabled=true;
Занесем все имена файлов в список imgList и укажем путь к файлу в заголовке формы. Если не удается загрузить в список ни один файл, завершить выполнение функции и вернуть значение false.
for each (FileInfo ^fc in fi)
imgList->Add(fc->Name);
this->Text=aPath;
if (imgList->Count==0)
return false;
В противном случае выполнить следующие действия. Установить указатель cImg на первый файл и загрузить его в компонент Photo. В зависимости от количества изображений в папке сделать активными или не активными кнопки для прокрутки. Занести путь к файлу в заголовок формы и завершить выполнение функции, вернув значение true.
else{
cImg=0;
Photo->Image=gcnew Bitmap(aPath+"\\"+imgList[cImg]);
Prev->Enabled=false;
if (imgList->Count==1)
Next->Enabled=false;
this->Text=aPath;
return true;
}
}
Наконец, загрузим папку «по умолчанию» при запуске программы. Такой папкой в нашем случае будет «cats», соответствующая первой записи в компонентеcomboBox1. Для этого в конструктор классаForm1добавим следующий код.
DirectoryInfo^ di;
di=gcnew DirectoryInfo("cats");
aPath=di->FullName;
this->Text=aPath;
imgList=gcnew System::Collections::Generic::List<String^>;
FillList(aPath);
На самом деле, тут выполняются абсолютно те же действия, что и при выборе элемента из списка.
В качестве упражнения предлагается модифицировать фотоальбом таким образом, чтобы папка с картинками выбиралась пользователем, а по умолчанию загружать папку «Мои рисунки».