Урок 20 Практика.Создаём просмотровщик графики форматов jpeg, bmp
April 5, 2006
в колонках играет Placebo -Every you, every me
Сегодня, можно сказать у нас небольшой юбилей, как никак двадцатый выпуск уроков!
Вы наверно видели подобные самоучители, они неплохи, но зачастую в них не хватает примеров создания полноценных приложений.Ведь именно в таких программах можно посмотреть приёмы и способы практического программирования.Иногда, простого объяснения свойств и методов не хватает для полноценного восприятия.Поэтому, периодически я буду делать программы и подробно объяснять что к чему.
Сегодня мы создадим полноценный графический просмотровщик.Исходник вы найдёте в папке этой программы, в подпапке data.Наша программа будет в сто раз круче ACDSee и виндовской программы просмотра факсов и изображений вместе взятых.)Это я выразился конечно излишне пафосно, но если вы сможете доделать рассмотренную сегодня программу, то может получиться что-то очень достойное.Кстати, наш программа подойдёт для просмотра папок с не очень большим количеством картинок и соответственно картинок не высокого разрешения.Смотреть в ней фотки, сделанные цифровиком, будет неудобно.Работать прога будет, но тормоза бдут наблюдаться жуткие...Этот пример приведён только для показа приёмов программирования.Итак, хватит болтовни, приступим...
Создайте новый проект и сохраните его в отдельную папку, потом в эту папку скопируйте несколько картинок(это для быстрого тестирования работы программы)
Киньте на форму CDirectoryOutline(переименуйте его в D) со вкладки Samples, DriveComboBox со вкладки Win3.1, Label.
Теперь внимание, киньте на форму ScrollBox(вкладка Additional) и разместите в правой части формы(на рисунке показано пунктиром).Теперь
киньте Panel в самый верх формы и только потом растяните и перетащите его ровно по размерам ScrollBox.Смысл этой операции в том, чтобы родителем Panel был не ScrollBox , а Form1.Установите свойство панели visible =false.Теперь на панель проместите Image и установите его св-во Align(выравнивание)=alClient, это для того, чтобы картинка занимала всю панель, а также установите св-ва Stretch=true и Proportional=true.
Вот как это должно примерно выглядеть.Посмотрите что получилось в Object Treeview
Теперь напишем собственно код.Для начала создадим функцию, которая будет создавать одну превьюшку.(выглядеть она будет, как показано на рисунке).
Наша превьюшка будет состоять из 3 компонентов TShape, TImage, TLabel
Создавать мы её будем при помощи функции, имеющей 4 параметра.X,Y - положение, относительно Panel1.FileName -имя файла, который следует загрузить . Name - имя компонента
void __fastcall TForm1::AddThumb(int x,int y,AnsiString FileName,AnsiString Name)
{
//Shape нам нужен только для красоты.Тут мы устанавливаем различные св-ва
TShape *SHAPE = new TShape(this);
SHAPE->Parent=ScrollBox1;
SHAPE->Top=y;
SHAPE->Left=x;
SHAPE->Width=145;
SHAPE->Height=120;
SHAPE->Brush->Color=clBlack;//цвет линий
SHAPE->Brush->Style=bsFDiagonal;//стиль заливки
SHAPE->Name="SuperShape"+Name;
//код для создания картинки
TImage *IMAGE = new TImage(this);
IMAGE->Parent=ScrollBox1;
IMAGE->Top=y+8;//здесь мы используем относительные значения(чтобы у на компоненты не были расположены друг на друге или ещё чёрте как)
IMAGE->Left=x+8;
IMAGE->Width=129;
IMAGE->Height=97;
IMAGE->Stretch=true;
IMAGE->Proportional=true;
IMAGE->Picture->LoadFromFile(D->Directory+"\\"+FileName);
IMAGE->Name="SuperImage"+Name;
IMAGE->OnClick=ThumbClick;//при нажатии на картинку будет выполняться функция ThumbClick , о которой мы поговорим пойзже.
//создаём надпись под картинкой с именем файла
TLabel *LABEL = new TLabel(this);
LABEL->Parent=ScrollBox1;
LABEL->Top=y+106;
LABEL->Left=x+8;
LABEL->Name="SuperLabel"+Name;
LABEL->Caption=FileName;//устанавливаем надпись на Label
}
Теперь напишем функцию ThumbClick для обработки нажатий мышкой на картинки:
void __fastcall TForm1::ThumbClick(TObject *Sender)
{
TImage* tmpedit1=dynamic_cast<TImage*>(Sender);
if(tmpedit1!=NULL)
{
//переменной s присвоим цифру, которая содержиться в названии картинки(т.е. из имени "SuperImage4" мы должны получить просто "4" и записать это значение в s)
//дальнейшие процедуры нужны, чтобы извлечь из Label имя файла и загрузить его в Image1 с Panel1
String s=tmpedit1->Name.SubString(11,tmpedit1->Name.Length()-10);
TLabel* tmpedit2=dynamic_cast<TLabel*>(Form1->FindComponent("SuperLabel"+s));
//загружаем картинку
Image1->Picture->LoadFromFile(D->Directory+"\\"+tmpedit2->Caption);
Panel1->Visible=true; //делаем панель видимой
}
}
В результате работы этой функции у нас будет появляться увеличенное изображение .
Не забудьте написать в событии onClick у Image1 следующую строку:
Panel1->Visible=false;
Это нам поможет при нажатии на увеличенную картинку, скрывать её и снова показывать превьюшки.
Теперь осталось написать последнюю большую функцию, которая буде выполнять поиск файлов в указанной папке и загружать картинки при помощи AddThumb(...) в ScrollBox1
void __fastcall TForm1::DClick()
{
//вначале напишем функцию, удаляющую все компоненты из ScrollBox1.Иначе будет возникать ошибка, что компонент с таким именем уже существует.
///////////////////////////////////////////////////////////////////
int x,y;
x=0;y=ScrollBox1->ControlCount;
while(x<y)
{
delete ScrollBox1->Controls[0];
x++;
}
////////////////////////////////////////////////////////////////////
//X - отступ слева Y - отступ сверху, Z - счётчик
X=10;Y=10;
Z=1;
//процедура поиска файлов в указанной папке(D->Directory+"\\*.*")
TSearchRec SR;
int FindRes;
FindRes=FindFirst(D->Directory+"\\*.*",faAnyFile,SR);
while(FindRes==0)
{
if ((SR.Attr && faDirectory)==faDirectory) // если найденный элемент каталог и
{
FindRes=FindNext(SR); // продолжить поиск
break; // продолжить цикл
}
if(ExtractFileExt(SR.Name).UpperCase()==".JPG" || ExtractFileExt(SR.Name).UpperCase()==".BMP")//если расширение файла jpg или bmp, то..
{
AddThumb(X,Y,SR.Name,IntToStr(Z));//создание превьюшки, причём в качестве имени используется порядковый номер рисунка
//разбрасываем картинки по двум столбикам
if(X==10){X=170;}
else{X=10;Y=Y+140;}
Z++;//
}
FindRes=FindNext(SR);
}
FindClose(SR);//заканчиваем поиск
}
Эта функция сделает превьюшки для всех рисунков из папки, которую пользователь выделил в CDirectoryOutline1
Напишите в событии onChange у DriveComboBox1
D->Drive=DriveComboBox1->Drive;
Напишите в событии onChange у D (это мы переименовали CDirectoryOutline)
DClick();
Теперь посленее, объявите наши функции в unit1.h
__published: // IDE-managed Components
TScrollBox *ScrollBox1;
TDriveComboBox *DriveComboBox1;
TLabel *Label1;
TPanel *Panel1;
TImage *Image1;
TCDirectoryOutline *D;
void __fastcall ThumbClick(TObject *Sender);
void __fastcall AddThumb(int x,int y,AnsiString FileName,AnsiString Name);
void __fastcall DClick();
также не забудьте подключить заголовочный файл jpeg.hpp в unit1.h
#include <jpeg.hpp>
Вот пожалуй и всё.F9 и вперёд!
Если есть вопросы по этому материалу или вопросы в принципе, пишите на мыло, ответы постараюсь выложить в последующих уроках.
Author of article - MA F*CKA CREW 2006
www.builderhelper.3dn.ru
builder.helper@rambler.ru