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

Создание фотоальбома

Создадим приложение «Фотоальбом», которое позволяет просматривать фотографии. Это приложение демонстрирует пример работы с компонентом 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);

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

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