Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет мой.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
4.46 Mб
Скачать

Задача 37.Compact Disk Player (версия 2)

Программа CompactDiskPlayer (Рис. 44), позволяет прослушать компакт-диск. Как можно видеть, заголовок и граница окна во время работы программы не отображаются ,тем не менее пользователь может переместить окно программы, установив указатель мыши на изображение индикатора (в поле компонента shapei).

Рис 44

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

Листинг

// нажатие кнопки мыши в поле компонента Shapei void fastcall TForml::ShapelMouseDown(TObject *Sender,

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

TMouseButton Button, TShiftState Shift, int X, int Y)

// запомнить координаты точки, в которой // пользователь нажал кнопку мыши рх = X; РУ = Y;

// нажатая в поле компонента Shapel кнопка мыши отпущена void fastcall TForml::ShapelMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Forml->Left = Forml->Left + X - px; Forml->Top = Forml->Top + Y - py;

// щелчок на кнопке Off (Выключить) void .fastcall TForml::SpeedButton4Click(TObject *Sender) { // завершение работы программы MediaPlayer->Stop(); Forml->Close() ;

Задача 38.VideoPlayer

Программа VideoPlayer (Рис. 45), позволяет просмотреть видеоролик форматов AVI или MPG. Выбор клипа осуществляется в стандартном окне Открыть файл, которое становится доступным в результате щелчка на кнопке Eject (speedButtoni). Кнопка speedButton2 используется как для активизации процесса воспроизведения, так и для его приостановки. Картинки для кнопки загружаются из ресурса программы. Следует обратить внимание на то, что программа определяет размер кадров видеоролика. Это Мультимедиа 151

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

Рис 45

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

Листинг

// эти макросы обеспечивают перевод интервала времени, // выраженного в миллисекундах, в минуты и секунды #define MINUTE(ms) ((ms/1000)/60) #define SECOND(ms) ((ms/1000)%60)

// картинкидлякнопок Graphics::TBitmap *fcmPlay; // Play Graphics::TBitmap *fcmPause; // Pause

fastcall TForml::TForml(TComponent* Owner) : TForm(Owner)

{

kmPlay = new Graphics::TBitmap(); fcmPause = new Graphics::TBitmap();

// загрузитькартинкидлякнопки Play/Stop bmPlay->LoadFromResourceID((int)HInstance,101); bmPause->LoadFromResourceID((int)HInstance,102); // отобразитькартинку SpeedButton2->Glyph->Assign(bmPlay); MediaPlayerl->Display = Forml;

// возвращаетразмеркадра void .fastcall GetFrameSize(AnsiString f, int *w, int *h) { if ( f.Pos(".avi") == 0 ) { // пользовательвыбрал mpg-файл *w = 352; *h = 240; return;

// *** Пользователь выбрал AVI-файл ***

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

// В заголовке AVI-файла есть информация о размере кадра struct { char RIFF[4]; // строка RIFF long int nu_l15]; //не используется char AVIH[4]; // строка AVIH long int nu_2[9]; // не используется long int w; // ширина кадра long int h; // высота кадра } header;

TFileStream *fs; // поток для чтения заголовка файла

/* операторы объявления потока и его создания можно объединить: TFileStream *fs = new TFileStreamff, fmOpenRead); */

fs = new TFileStream(f,fmOpenRead) ;г

fs->Read(&header, sizeof(header));

*w = header.w; *h = header.h; delete fs;

// открыть поток для // чтения // прочитать // заголовок файла

// щелчок на кнопке Eject (выбор видеоклипа) void fastcall TForml::SpeedButtonlClick(TObject *Sender) { int fw, fh; // размер кадра клипа int top,left; // левый верхний угол экрана int sw, sh; /,/ размер экрана (ширина, высота)

int mw, mh; // максимально возможный размер экрана // (определяется текущим размером формы)

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

float kw, kh; // коэф-ты масштабирования кадра // по ширине и высоте float к; // коэффициент масштабирования кадра

OpenDialogl->Title = "Выбор клипа"; OpenDialogl->InitialDir = ""; OpenDialogl->Filter = "Все форматы|*.avi;*.mpg;*.mpegI" "AVI|*.avi|MPG|*.mpg|MGEG|*.mpeg";

if ( ! OpenDialogl->Execute() ) return; // пользователь нажал кнопку Отмена

/* При попытке открыть файл клипа, который уже открыт, возникает ошибка. */

if ( MediaPlayerl->FileName == OpenDialogl->FileName ) return;

/* Пользователь выбрал клип. Зададим размер и положение "экрана", на котором будет выведен клип. Для этого надо, знать размер кадров клипа. */

II получить размер кадра GetFrameSize(OpenDialogl->FileName,&fw, &fh);

// вычислим максимально возможный размер кадра mw = Forml->ClientWidth; mh = Forml->Panell->Top-10;

if ( fw < mw ) kw = 1; // кадр по ширине меньше размера экрана else kw = (float) mw / fw;

if ( fh < mh ) kh = 1; // кадр по высоте меньше размера экрана else kh = (float) mh / fh;

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

// масштабирование должно быть пропорциональным if ( kw < kh ) к = kw; else к = kh;

// здесь масштаб определен sw = fw * к,- // ширина экрана sh = fh * к; // высота экрана

left = (Forml->ClientWidth - sw) / 2; top = (Panell->Top - sh) / 2;

MediaPlayerl->FileName = OpenDialogl->FileName;

MediaPlayerl->Open(); MediaPlayerl->DisplayRect = Rect(left,top,sw,sh); /* еслиразмеркадравыбранногоклипаменьшеразмеракадрапредыдущегоклипа, тоэкран (областьформы) надоочистить */ Forml->Canvas->FillRect(Rect(0,0,ClientWidth,Panell->Top));

SpeedButton2->Enabled = true; // теперькнопка Play // доступна

// вывести информацию о времени воспроизведения MediaPlayerl->TimeFormat = tfMillisec

int ms = MediaPlayerl->Length; AnsiString st = IntToStr(SECOND(ms)); if ( st.Length() == 1) st = "0" + st; st = IntToStr(MINUTE(ms)) + ":" + st; Labell->Caption = st; Label3->Caption = "0:00";

// активизируемпроцессвоспроизведения SpeedButton2->Glyph->Assign(bmPause);

бЗак. 1241

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

SpeedButton2->Hint = "Pause"; SpeedButton2->Tag = 1; SpeedButtonl->Enabled = False; // кнопка Eject недоступна MediaPlayerl->Play(); Timerl->Eriabled = true;

// щелчокнакнопке Play/Stop (воспроизведение/стоп) void fastcall TForml::SpeedButton2Click(TObject *Sender) { if (SpeedButton2->Tag == 0) { // нажатакнопка Play SpeedButton2->Glyph->Assign(bmPause); SpeedButton2->Hint = "Pause"; SpeedButton2->Tag = 1; SpeedButtonl->Enabled = False; // кнопка Eject // недоступна MediaPlayerl->Play(); Timerl->Enabled = true; } else // нажатакнопка Stop { MediaPlayerl->Stop(); SpeedButton2->Glyph->Assign(bmPlay); SpeedButton2->Hint = "Play"; SpeedButton2->Tag = 0; SpeedButtonl->Enabled = True; // кнопка Eject доступна Timerl->Enabled = false;

// сигналотплеера void fastcall TForml::MediaPlayerlNotify(TObject *Sender)

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

{

if ( ( MediaPlayerl->Mode == mpStopped ) && ( SpeedButton2->Tag == 1)) { Timerl->Enabled • false; SpeedButton2->Glyph->Assign(bmPlay); SpeedButton2->Hint = "Play"; SpeedButton2->Tag = 0; SpeedButtonl->Enabled = True; // сделатьдоступной // кнопку Eject

/* Процедура обработки события Pain обеспечивает отображение (перерисовку) первого кадра, при появлении окна, например, после того, как пользователь отодвинет другое окно, перекрывающее окон Video Player. */ void _fastcall TForml::FormPaint(TObject *Sender) { if ( MediaPlayerl->Mode == mpStopped ) { MediaPlayerl->Position = 1; MediaPlayerl->Position = 0;

// завершениеработыпрограммы void fastcall TForml::FormClose(TObject *Sender, TCloseAction &Action) { MediaPlayerl->Close();

void fastcall TForml::TimerlTimer(TObject *Sender)

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

// вывестиинформациюовременивоспроизведения // MediaPlayerl->TimeFormat = tfMilliseconds; int ms = MediaPlayerl->Position; AnsiString st = IntToStr(SECOND(ms)); if ( st.Length() == 1) st = "0" + st; st = IntToStr(MINUTE(ms)) + ":" + st; Label3->Caption = st;