C++ Builder - вопросы программирования

       

обработка события Create void __fastcall



Листинг 4.4.

Видеоплеер
// обработка события Create void __fastcall TForml::FormCreate(TObject *Sender) { MediaPlayerl->
Display = Forml; // отображение ролика на поверхности // формы } // возвращает размер кадра AVI-файла void __fastcall GetFrameSize(AnsiString f, int *w, int *h) { // в заголовке AVI-файла есть информация о размере кадра struct { char RIFF[4]; // строка RIFF long int nu_l[5]; //не используется char AVIH[4]; // строка AVIH long int nu_2[9]; //не используется long int w; // ширина кадра long int h; // высота кадра } header; TFileStream *fs; // поток (для чтения заголовка файла) /* операторы объявления потока и его создания можно объединить: TFileStream *fs = new TFileStream(f,fmOpenRead);
*/ fs = new TFileStream(f,fmOpenRead}; // открыть поток для чтения fs->
Read(&header, sizeof(header));
// прочитать заголовок файла *w = header.w; *h = header.h; delete fs; } // щелчок на кнопке Eject (выбор видеоклипа) void__fastcall TForral::SpeedButtonlClick(TObject *Sender) { OpenDialogl->
Title = "Выбор клипа"; OpenDialogl->
InitialDir = ""; OpenDialogl->
FileName = "*.avi"; if ( ! OpenDialogl->
Execute()) return; // пользователь нажал кнопку Отмена /* При попытке открыть файл клипа, который уже открыт, возникает ошибка. */ if ( MediaPlayerl->
FileName = OpenDialogl->
FileName) return; /* Пользователь выбрал клип. Зададим размер и положение "экрана", на который будет выведен клип. Для этого надо знать размер кадров клипа. */ int fw, fh; // размер кадра клипа int top,left; // левый верхний угол экрана int sw, sh; // размер экрана (ширина, высота) int mw, mh; // максимально возможный размер экрана // (определяется текущим размером формы) float kw, kh; // коэф-ты масштабирования кадра по ширине и высоте float k; // коэфф-т масштабирования кадра GetFrameSize(OpenDialogl->
FileName,&fw, &fh);
// получить размер кадра / / вычислим максимально возможный размер кадра mw = Forml->
ClientWidth; mh = Forml->
SpeedButtonl->
Top-10; if ( fw < mw) kw = 1; // кадр по ширине меньше размера экрана else kw = (float) mw / fw; if ( fh < mh) kh = 1; // кадр по высоте меньше размера экрана else kh = (float) mh / fh; // масштабирование должно быть пропорциональным if ( kw < kh) k = kw; else k = kh; // здесь масштаб определен sw = fw * k; // ширина экрана sh = fh * k; // высота экрана left = (Forml->
ClientWidth - sw) / 2; top = (SpeedButtonl-XTop - sh) / 2; MediaPlayerl->
FileName = OpenDialogl->
FileName; MediaPlayerl->
Open();


MediaPlayerl->
DisplayRect = Rect(left,top,sw,sh);
SpeedButton2->
Enabled = True; // кнопка Play теперь доступна /* если размер кадра выбранного клипа меньше размера кадра предыдущего клипа, то экран (область формы) надо очистить */

Forml->
Canvas->
FillRect(Rect(0,0,ClientWidth,SpeedButtonl->
Top));
// активизируем процесс воспроизведения MediaPlayerl->
Play() ; SpeedButton2->
Down = True; SpeedButton2->
Hint = "Stop"; SpeedButtonl->
Enabled = False; } // щелчок, на кнопке Play/Stop (воспроизведение/стоп) void _fastcall TForml::SpeedButton2Click(TObject *Sender) {if (SpeedButton2->
Down) { // нажата кнопка Play MediaPlayerl->
Play();
SpeedButton2->
Hint = "Stop"; SpeedButtonl->
Enabled = False; // кнопка Eject недоступна } else { // нажата кнопка Stop MediaPlayerl->
Stop() ; SpeedButton2->
Hint = "Play"; SpeedButtonl->
Enabled = True; // кнопка Eject доступна } } 11 сигнал от плеера void__fastcall TForml::MediaPlayerlNotify(TObject *Sender) { if ( ( MediaPlayerl->
Mode == mpStopped) && ( SpeedButton2->
Down)) { SpeedButton2->
Down = False; // "отжать" кнопку Play SpeedButton2->
Hint = "Play"; SpeedButtonl->
Enabled = True; // сделать доступной кнопку Eject } }
Следует обратить внимание на следующее. В качестве экрана, на котором осуществляется воспроизведение видеороликов, используется поверхность формы. Поэтому установить значение свойства Display компонента MediaPlayer1 во время разработки формы нельзя. Кроме того, размер экрана должен быть равен или пропорционален размеру кадров ролика. Значение свойства Display устанавливает функция Обработки события Create для формы, а размер и положение экрана на форме — функция обработки события click на кнопке Eject (speecffiuttoni). Размер экрана устанавливается максимально возможным и таким, чтобы ролик воспроизводился без искажения (высота и ширина экрана пропорциональны высоте и ширине кадров). Размер кадров ролика возвращает функция GetFrameSize, которая извлекает нужную информацию из заголовка файла.
 


Содержание раздела