FirstPicture(); // показать картинку, которая




// есть в каталоге программы

}

//==========================================================

 

//Обработчик второй кнопки

void __fastcall TForm1::BitBtn2Click(TObject *Sender)

{

// щелчок на кнопке Дальше

Image1->Picture->LoadFromFile(aPath+aSearchRec.Name);

Label1->Caption = aSearchRec.Name;

if (FindNext(aSearchRec)!= 0) // найти след, иллюстрацию

{

// иллюстраций больше нет

BitBtn2->Enabled = false; // теперь кнопка Дальше недоступна

}

}

//----------------------------------------------------------

 

Методы создания собственной графики.

Рисование по пикселам

Чаще всего графические задачи возникают тогда, когда нужно отобразить результаты работы, например, построить график рассчитанной функции. График не может висеть просто так на экране. Он должен быть помещен на специальную подложку или экран. Многие компоненты имеют свойство Canvas (канва, холст), который и является такой подложкой. На канве можно изображать готовые или строить свои рисунки. Свойство Canvas имеют формы, и графические компоненты Image, Paint Box, Bitmap и многие другие.

Каждая точка канвы имеет координаты X и Y. Началом координат является верхний левый угол. Единицей измерения координат является пиксел, т.е. наименьший элемент экрана.

Свойство Canvas не отображается в инспекторе объектов. Им следует воспользоваться при записи кода. Рисовать по канве можно разными способами. Первый способ, это рисовать по пикселям. Делается это с помощью свойства канвы Pixels[int X][int Y] – это двумерный массив, в который записывается цвет пиксела, соответствующего координатам X и Y.

Ниже рассмотрен пример, в котором после нажатия кнопки прорисовывается график функции Y=sin(X). Мы предполанаем, что читатель уже самостоятельно сможет создать проект, в котором на форме находится кнопка «Нарисовать» и объект типа Image. В заголовочные файлы поместите #include<math.h>, а в обработчике событий OnClick запишите следующий код:

 

#define PI 3.1415926

int PX, PY; //координаты пикселей

float X,Y; //координаты функции

for(PX=0; PX<Image1->Width; PX++) {

X=PX*4*PI/Image1->Width;

Y=sin(X);

PY=Image1->Height-(Y+1)*Image1->Height/2;

Image1->Canvas->Pixels[PX][PY]=clBlack;

}

 

В результате после нажатия кнопки появится график синусоиды.

Рисование с помощью пера

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

Канва имеет свойство Pen, т.е. перо. В свою очередь этот объект имеет несколько свойств: Color (цвет), Width (ширина линии), Style (стиль линии: сплошная, штриховая, пунктирная и т.д.).

Таблица. Свойства объекта Реn (карандаш)

Свойство Определяет
Color Цвет линии
Width Толщину линии (задается в пикселах)
Style Вид линии (psSolid- сплошная; psDash- пунктирная, длинные штрихи; psDot - пунктирная, короткие штрихи; psDashDot - пунктирная, чередование длинного и короткого штрихов; psDashDotDot - пунктирная, чередование одного длинного и двух коротких штрихов; psClear - линия не отображается (используется, если не надо изображать границу области - например, прямоугольника)

 

Канва имеет так же свойство PenPos, которое определяет координаты пера. Для того, чтобы переместить перо без прорисовки линии используется метод MoveTo(X,Y), где X и Y это координаты точки в которую помещается перо. От этой точки методом LineTo(X,Y) проводится прямая в точку с новыми координатами. Следующий вызов функции LineTo(X,Y) приведет к повторному вычерчиванию прямой от точки в которой остановилось перо до точки с координатами, указанными в качестве аргументов функции.

С помощью пера график той же функции можно нарисовать с помощью следующих инструкций:

#define PI 3.1415926

int PX, PY; //координаты пикселей

float X,Y; //координаты функции

Image1->Canvas->MoveTo(0,Image1->Height/2);

for(PX=0; PX<Image1->Width; PX++) {

X=PX*4*PI/Image1->Width; // X- координата соответствующая PX

Y=sin(X);

PY=Image1->Height-(Y+1)*Image1->Height/2;

Image1->Canvas->Pixels[PX][PY]=clBlack;

//установка черного цвета пикселя

Image1->Canvas->LineTo(PX,PY);

}

Стиль линии, как отмечалось можно менять с помощью свойства Style. Оно может принимать следующие значения

psSolid Сплошная линия
psDash Штриховая линия
psDot Пунктирная линия
psDashDot Штрих-пунктирная линия
psDashDotDot Линия чередующая штрих и два пунктира
psClear Отсутствие линии
psInsideFrame Сплошная линия, но при Width>1 допускающая цвета отдичные от палитры Windows

Все стили со штрихами доступны только при Width =1, иначе они рисуются как сплошные линии.

Любой цвет TColor представляет собой число - перечислимый тип. С числом возможны бинарные операции - and, or, not, xor, not xor и т.д. Так и здесь - смешивание основано на бинарных операциях, когда сравниваются попарно биты двух цветов.

Mode

  • pmCopy - без смешивания - цвет пера перекрывает фон.
  • pmNotCopy - инверсный (операция not) цвет пера перекрывает фон.
  • pmNot - цвет фона заменяется на инверсный.
  • pmXor - xor наложение. Из пары битов возвращается 1, если только один из битов равен 1.
  • pmNotXor - сначала проводится pmXor, а затем результирующий цвет подвергается not-операции.
  • pmMask - логическое and между цветом пера и фоном - возвращается 1, если оба бита равны 1. Приводит к затемнению.
  • pmNotMask - сначала pmMask, а затем pmNot.
  • pmMerge - логическое or между цветом пера и фоном - возвращает 1, если оба бита не равны 0. Приводит к осветлению.
  • pmNotMerge - инверсный pmMerge.
  • pmNop - без изменений.
  • pmBlack - всегда черный.
  • pmWhite - всегда белый.

Хочу особо отметить pmNotXor - очень полезный режим. Объясню почему. Допустим, нужно водить курсор особой формы. Но после него след остается! В режиме pmNotXor при повторной прорисовке восстанавливается цвет фона. Правда, в таком режиме цвет курсора будет меняться в зависимости от фона.

Style

Я уже говорил - стиль линии. Чем тут пунктирный-штрихпунктирный говорить, лучше картинку с разными вариантами приведу:

Напомню, что при ширине больше 1 стили, кроме psInsideFrame, здесь не приведенного, не используются. У меня просто для удобства широкие. Фоновый белый цвет в данном случае - цвет кисти Brush.

Про psInsideFrame. Бывает так, что программа использует звет из палитры High Color, а у бедного юзера только 256 цветов:(. В этом случае при ширине больше 1 в этом стиле цвет сглаживается до наиболее подходящего. Легче, правда, юзеру порекомендовать видеокарту сменить:).

 

С помощью пера можно рисовать не только прямые, но и линии иной формы и некоторые фигуры. Для этого используются следующие методы канвы:

 

Arc Дуга эллипса, в частном случае окружности
Chord Замкнутая фигуру типа сегмента, ограниченного дугой эллипса
Ellipse Эллипс, как частный случай окружность
Pie Сектор эллипса или окружности
Polygon Многоугольник, не обязательно выпуклый
Polyline Рисует ломанную
Rectangle Прямоугольник
RoundRect Прямоугольник со скругленными углами.

 

Кроме линий на канву можно вывести текст. Для этого используется свойство канвы Font и метод TextOut, синтаксис которого

 

void_Fastcall TextOut(int X, int Y, const System::AnsiString Text);

 

Записанный прототип пугает, но на самом деле это выглядит так:

 

Image1->Canvas->TextOut(300,100,”Это текст”);

 

Следующий код написанный в функции формы позволяет проиллюстрировать методы канвы.

 

Image1->Canvas->Font->Style<<fsBold;

Image1->Canvas->TextOut(150,220,"Методы канвы");

Image1->Canvas->Arc(10,10,90,90,90,50,10,50);

Image1->Canvas->TextOut(40,60,"Arc");

//----------------------

Image1->Canvas->Chord(110,10,190,90,190,50,110,50);

Image1->Canvas->TextOut(135,60,"Chord");

//--------------------------------------

Image1->Canvas->Ellipse(210,10,290,50);

Image1->Canvas->TextOut(230,60,"Ellipse");

//--------------------------------------

Image1->Canvas->Pie(310,10,390,90,390,30,310,30);

Image1->Canvas->TextOut(340,60,"Pie");

//--------------------------------------

TPoint points[5];

points[0]=Point(30,150);

points[1]=Point(40,130);

points[2]=Point(50,140);

points[3]=Point(60,130);

points[4]=Point(70,150);

Image1->Canvas->Polygon(points,4);

Image1->Canvas->TextOut(30,170,"Polygon");

points[0].x+=100;

points[1].x+=100;

points[2].x+=100;

points[3].x+=100;

points[4].x+=100;

Image1->Canvas->Polyline(points,4);

Image1->Canvas->TextOut(130,170,"Polyline");

Image1->Canvas->Rectangle(230,120,280,160);

Image1->Canvas->TextOut(230,170,"Rectangle");

Image1->Canvas->RoundRect(330,120,380,160,20,20);

Image1->Canvas->TextOut(325,170,"RoundRect");

 

В результате на экране появятся фигуры

 

 

Рисование кистью

Канва имеет еще одно свойство: Brush – кисть. Оно определяет фон и заполнение замкнутых фигур. В сою очередь Brush имеет ряд свойств. Свойство Color определяет цвет заполнения. Свойство Style определяет шаблон заполнения (штриховку). Свойство Bitmap определяет нестандартное заполнение заданным шаблоном. Шаблон задается битовой матрицей размером 8х8.

 

Таблица 3.3. Свойства объекта Brush (кисть)

Свойство Определяет
Color Цвет закрашивания замкнутой области
Style Стиль заполнения области (bsSolid — сплошная заливка. Штриховка: bsHorizontal — горизонтальная; bsVertical — вертикальная; bsFDiagonal — диагональная с наклоном линий вперед; bsBDiagonal — диагональная с наклоном линий назад; bsCross — в клетку; bsDiagCross — диагональная клетка

 

Создать битовую матрицу можно с помощью графического редактора, описанного выше. Ее следует сохранить в папке вместе с проектом формы. Пусть это будет файл Bitmap1.bmp. Если теперь создать код:

 

Graphics::TBitmap *BrushBmp=new Graphics::TBitmap;

try{

BrushBmp->LoadFromFile("Bitmap1.bmp");

Form1->Canvas->Brush->Bitmap=BrushBmp;

Form1->Canvas->FillRect(Rect(0,0,Form1->Width,Form1->Height));

}

__finally

{

Form1->Canvas->Brush->Bitmap=NULL;

delete BrushBmp;

}

 

и поместить его в обработчик событий формы, например, OnClick, то при щелчке по форме она заполнится шаблоном.

Художник

В качестве примера создадим простое приложение, которое позволяет самостоятельно создавать линии на форме двигая курсор мыши.

Создадим глобальную переменную rule которая определяет режим движения мыши, т.е рисовать или не рисовать.

 

bool rule=false;

Форма может генерировать множества событий, в том числе реагировать на нажатие и отпускание кнопок клавиатуры. Рисование будет происходить тогда, когда хотябы одна кнопка нажата, это значит, что в обработчик onKeyDown нужно поместить

rule=true;

 

а в обработчик onKeyUp

rule=false;

 

Поместим на форму комонент Timer, с вкладки System. Установимего свойство Enable=true, а Interval=1. Это означает, что таймер включен и через 1 миллисекунду он подаст сигнал.

Этот компонент генерирует только одно событие onTimer, которое и является сигналом таймера. В обработчик этого события поместим код.

 

int PX, PY; //координаты пикселей

POINT cur_pos; /* POINT – структура для хранения

координат положения курсора*/

GetCursorPos(&cur_pos); /* функция для определения

позиции курсора в

координатах экрана*/

PX=cur_pos.x-Left-5;

PY=cur_pos.y-Top-36;

If(rule)

Canvas->LineTo(PX,PY);

Else

Canvas->MoveTo(PX,PY);

Теперь можно приступить к рисованию.

 

Надеюсь, что у вас получится лучше.

Этот пример можно усовершенствовать, если рисовать в компоненте Image, тогда на форму можно поместить дополнительные инструменты, позволяющие выбирать толщину линии, ее цвет, помещать стандартные фигуры и т.п., что уже сделано в приложении Paint, входящим в качестве приложения Windows.

 

 

Значок на панели задач (компонент TTrayIcon)

Посмотрим, как можно добавить на панель задач свой значок (т. е. значок для нашей программы расположится рядом с системными часами).

Сначала переносим на форму нашего приложения компонент TTrayIcon с вкладки Samples Палитры компонентов.

Этот компонент невизуальный, т. е. он не будет виден на этапе выполнения программы.

Далее разместите на форме еще два компонента - ImageList с вкладки Win32 Палитры компонентов и PopupMenu с вкладки Standard.

Теперь займемся установкой свойств. Сначала добавьте для компонента ImageList одно изображение. Для контекстного меню добавьте два пункта - с заголовками Восстановить и Спрятать соотвественно (для этого надо сделать двойной щелчок на размещенном на нашей форме компоненте контекстного меню). Далее для формы и для компонента TrayIcon установите свойство PopupMenu в PopupMenu1 (именно такое имя получит наше контекстное меню по умолчанию). Кроме того для связывания компонента TrayIcon со списком изображений установите его свойство Icons в ImageList1. Для того, чтобы для нашего значка на панели задач появлялось контекстноем меню, задайте его свойство PopupMenuOn в imRightClickUp (это означает, что оно будет появляться при щелчке правой кнопкой мыши). И, наконец, установите свойство Visible для компонента TrayIcon1 в true.

Теперь надо добавить обработчики для пунктов контекстного меню. Они будут следующие:

void __ fastcall TForm1::N1Click(TObject *Sender){ // Восстановление формы. Form1->Visible = true; TrayIcon1->Restore();} void __ fastcall TForm1::N2Click(TObject *Sender){ // Сокрытие формы. Form1->Visible = false;}

Запускаем программу. После запуска мы увидите значок программы рядом с часами. При щелчке на нем правой кнопкой мыши появится контекстное меню.

Его пункты будут работать точно также, как и на форме.

 

Мультимедиа и анимация

Общие сведения о звуковых и видеофайлах

Существует множество форматов звуковых и видео файлов. Builder работает только с некоторыми их них.

Наиболее простым звуковым файлом является файл формата .wav. В нем записывается информация о спектре сигнала.

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

Для хранения изображения в системе windows используются файлы с расширением .avi и .mpeg. Такого рода файлы так же поддерживают звук, что позволяет синронно воспроизводить изображение и звук.

Видеофайл хранит информацию о каждом кадре, подобно видеопленке, используемой в кино. Если теперь каждый кадр выодит на экран в течение 1/25 секунды, то для человека создается иллюзия неприрывного движения изображения. Если каждый кадр хранить в виде битовой матрицы, то потребуется занять весь жесткий диск для того, чтобы хранить видеофильм работающий в течение нескольких десятков секунд. Для решения задачи хранения видеофайлов используются принципы сжатия информации. Следует сказать, что любое сжатие означает потерю информации, т.е. ухудшение качества изображения. Это может сказаться на снижении четкости при тех же размерах изображения, уменьшении количества цветов и т.д. Поэтому для хранения видеоинформации обычно используется другой принцип, основанный на хранении только изменившейся части кадра.

 

Способы воспроизведения звуков

Простейшим способом оживить свою программу является использование стандартного сигнала применяемого системой Windows. Конечно, компьютер должен при этом быть оснащен звуковой картой (специальной электронной платой), соответствующим драйвером (программой, преобразующей цифровой код в непрерывное напряжение) и динамиком. Если все это у вас есть, то создайте форму, разместите на ней кнопку, в обработчтке событий которой напишите вызов одной функции:

Beep();

Запустите приложение и послушайте типовой звук системы. Типовой звук можно изменить, для этого нужно воспользоваться панелью управления, точнее пиктограммой «Звуки и устройства».

 

Установка звукового сигнала

 

В операционной системе Windows используется функция формата bool MessageBeep(int uType). Достоинство Builder состоит именно в том, что он позволяет использовать все функции операционной системы. Если теперь в ранее созданной форме вместо функции Beep() вызвать MessageBeep(uType), то меняя значение аргумента функции можно прослушать разные звуки. Аргумент uType может принимать всего пять значений:

 

№п/п Значение Имя звука
  MB_ICONASTERISK SystemAsterisk - звездочка
  MB_ICONEXCLAMATION SystemExclamation - восклицание
  MB_ICONHAND SystemHand – критическая ошибка
  MB_ICONQUESTION SystemQuestion - вопрос
  MB_OK SystemDefault – стандартный звук

 

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

При успешном выполнении функция MessageBeep возвращает ненулевое значение, при аварийном завершении возвражается ноль.

Для того, чтобы прослушать, так называемые, волновые файлы используется функция PlaySaund. Это тоже фанкция API Windows. Функция описана в модуле mmsystem, поэтому для использования функции нужно подключить директиву:

#include<mmsystem.h>

Функция PlaySound имеет следующий формат:

bool PlaySound(char *pszSound, HINST hmod, int fdwSound);

Параметр pszSound – это строка с нулевым символом в конце. Определяет воспроизводимый звук.

Параметр hmod говорит, где хранится звук, если он не равен нулю, то он является звуком из ресурсов windows, если он хранится в ином месте, то hmod равен нулю.

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

 

SND_ASYNC Звук воспроизводится асинхронно, т.е. функция PlaySound передает управление следующему оператору немедленно после начала воспроизведения. Чтобы прекратить асинхронное воспроизведение волнового файла, надо вызвать PlaySound с параметром pszSound, равным 0.
SND_LOOP Воспроизведение звука постоянно повторяется, пока не вызовется PlaySound с параметром pszSound, равным 0. Одновременно надо установить флаг SND_ASYNC асинхронного воспроизведения звука.
SND_NOSTOP Если заданный звук не может быть воспроизведен, поскольку ресурсы, необходимые для воспроизведения, заняты воспроизведением другого звука, функция PlaySound немедленно вернет false, не воспроизводя заданного звука. Если данный, флаг не указан, функция PlaySound пытается остановить воспроизведение другого звука, чтобы устройство могло быть использовано для воспроизведения нового звука.
SND_NOWAIT Если драйвер занят, функция сразу вернется без воспроизведения заданного звука.
SND_PURGE Останавливается воспроизведение любых звуков, вызванных в данной задаче. Если pszSound не 0, останавливаются все экземпляры указанного звука. Если pszSound равен 0, то останавливаются все звуки, связанные с данной задачей
SND_SYNC Синхронное воспроизведение звука события. Функция PlaySound возвращается только после окончания воспроизведения.

Флаги могут комбинироваться операцией or.

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

Если теперь в обработчик события кнопки включить оператор:

 

PlaySound("C:\\Windows\\Media\\ringin.wav",0,SND_ASYNC);

 

Параметр pszSound можно определить через компонент OpenDialog. Для этого на форму следует поместить компонент OpenDialog с вкладки Dialogs, а в обработчтк событий кнопки следует записать оператор:

if(OpenDialog1->Execute()) PlaySound(OpenDialog1->FileName.c_str(),

0,SND_ASYNC);

Нажатие кнопки приведет к открытию окна

Это окно позволяет найти звуковой файл и проиграть его.

Небольшое изменение оператора на

 

if(OpenDialog1->Execute())

PlaySound(OpenDialog1->FileName.c_str(), 0,SND_ASYNC | SND_LOOP);

позволяет многократно прослушивать звук. Для того, чтобы остановить звучание, нужно ввсести еще одну кнопку и вобработчике OnClick записать

 

PlaySound(0,0,SND_PURGE);

Некоторые версии Windows не прекращают воспроизводить звук даже после закрытия формы. Поэтому в обработчик события формы OnClose или OnCloseQuery нужно установить

 

PlaySound(0,0,SND_PURGE);

Выполнение функции PlaySound можно сделать синхронным, т.е. функция не передаст управление следующему оператору пока воспроизводится звук. Для этого следует изменить последний параметр функции:

 

PlaySound("C:\\Windows\\Media\\ringin.wav",0,SND_SYNC);

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

Если теперь попробовать с помощью функции PlaySound воспроизвести какой-нибудь звуковой файл не входящий в систему и в иные названные ранее папки, то ничего не получится. Для воспроизведения таких файлов служит универсальный проигрыватель MediaPlayer. Проигрыватель может воспроизводить как звуковые так и видеофайлы, поэтому мы рассмотрим работу с ним позднее, а сейчас перейдем к вопросу воспроизведения изображения.

 

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

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

Координаты выводимого символа обозначим через x и y. Если организовать вывод на экран символа и при этом горизонтальная координата будет со временем уменьшаться, а вертикальная останется постоянной, то символ постепенно будет перемещаться влево. Точнее, новый сивол будет появляться левее, чем выведенный до него. Если теперь односременно с выводом нового символа стирать старый, то это вызовет эффект перемещения символа справа налево. Для содания такой программы поступим следующим образом. Разместим на форме кнопку и таймер из вкладки System. Таймер – это невизуальный компонент, который может размещаться в любом месте формы. Он имеет два свойства, позволяющие им управлять: Interval –интервал в милисекундах и Enabled — доступность. Свойство Interval задает период срабатывания таймера. Через заданный интервал времени после предыщего срабатывания, или после программной установки свойства или после запуска приложения, таймер срабатывает, вызывая событие OnTimer.

 

В обработчике события OnClic1 кнопки разместим простой код

x=Form1->Width;

Timer1->Enabled=!Timer1->Enabled;

Идентификатор x – целесообразно объявить как глобальную перемену, т.е. объявление

int x;

сделать сразу после директив препроцессора. Там же разместить функцию

void __fastcall TForm1::out(int x){

Form1->Canvas->TextOut(x,100,"a");

Form1->Canvas->TextOut(x+8,100," ");

}

которая с помощью метода TextOut выводит на форму сивол «a » в точке с текущей координатой x и постоянной координатой y =100. Ширина символов, которые выводятся на поверхность формы, составляет около 8 пикселей. Поэтому вывод двух пробелов смещенных на 8 пикселей вправо, позволяет гарантировано стиреть предыдущий символ.

Для того чтобы функция out работала, ее прототип нужно объявить в заголовочном файле, который расположен в том же окне на вкладке Unit1.h. В проивном случае для главной функции WinMain() функция out не будет объявленной. Прототип нужно расположить в классе TForm1.

Вернемся к обработчику кнопки. Щелчек по кнопке меняет состояние таиймера и в то же время порождает событие обращение к таймеру OnTimer. Обработчтк таймера устроен так, что после задержки указанной в его свойстве Interval он выполняет записанный в обработчике код, затем цикл повторяется, т.е. вновь происходит остановка в выполнении программы, после чего исполняется код обработчика, и.т., до тех пор, пока не произойдет новое событие. Если теперь в обработчике таймера вызывать функцию out(x) и изменять значение координаты x, говоря иначе, заприсать код

out(x);

x=x-8;

то выполнение кода будет исполняться с задержкой Interval. Устанавливае Interval в пределах 50-200 милисекунд можно добиться необходимой скорости движения символа.

Теперь осталось совсем немного для того, чтобы выполнить более сложную задачу – создать бегущую строку. Кстати, в предыдущей задаче передвигалась именно строка, состоящая из одного символа.

Понятно, что эта задача похожа на предыдущую, только после передвижения строки должно происходить ее стирание. Сделать это несложно. Добавьте в объявление глобальную переменную – строку, например,

String st="Hello!";

Внесите исправления. Замените в созданнуюой ранее функии out символ на строку

 

void __fastcall TForm1::out(int x){

Form1->Canvas->TextOut(x+27,100," ");

Form1->Canvas->TextOut(x,100,st);

}

 

 

Тепрерь имея некоторый опыт попробуем создать настоящий мультфильм. Конечно, рисунки такого фильма будут довольно простыми. Они будут выполнены с помощью свойства Pen, описанного ранее.

 

 

Откроем новое приложение и поместим на него компоненты Image, Timer и Button. Последние разместим внизу формы. Таймер будет задавать темп смены кадров. Значение параметра Interval компонента Timer зададим равным 500 миллисекундам. Значение параметра Enabled следует сделать равным false.

В нижней части окна формы щелкните по закладке заголовочного файла. Если файлу еще не дано имя, то по умолчанию это Unit1.h.

Закладка заголовочного файла

 

В текст заголовочного файла Unit1.h следует добавить строку

void __fastcall Draw();

 

Это объявление функции, которая будет рисовать изображение. А текст самого модуля Unit1.cpp должен начинаться с объявлений:

short int num =0;

short int H=20; // шаг

short int Xpos=2*H; // координата туловища

short int Ypos=120; // "земля"

short int Hmen=30; // высота тела

short int Rhead=10; // радиус головы

short int Rhead2=Rhead/2; // радиус литавров

short int revers=1; // направление движения

short int L=H*1.41; // длина ноги

 

//--------------------------------------------------------------------

В код основного файла Unit1.cpp внесите следующий код:

void __fastcall TForm1::Draw (){



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: