Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Задача 27. Просмотр иллюстраций.



Программа Просмотр иллюстраций (Рис. 34) позволяет просмотреть файлы формата JPEG, например — фотографии. Выбор рабочей папки (каталога) выполняется в стандартном окне
Выбор папки. Иллюстрации можно просматривать по кадрам
или в режиме слайд-шоу.

Рис 34

Вывод:

Листинг

#include < FileCtrl.hpp> // для доступа к SelectDirectory tinclude < jpeg.hpp> // обеспечивает работу с // иллюстрациями в формате JPEG

AnsiString aPath; // каталог, в котором находится // иллюстрация TSearchRec aSearchRec; // рез-т поиска файла

102 Часть 1. Примерыизадачи

void fastcall TForml:: FormCreate(TObject *Sender)

aPath = " "; // текущий каталог - каталог, из которого // запущена программа FirstPicture(); // показать картинку, которая есть в // каталоге программы

// щелчокнакнопкеКаталог void fastcall TForml:: ButtonlClick(TObject *Sender)

if (SelectDirectory(" Выберите каталог, в котором" " находятся иллюстрации", " ", aPath)! = О

// пользователь выбрал каталог и щелкнул на ОК aPath = aPath + " \ \"; if ( FirstPicture() ) // вывести иллюстрацию CheckBoxl-> Enabled = true; else Labell-> Caption = " В каталоге " + aPath + " нет jpg-иллюстраций." ;

// вывести первую картинку и найти следующую bool fastcall TForml:: FirstPicture() { Imagel-> Visible •- false; // скрыть компонент Imagel Button2-> Enabled = false; // кнопка Дальше недоступна CheckBoxl-> Enabled = false; CheckBoxl-> Checked = false; Labell-> Caption = if (FindFirst(aPath+ " *.jpg", faAnyFile, aSearchRec) == 0)

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

Графика 103

Imagel-> Visible = true; Labell-> Caption = aPath + aSearchRec.Name; if ( FindNext(aSearchRec) == 0 ) // найтислед. ил.

// иллюстрацияесть Button2-> Enabled = true; // теперькнопкаДальше // доступна CheckBoxl-> Enabled = true; return true;

}

} return false;

// вывеститекущуюинайтиследующуюкартинку bool fastcall TForml:: NextPicture()

Imagel-> Picture-> LoadFromFile(aPath+aSearchRec.Name); Labell-> Caption = aPath + aSearchRec.Name; if ( FindNext(aSearchRec)! = 0 ) // найтислед. // иллюстрацию

// иллюстрацийбольшенет Button2-> Enabled = false; // теперькнопкаДальше // недоступна CheekBoxl-> Enabled = false; return false;

return true;

// щелчокнакнопкеДальше void fastcall TForml:: Button2Click(TObject *Sender)

104 Часть 1. Примеры и задачи

NextPicture();

// щелчок на переключателе " непрерывно" void fastcall TForml:: CheckBoxlClick(TObject *Sender)

{

if ( CheckBoxl-> Checked) Timerl-> Enabled = true; // слайд-шоу else Timerl-> Enabled = false; // покадрам

// Сигналоттаймера - вывестиследующуюиллюстрацию void fastcall TForml:: TimerlTimer(TObject *Sender) { if (! NextPicture()) Timerl-> Enabled = false;

 

 

Задача 28.Часы

В окне программы Часы (рис. 35) находится изображение идущих часов, которые показывают текущее время.

Рис 35

Вывод: Мы научились создавать часы которые соответствуют времени на компьютере путём написания кода и использования компонента Timer.

Листинг

#include < vcl.h>

#pragma hdrstop

#include " DateUtils.hpp"

#include " math.h"

#define R 75

 

#include " Unit1.h"

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

#pragma package(smart_init)

#pragma resource " *.dfm"

TForm1 *Form1;

int x0, y0;

int ahr, amin, asec;

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

__fastcall TForm1:: TForm1(TComponent* Owner)

: TForm(Owner)

{

TDateTime t;

ClientHeight = (R + 30)*2;

ClientWidth = (R + 30)*2;

x0 = R + 30;

y0 = R + 30;

t = Now();

ahr = 90 - HourOf(t)*30-(MinuteOf(Today() ) / 12) *6;

amin = 90 - MinuteOf(t)*6;

asec = 90 - SecondOf( Today() )*6;

Timer1-> Interval = 1000;

Timer1-> Enabled = true;

}

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

__fastcall TForm1:: Vector (int x0, int y0, int a, int l)

{

#define TORAD 0.0174532

int x, y;

Canvas-> MoveTo(x0, y0);

x = x0 + l * cos(a*TORAD);

y = y0 - l * sin(a*TORAD);

Canvas-> LineTo(x, y);

}

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

void __fastcall TForm1:: FormPaint(TObject *Sender)

{

int x, y;

int a;

int h;

TBrushStyle bs;

TColor pc;

int pw;

bs = Canvas-> Brush-> Style;

pc = Canvas-> Pen-> Color;

pw = Canvas-> Pen-> Width;

Canvas-> Brush-> Style = bsClear;

Canvas-> Pen-> Width = 1;

Canvas-> Pen-> Color = clBlack;

a = 0;

h = 3;

while ( a < 360 )

{

x = x0 + R * cos(a * TORAD);

y = y0 - R * sin(a * TORAD);

Form1-> Canvas-> MoveTo(x, y);

if ( (a % 30) == 0 )

{

Canvas-> Ellipse(x-2, y-2, x+3, y+3);

x = x0 + (R+15) * cos(a * TORAD);

y = x0 - (R+15) * sin(a * TORAD);

Canvas-> TextOut(x-5, y-7, IntToStr(h));

h--;

if ( h == 0 ) h = 12;

}

else

Canvas-> Ellipse (x-1, y-1, x+1, y+1);

a = a + 6;

}

Canvas-> Brush-> Style = bs;

Canvas-> Pen-> Width = pw;

Canvas-> Pen-> Color = pc;

 

TDateTime t;

Canvas-> Pen-> Color = clBtnFace;

Canvas-> Pen-> Width = 3;

Vector(x0, y0, ahr, R-20);

Vector(x0, y0, amin, R-15);

Vector(x0, y0, asec, R-7);

t = Now();

ahr = 90 - HourOf(t)*30-(MinuteOf(t)% 12)*6;

amin = 90 - MinuteOf(t)*6;

asec = 90 - SecondOf(t)*6;

Canvas-> Pen-> Width = 2;

Canvas-> Pen-> Color = clBlack;

Vector(x0, y0, ahr, R-20);

Canvas-> Pen-> Width = 3;

Canvas-> Pen-> Color = clBlack;

Vector(x0, y0, amin, R-15);

Canvas-> Pen-> Width = 1;

Canvas-> Pen-> Color = clYellow;

Vector(x0, y0, asec, R-7);

}

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

void __fastcall TForm1:: Timer1Timer(TObject *Sender)

{

TDateTime t;

Canvas-> Pen-> Color = clBtnFace;

Canvas-> Pen-> Width = 3;

Vector(x0, y0, ahr, R-20);

Vector(x0, y0, amin, R-15);

Vector(x0, y0, asec, R-7);

t = Now();

ahr = 90 - HourOf(t)*30-(MinuteOf(t)% 12)*6;

amin = 90 - MinuteOf(t)*6;

asec = 90 - SecondOf(t)*6;

Canvas-> Pen-> Width = 2;

Canvas-> Pen-> Color = clBlack;

Vector(x0, y0, ahr, R-20);

Canvas-> Pen-> Width = 3;

Canvas-> Pen-> Color = clBlack;

Vector(x0, y0, amin, R-15);

Canvas-> Pen-> Width = 1;

Canvas-> Pen-> Color = clYellow;

Vector(x0, y0, asec, R-7);

}

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

 

 


 

Задача 29. Пинг понг.

Программа Пинг-понг (Рис. 36) демонстрирует, как можно сделать графику интерактивной. В окне программы два объекта: мячик и ракетка, которой при помощи клавиш перемещения
курсора управляет игрок. На форме программы только один
компонент — Timer.

Рис 36

Вывод: В этой задаче мы научились создавать с помощью кода и тоглько одного компонента простую игру.

Листинг

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

#include < vcl.h>

#pragma hdrstop

#include " Unit1.h"

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

#pragma package(smart_init)

#pragma resource " *.dfm"

TForm1 *Form1;

int x, y; // положение мячика

int dx, dy; // приращение координат

int r; // радиус мячика

TColor cBall; // цвет мячика

TColor cBack; // цвет поля

int wp, hp; // размер поля (формы)

// это переменные для управления движешлем ракетки

int rd; // 0 - ракетка не движется; 1 -движется

// влево; 2 - движетсявправо

int rx1, rx2; // координаты X концов ракетки

int ry; // координата Y концовракетки

int rdx; // шаг перемещения ракетки

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

__fastcall TForm1:: TForm1(TComponent* Owner)

: TForm(Owner)

{

r = 5; // радиус мячика

x = r; y = 50; // начальное положение мячика

dx = 1;

dy= 1;

cBall = (TColor)RGB(217, 217, 25); // цветмячика

cBack = (TColor)RGB(33, 94, 33); // цветполя

Form1-> Color = cBack;

wp = Form1-> ClientWidth;

hp = Form1-> ClientHeight;

// управление ракеткой

rd = 0; // ракетка на месте (не движется)

rx1 = 100;

rx2 - 125;

ry = Form1-> ClientHeight - 20; // расстояние до нижней

// границы формы 20пикселей

rdx = 2; // шаг движенияракетки

// настройкатаймера

Timer1-> Interval = 10;

Timer1-> Enabled = true;

}

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

 

void __fastcall TForm1:: FormPaint(TObject *Sender)

{

// нарисоватьракету

Form1-> Canvas-> Pen-> Color = clRed;

Form1-> Canvas-> Rectangle(rx1, ry, rx2, ry+1);

}

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

void __fastcall TForm1:: Timer1Timer(TObject *Sender)

{

// стеретьизображениемяча

Form1-> Canvas-> Pen-> Color = cBack;

Form1-> Canvas-> Ellipse(x, y, x+r, y+r);

// ** вычислить новое положение мяча **

if ( dx > 0 )

{

// мяч движется вправо

if (x + dx + r > wp) dx = -dx;

}

else

// мяч движется влево

if ( x + dx - r < 0 ) dx = -dx;

if ( dy > 0 )

{

// мяч движется вниз

if ((x > = rx1) & & (x < = rx2 -r) & & (y == ry - r - 1) )

// мячик попал в ракетку

dy = - dy;

else

if ( y + dy + r > Form1-> ClientHeight ) dy = -dy;

}

else

{

// мячикдвижетсявверх

if ((x > = rx1) & & (x < = rx2) & & (y > = ry - r) & & (y < =

ry + r) )

{

// мячик отскочил от нижней стенки и попал в ракетку снизу

// чтобы не было дырок в ракетке перерисуем ее.

 

Form1-> Canvas-> Pen-> Color = clRed;

Form1-> Canvas-> Rectangle(rx1, ry, rx2, ry+1);

}

if ( y + dy - r < 0 ) dy = -dy;

}

x += dx;

y +=dy;

// нарисовать мяч в новой точке

Form1-> Canvas-> Pen-> Color = cBall;

Form1-> Canvas-> Ellipse(x, y, x+r, y+r);

// *** ракетка ***

if ( rd! = 0)

{

// игрок нажал и удерживает стрелку вправо или влево

// (см. FormKeyDown )

if ( rd == 1 )

{

//вправо

if ( rx2 < wp )

{

// стеретьчастьслева

Form1-> Canvas-> Pen-> Color = cBack;

Form1-> Canvas-> Rectangle(rx1, ry, rx1 + rdx,

ry + 1 );

// дорисоватьчастьсправа

Form1-> Canvas-> Pen-> Color = clRed;

Form1-> Canvas-> Rectangle (rx2, ry, rx2 + rdx,

ry + 1);

rx1 += rdx;

rx2 += rdx;

}

}

else

// влево

if (rx1 > 1 )

{ // стереть часть справа

Form1-> Canvas-> Pen-> Color = cBack;

Form1-> Canvas-> Rectangle (rx2, ry, rx2 - rdx,

ry+1);

// дорисоватьслева

Form1-> Canvas-> Pen-> Color = clRed;

Form1-> Canvas-> Rectangle(rx1 - rdx, ry, rx1 +

rdx, ry+1);

rx1 -= rdx;

rx2 -= rdx;

}}}

 

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

void __fastcall TForm1:: FormKeyDown(TObject *Sender, WORD & Key,

TShiftState Shift)

{

if (rd! = 0 )

// пользователь удерживает клавищу ракетка движется

return;

switch ( Key )

{

case VK_LEFT: // шагвправо

rd = 2; break;

case VK_RIGHT: //? шагвлево

rd = 1; break;

}

}

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

void __fastcall TForm1:: FormKeyUp(TObject *Sender, WORD & Key,

TShiftState Shift)

{

rd = 0;

}

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


 

Задача 30. Полет в облаках

Программа Полет в облаках (Рис. 37) демонстрирует принципы мультипликации (движение объекта на фоне картинки)

Рис 37

Вывод: В этом задании мы научились создавать анимацию движения самолёта с помощью кода и компонента Timer.

Листинг

#include < vcl.h>

#pragma hdrstop

 

#include " Unit1.h"

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

#pragma package(smart_init)

#pragma resource " *.dfm"

TForm1 *Form1;

Graphics:: TBitmap *back;

Graphics:: TBitmap *sprite;

Graphics:: TBitmap *kadr;

int x, y;

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

__fastcall TForm1:: TForm1(TComponent* Owner)

: TForm(Owner)

{

back = new Graphics:: TBitmap();

back-> LoadFromFile(" C: \\Полет в облаках\\123.bmp" );

// установить размер клиентской (рабочей) области формы

// в соответствии с размером фонового рисунка

 

ClientWidth = back-> Width;

ClientHeight = back-> Height;

// загрузитькартинку

sprite = new Graphics:: TBitmap();

sprite-> LoadFromFile(" imgpreview.bmp" );

sprite-> Transparent = true;

// сформироватькадр

kadr = new Graphics:: TBitmap();

kadr-> LoadFromFile(" imgpreview.bmp" );

// исходное положение самолета

x = -40; // чтоб самолет " вылетал" из-за левой границы окна

y = 20;

Timer1-> Interval = 10;

Timer1-> Enabled = true;

}

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

void __fastcall TForm1:: Timer1Timer(TObject *Sender)

{

TRect badRect; // положение и размер области фона,

// которую надо восстановить

TRect frameRect;

badRect = Rect(x, y, x+sprite-> Width, y+sprite-> Height);

frameRect = Rect(0, 0, kadr-> Width, kadr-> Height);

#ifdef ONCANVAS

 

Canvas-> CopyRect(badRect, back-> Canvas, badRect);

// вычислим новые координаты спрайта

x +=2;

if (x > ClientWidth)

{

// самолет улетел за правую границу формы

// изменим высоту и скорость полета

x = -20;

y = random(ClientHeight - 30); // высота полета

// скорость полета определяется периодом возникновения

//события OnTimer, который, в свою очередь, зависит

// от значения свойства Interval

Timer1-> Interval = random(20) + 10; // скорость

// " полета" от 10 до 29

}

Canvas-> Draw(x, y, sprite);

#else

// изображение формируем на рабочей поверхности,

// затем выводим на поверхность формы

// сформировать очередной кадр

// скопироватьфрагментфона

kadr-> Canvas-> CopyRect(frameRect, back-> Canvas, badRect);

// нарисоватьобъект

kadr-> Canvas-> Draw(0, 0, sprite);

 

Form1-> Canvas-> Draw(x, y, kadr);

// вычислим новые координаты спрайта

x += 1;

if (x > ClientWidth)

// самолет улетел за правую границу формы

// изменим высоту и скорость полета

x = -20;

y = random(ClientHeight - 30); // высота полета

// скорость полета определяется периодом возникновения

// события OnTimer, который, в свою очередь, зависит

// от значения свойства Interval

Timer1-> Interval = random(20) + 10; // скорость

// " полета" от 10 до 29

#endif

}

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

void __fastcall TForm1:: FormPaint(TObject *Sender)

{

Canvas-> Draw(0, 0, back);

}


 

Задача 31.Баннер

Программа Бегущая строка (Рис. 38) демонстрирует использование битового образа для вывода баннера в стиле бегущей строки. Битовый образ (бегущая строка) загружается из ресурса программы. Баннер " выплывает" из-за правой границы формы. В момент времени, когда баннер достигает центра окна, движение приостанавливается на несколько секунд, а затем — возобновляется.

Рис 38

Вывод: В этом задании мы создали бегущую строку.

Листинг

#include < vcl.h>

#pragma hdrstop

 

#include " Unit1.h"

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

#pragma package(smart_init)

#pragma resource " *.dfm"

TForm1 *Form1;

Graphics:: TBitmap *banner;

int x, y;

int pause;

int xp;

TColor bc;

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

__fastcall TForm1:: TForm1(TComponent* Owner)

: TForm(Owner)

{

banner = new Graphics:: TBitmap();

 

banner-> LoadFromResourceID((int)HInstance, 101);

bc = banner-> Canvas-> Pixels[0][0];

x = Form1-> ClientWidth;

y = 0;

 

xp = (Form1-> ClientWidth - banner-> Width) / 2;

if (xp < 0 ) xp = 0;

}

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

 

 

void __fastcall TForm1:: Timer1Timer(TObject *Sender)

{

if ( pause > 0 )

{pause--;

return;

}

Form1-> Canvas-> Draw(x, y, banner);

if ( -- x == xp)

{

pause = 100;

}

if ( x < - banner-> Width)

x = Form1-> ClientWidth;

}

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

void __fastcall TForm1:: FormPaint(TObject *Sender)

{

TColor b, p;

b = Canvas-> Brush-> Color; // сохранитьтекущийцветкисти

p = Canvas-> Pen-> Color; // сохранить текущийцвет

 

Canvas-> Brush-> Color = bc;

Canvas-> Pen-> Color = bc;

Canvas-> Rectangle(0, 0, ClientWidth, banner-> Height);

Canvas-> Brush-> Color = b;

Canvas-> Pen-> Color = p;

}

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

void __fastcall TForm1:: FormResize(TObject *Sender)

{

xp = (Form1-> ClientWidth - banner-> Width) / 2;

if (xp < 0 ) xp = 0;

}


 

Задача 32. Фоновый рисунок

Программа Фоновый рисунок (Рис. 39) демонстрирует, как можно получить фоновый рисунок путем многократного вывода битового образа на поверхность формы. Битовый образ загружается из файла, но может быть загружен и из ресурса.

 

 

Рис 39

Вывод: В этом задании мы научились создавать изображение путём многократного вывода битового образа на поверхность формы.

Листинг

// обработкасобытия OnCreate

void __fastcall TForml:: FormCreate(TObject *Sender)

{

back = new Graphics:: TBitmap(); // создать объект — битовый образ

// загрузить картинку

try // в процессе загрузки картинки возможны ошибки

{

Forml-> back-> LoadFromFile(" Legal.bmp" );

}

catch (EFOpenError & e)

{

 

return;

}

}

// формируетфоновыйрисунок

void __fastcall TForml:: Background()

{

int x=0, y=0; // координатылевоговерхнегоуглабитовогообраза

if ( back-> Empty) // битовый образ не был загружен

return;

do

{

do

{

Canvas-> Draw(x, y, back); x += back-> Width;

}

while (x < ClientWidth); x = 0;

у4= back-> Height;

}

while (y < ClientHeight);

}

// обработкасобытия OnPaint

void __fastcall TForml:: FormPaint(TObject *Sender)

{

Background(); // обновить фоновый рисунок

}

 

 


 

Задача 33. WAV

Программа Звуки Windows (Рис. 40) позволяет прослушать звуковые файлы (форматов WAV, RMI и MID), которые находятся в каталоге Windows\Media.

 

Рис 40

 

Вывод: В этой программе мы научились работать с компонентом MediaPleer

и воспоизводить в проигрывателе форматы WAV, RMI и MID.

Листинг

void fastcall TForml:: FormCreate(TObject *Sender) { char *wd; // каталог Windows

wd = (char*)AllocMem(MAX_PATH); GetWindowsDirectory(wd, MAX_PATH); SoundPath = wd;

// звуковыефайлынаходятсявподкаталоге Media SoundPath = SoundPath + " WMediaW" ;

// сформируем список звуковых файлов

126 Часть 1. Примерыизадачи

TSearchRec sr; if (FindFirst( SoundPath + " *.wav", faAnyFile, sr) == 0 )

// найденфайлсрасширением WAV ListBoxl-> Items-> Add(sr.Name); // добавимимяфайла // всписок // ещеестьфайлысрасширением WAV? while (FindNext(sr) == 0 ) ListBoxl-> Items-> Add(sr.Name);

if (FindFirstf SoundPath + " *.mid", faAnyFile, sr) == 0 ) { // найденфайлсрасширением MID ListBoxl-> Items-> Add(sr.Name); // добавимимяфайла // всписок // ещеестьфайлысрасширением MID? while (FindNext(sr) == 0 ) ListBoxl-> Items-> Add(sr.Name);

if (FindFirst( SoundPath + " *.rmi", faAnyFile, sr) == 0 { // найденфайлсрасширением RMI ListBoxl-> Items-> Add(sr.Name); // добавимимяфайла // всписок // ещеестьфайлысрасширением RMI? while (FindNext(sr) == 0 ) ListBoxl-> Items-> Add(sr.Name);

// воспроизвести первый файл if ( ListBoxl-> Items-> Count! = 0)

Мультимедиа 727

{

Label2-> Caption = ListBoxl-> Items-> Strings[1]; ListBoxl-> ItemIndex = 0;

MediaPlayerl-> FileName = SoundPath + ListBoxl-> Items-> Strings[1]; MediaPlayerl-> Qpen(); MediaPlayerl-> Play();

// щелчокнаэлементесписка void fastcall TForml:: ListBoxlClick(TObject *Sender)

{

if ( (CheckBoxl-> Checked) & & ( MediaPlayerl-> Mode == mpPlaying ) ) return; Label2-> Caption = ListBoxl-> Items-> Strings[ListBoxl-> ItemIndex]; MediaPlayerl-> FileName = SoundPath + Label2-> Caption; MediaPlayerl-> Open(); if (! CheckBoxl-> Checked) • MediaPlayerl-> Notify = false; MediaPlayerl-> Play();

/* событие Notify возникаетвмоментзавершенияоспроизведениязвуковогофайла, еслипередактивизациейметода Play значениесвойства Notify равно true */ void fastcall TForml:: MediaPlayerlNotify(TObject *Sender)

{

if ( ListBoxl-> ItemIndex < ListBoxl-> Items-> Count )

{

ListBoxl-> ItemIndex = ListBoxl-> ltemlndex + 1;

128 Часть 1. Примерыизадачи

Label2-> Caption = ListBoxl-> Items-> Strings[ListBoxl-> ItemIndex]; MediaPlayerl-> FileName = SoundPath + Label2-> Caption; MediaPlayerl-> Open()j if (! CheckBoxl-> Checked) MediaPlayerl-> Notify = false; MediaPlayerl-> Play();

 

 

Задача 34. MP3 Player

ПрограммаМРЗPlayer (Рис. 41)позволяетпрослушатьмузыкальныефайлыформатаМРЗ.

Рис 41

В этой программе мы научились работать с компонентами SpeedButton, • TrackBart.

// конструкторформы fastcall TForml:: TForml(TComponent* Owner): TForm(Owner)

/* Создатькомпонент MediaPlayer. Объявление MediaPlayerl находитсявобъявленииформы (см. mp3main.h), тамженаходитсяссылкана MPlayer.hpp (директива § include " MPlayer.hpp" ). */ MediaPlayerl • new TMediaPlayer(Forml-> Handle);

#include " FileCtrl.hpp" // длядоступак TSearchRec

AnsiString SoundPath; // путькМРЗ-файлам int min, sec; // времявоспроизведения (минуты, секунды)

int mode =0; // 0 - режим " Стоп" // 1 - режим " Воспроизведение"

/* Процедуре vaweOutSetVolume в качестве параметра передается двойное слово, старший байт которого определяет громкость левого канала, младший - правого. Определив таким образом тип TVolume, имеется возможность независимой регулировки громкости каждого канала. Максимальной громкости канала соответствует значение OxFFFF. */ union TVolume{ unsigned long Volume; struct

Word Left;

Мультимедиа

Word Right;

}; } volume;

// началоработыпрограммы void fastcall TForml:: FormCreate(TObject *Sender)

{

PlayList(" " );

// установитьдвижокрегуляторагромкостивсоответствии // стекущемуровнем, установленнымвсистеме waveOutGetVolume(0, & volume.Volume); TrackBarl-> Position = - volume.Left;

ListBoxl-> Color = (TColor)RGB(56, 176, 222);

// формируетсписокМРЗ-файлов, находящихсявуказанном // каталоге void __fastcall TForml:: PlayList(AnsiString path)

{

/* структура SearchRec содержит информацию о файле, удовлетворяющем условию поиска */ TSearchRec SearchRec;

ListBoxl-> Clear(); // сформировать список МРЗ-файлов if ( FindFirst(path + " *.mp3", faAnyFile, SearchRec)! = 0 )

{

// ввыбранномкаталогенетМРЗ-файлов SpeedButton2-> Enabled = false; SpeedButton3-> Glyph-> LoadFrornResourceID( (int)HInstance, 103); SpeedButton4-> Enabled = false;

132 Часть 1. Примеры и задачи

Labell-> Caption return,

// в каталоге есть файл с расширением трЗ // добавим имя этого файла в список ListBoxl-> Items-> Add(SearchRec.Name); // пока в каталоге есть другие файлы с расширением wav while (FindNext(SearchRec) •• 0) ListBoxl-> Iterns-> Add(SearchRec.Name);

ListBoxl-> ItemIndex = 0; Labell-> Caption = ListBoxl-> Items-> Strings [ListBoxl-> ItemIndex]; SpeedButton2-> Enabled = false; if (ListBoxl-> Coxmt == 1) SpeedButton4-> Enabled = false; else SpeedButton4-> Enabled = true; SpeedButton3-> Glyph-> LoadFromResourcelDf(int)HInstance, 101);

// активизироватьвоспроизведениеМРЗ-файла, имякоторого // выделеновсписке ListBox void fastcall TForml:: Play() { Labell-> Caption = ListBoxl-> Items-> Strings [ListBoxl-> ItemIndex]; MediaPlayerl-> FileName = SoundPath + ListBoxl-> Items-> Strings [ListBoxl-> ItemIndex],

MediaPlayerl-> Open(); MediaPlayerl-> Play();

Мультимедиа 133

min = 0; sec = О; Timerl-> Enabled = true;

// остановитьвоспроизведение void fastcall TForml:: Stop() { MediaPlayerl-> Stop(); Timerl-> Enabled = false; Label2-> Caption = " 0"; Label4-> Caption • " 00";

// щелчокнакнопке Play/Stop // ( картинкидлякнопоклучшезагружатьизресурса ) void fastcall TForml:: SpeedButton3Click(TObject *Sender) { if ( mode == 1 )

{

SpeedButton3-> Glyph-> LoadFromResourcelD((int)Hlnstance, 101) SpeedButton3-> Hint = " Воспроизведение"; StopO; mode = 0;

} else { SpeedButton3-> Glyph-> LoadFromResourcelD((int)HInstance, 102); SpeedButton3-> Hint = " Стоп"; Play(); mode = 1;

134 Часть 1. Примерыизадачи

// сигналоттаймера void fastcall TForml:: TimerlTimer(TObject *Sender) { // индикациявременивоспроизведения if ( sec < 59 ) { sec++; if ( sec < 10) Label4-> Caption = " 0" + IntToStr(sec); else Label4-> Caption = IntToStr(sec); } else

sec = 0; min++; Label2-> Caption = IntToStr(min) Label4-> Caption = " 00";

// завершено воспроизведение текущего файла? if ( MediaPlayerl-> Position < MediaPlayerl~> Length ) // воспроизведение текущей композиции не завершено return;

// воспроизведете текущей композиции завершено Stop();

if ( ListBoxl-> ItemIndex < ListBoxl-> Count - 1 )

ListBoxl-> ItemIndex += 1; PlayO; // активизировать воспроизведение следующего // МРЗ-файла

Мультимедиа 135

if ( ListBoxl-> ItemIndex == ListBoxl-> Count - 1 ) SpeedButton4-> Enabled = false;

} else { // законченовоспроизведениепоследнегоМРЗ-файла SpeedBut ton3-> Glyph-> LoadFromResourcelD((int)HInstance, 101); SpeedButton3-> Hint = " Воспроизведение"; mode = 0;

// щелчокнакнопке " Кследующемуфайлу" void fastcall TForml:: SpeedButton4click(TObject *Sender) { if ( mode == 1 ) Stop(); // остановитьвоспроизведениетекущей // композиции ListBoxl-> ItemIndex += 1; Labell-> Caption = ListBoxl-> Items-> Strings [ListBoxl-> ItemIndex];

// проверитьи, еслинадо, изменитьсостояние // кнопокпереходакследующемуипредыдущемуфайлу if ( ListBoxl-> ItemIndex == ListBoxl-> Count - 1) SpeedButton4-> Enabled = false,

if (! SpeedButton2-> Enabled ) SpeedButton2-> Enabled = true;

if ( mode == 1) PlayO; // активизировать воспроизведение следующей // композиции

136 Часть 1. Примеры и задачи

// щелчок на кнопке " К предыдущему файлу" void fastcall TForml:: SpeedButton2Click(TObject *Sender) { if ( mode == 1 ) Stop(); // остановить воспроизведение текущей // композиции ListBoxl-> ItemIndex -= 1; Labell-> Caption = ListBoxl-> Iteitis-> Strings [ListBoxl-> ItemIndex];

// проверить и, если надо, изменить состояние // кнопок перехода к следующему и предыдущему файлу if (! SpeedButton4-> Enabled ) SpeedButton4-> Enabled = true;

if ( ListBoxl-> ItemIndex == 0 ) SpeedButton2-> Enabled = false;

if (mode == 1 ) PlayO; // активизировать воспроизведение предыдущей // композиции

iinclude " FileCtrl.hpp"

// щелчок на кнопке Eject - выбор каталога void fastcall TForml:: SpeedButtonlClick(TObject *Sender)

AnsiString dir; if ( SelectDirectory(" Выберитекаталог", " ", dir) )

if ( mode ==1) // режим " Воспроизведение"

Stop ();

Мультимедиа 737

SpeedButton3-> Glyph-> LoadFroirtResourcelD((int)HInstance, 101); SpeedButton3-> Hint = " Воспроизведение"; Stop(); mode = 0;

} SoundPath = dir + " \\"; PlayList(SoundPath);

// щелчокнаименифайла (композиции) void fastcall TForml:: ListBoxlClick(TObject *Sender) { if ( MediaPlayerl-> Mode ==2) // плеерврежимевоспроизведения { Stop (), - // остановитьвоспроизведениетекущейкомпозиции Play(); // активизироватьвоспроизведениевыбраннойкомпозиции

// изменить, еслинадо, состояниекнопок // перекодакпредыдущейиследующейкомпозиции if (ListBoxl-> ItemIndex == 0 ) SpeedButton2-> Enabled = false; else SpeedButton2-> Enabled = true;

if (ListBoxl-> ItemIndex == ListBoxl-> Count -1 ) SpeedButton4-> Enabled = false; else SpeedButton4-> Enabled = true;

•include " mmsystem.hpp"

138 Часть 1. Примеры и задачи

// пользователь изменил положение регулятора громкости void fastcall TForml:: TrackBarlChange(TObject *Sender) { volume.Left = - TrackBarl-> Position, volume.Right = - TrackBarl-> Position; waveOutSetVolume(0, volume.Volume);


 


Поделиться:



Популярное:

Последнее изменение этой страницы: 2017-03-08; Просмотров: 634; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.266 с.)
Главная | Случайная страница | Обратная связь