ОРГАНИЗАЦИОННАЯ СТРУКТУРА ПРЕДПРИЯТИЯ. ОСНОВНАЯ ЧАСТЬ





 

СОЦИАЛЬНЫЕ ГАРАНТИИ РАБОТНИКА

 

Главный ресурс любого предприятия — это люди. В Конструкторском бюро приборостроения, повышенное внимание уделяется не только экономической, но и социальной сфере деятельности.

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

Система социальной поддержки включает целый ряд дополнительных целевых выплат работникам предприятия.

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

Коллективным договором предусмотрено ежегодное повышение должностных окладов работников. На предприятии действует «Положение о молодых специалистах», на основании которого им устанавливается надбавка.

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

Одной из важнейших задач социальной политики предприятия является забота о здоровье его работников. Медицинская помощь и лечение сотрудников КБП осуществляется поликлиникой, находящейся на территории предприятия, которая обеспечена современным медицинским и диагностическим оборудованием, лекарственными средствами.

3а счет средств добровольного медицинского страхования осуществляется лечение сотрудников предприятия в специализированных клиниках.

Доставка работников предприятия к месту работы и обратно осуществляется на арендуемых автобусах.

 


 

ОСНОВНАЯ ЧАСТЬ

О работе

Вы, конечно же, знаете, что такое мультимедиа. Современные возможности мультимедиа бук­вально потрясают воображение. В то же вре­мя создание современного мультимедийного приложения требует непосредственного вза­имодействия со вспомогательными прикладными библиотеками и операционной системой, а иногда и программирования на уровне ассемблера. Все это возможно в Borland C++ Builder.
4.2 Воспроизведение звука

 

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

Первый метод использует генерацию данных в самой программе и передачу их звуковой подсистеме компьютера.

Второй метод связан с воспроизведением звука, данные о котором сохранены в специальном файле.

Существует множество форматов звуковых файлов, с которыми вы наверняка уже сталкивались. Самым простым из этих форматов является волновой формат. В файлах этого формата записано цифровое представление о волновой форме электрического сигнала, соответствующего каждому звуку, полученное с помощью специального устройства — аналого-цифрового преобразователя. Файлы этого формата отличаются большими объемами.

Например, файл, содержащий аудиозапись с качеством компакт-диска продолжительностью в одну минуту, займет на жестком диске около 10 Мбайт. Описанные файлы имеют обычно расширение wav.

Другим часто применяемым типом файлов-носителей являются файлы цифрового­ интерфейса музыкальных инструментов (MIDI). Эти файлы, как правило, имеют рас­ширение mid или midi. В MIDI-файлах информация о звуке хранится в виде по­следовательности специальных команд, предназначенных для MIDI-устройств (MI­DI-синтезаторов). Эти команды передают MIDI-устройствам данные о том, на ка­ких инструментах исполняются определенные ноты и как долго они звучат. Эти файлы можно сравнить с нотной записью музыки.

Главными преимуществами MIDI являются высокая компактность файлов (особенно по сравнению с волновым форматом), а также возможность редактирования­ музыки. Недостатком MIDI-файлов является то, что в них можно хранить только те­ звуки, которые может воспроизвести MIDI-синтезатор. В частности, в MIDI-фай­лы нельзя записывать голос.

Вы, конечно, знаете о существовании и других форматов аудиофайлов, например очень популярного формата MP3. Мы можем воспроизводить файлы этих форматов, используя компонент TMediaPlayer (который, в свою очередь, использует медиапроигрыватель Windows).


Функция MessegeBeep

Функция Windows API MessageBeep является одной из простейших функций вос­про­изведения звука. Эта функция предназначена для воспроизведения «стандарт­ных звуков Windows», оповещающих пользователя о тех или иных событиях, про­ис­ходящих в системе. В заголовочном файле windows.h эта функция определена следующим образом:

bool MessageBeep(int uType);

Параметр uType указывает, какой именно из стандартных звуков Windows следует­ вос­произвести. Значения, которые может принимать этот параметр, перечислены в табл. 13.1.

Таблица 13.1. Константы параметра uType

Константа Описание
MB_ICONASTERISK Звук, сопровождающий диалоговое окно с примечанием
MB_ICONEXCLAMATION Звук «восклицание»
MB_ICONHAND Звук, информирующий об ошибке
MB_ICONQUESTION Звук, связанный с запросом
MB_OK Звук по умолчанию

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

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

То, какие именно звуки соответствуют перечисленным выше константам, зависит от настроек вашей системы. Мы напишем простое приложение, которое позволит нам прослушать все стандартные звуки Windows.

Создайте новое графическое приложение и разместите в его форме компоненты TComboBox и TButton. Свойству Style компонента CombpBox1 присвойте значение csDropDownList, а свойству Caption компонента Button1 — строку"Воспроизвести".

Создайте обработчик события OnCreate объекта Form1 (листинг 13.1).

Листинг 13.1.

Обработчик события OnCreate объекта Form1

void __fastcall TForm1::FormCreate(TObject *Sender)

{

ComboBox1->Items->Add("MB_ICONASTERISK");

ComboBox1->Items->Add("MB_ICONEXCLAMATION");

ComboBox1->Items->Add("MB_ICONHAND");

ComboBox1->Items->Add("MB_ICONQUESTION");

ComboBox1->Items->Add("MB_OK");

ComboBox1->ItemIndex = 4;

}

Этот обработчик заполняет компонент ComboBox1 перечнем констант стандартных звуков и делает звук MB_OK выбранным по умолчанию.

Теперь создайте обработчик события OnClick для компонента Button1 (листинг 13.2).

Листинг 13.2. Обработчик события OnClick компонента Button1

void __fastcall TForm1::Button1Click(TObject *Sender)

{

switch (ComboBox1->ItemIndex)

{

case 0: MessageBeep(MB_ICONASTERISK);

break;

case 1: MessageBeep(MB_ICONEXCLAMATION);

break;

case 2: MessageBeep(MB_ICONHAND);

break;

case 3: MessageBeep(MB_ICONQUESTION);

break;

case 4: MessageBeep(MB_OK);

break;

}

}

Наше приложение готово. Запустите его, выберите в раскрывающемся списке один из стандартных звуков и щелкните на кнопке Воспроизвести.

 

Функция PlaySound

Возможности функции MessageBeep весьма полезны, но, мягко говоря, ограничены.­ В этом разделе мы рассмотрим функцию PlaySound, которая позволяет воспроизво­­дить не только звуки событий Windows, но и любые волновые файлы. Это фу­н­к­ция­ Windows API, описанная в заголовочном файле mmsystem.h (этот файл следу­ет­­ включить с помощью директивы #include в файл программы, использующий эту­­ функцию):

bool PlaySound(IN LPCSTR pszSound, IN HMODULE hmod, IN DWORD fdwSound);

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

Параметр hmod используется, если звук берется из ресурса приложения. Мы не будем пользоваться звуками из ресурсов, поэтому значение этого параметра всегда можно задавать равным NULL.

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

Таблица 13.2. Некоторые флаги параметра fdwSound

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

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

Обращаться с функцией PlaySound очень просто. Например, чтобы воспроизвести wav-файл, хранящийся на диске, достаточно вызвать функцию:

PlaySound("tada.wav", NULL, SND_ASYNC);

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

Вот пример воспроизведения звука, хранящегося в реестре Windows:

PlaySound ("SystemStart", NULL, SND_SYNC|SND_ALIAS);

Для того чтобы этот вызов сработал, указанный раздел должен существовать ­в ре­естре.

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

PlaySound(NULL, NULL, SND_PURGE);


4.5 Использование компонента TMediaPlayer
для воспроизведения звука

 

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

Разместите в форме нового приложения компонент TMediaPlayer (он находится на вкладке System (Системные) палитры компонентов). Вы увидите ряд разноцветных кнопок, напоминающих кнопки аудиоплеера. Вы можете управлять воспроизведением звука с помощью этих кнопок, а можете организовать такое управление самостоятельно.

Мы напишем приложение, в котором будем управлять воспроизведением зву­ка ­со­б­ственными средствами. Прежде всего, сделаем компонент TmediaPlayer ­не­ви­димым, присвоив значение false его свойству visible. То, что компонентTMediaPlayer невидим, никак не отразится на его возможностях в плане воспроизведения звука.

Добавьте в форму приложения компонент TOpenDialog и два компонента TButton. Свойству Caption объекта Button1 присвойте строку "Воспроизвести", свойству Caption объекта Button2 — строку "Остановить". Эти кнопки позволят соответственно запускать на воспроизведение и останавливать звуковой файл.

Событию OnClick компонента Button1 назначьте обработчик, приведенный в лис­тин­ге­ 13.3.

Листинг 13.3. Запуск файла на воспроизведение

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if (OpenDialog1->Execute())

{

MediaPlayer1->FileName = OpenDialog1->FileName;

MediaPlayer1->Open();

MediaPlayer1->Play();

}

}

Прежде всего, мы открываем диалоговое окно для выбора звукового файла. Компонент TMediaPlayer способен воспроизводить файлы всех форматов, которые поддерживает Windows Media Player. Метод Open открывает виртуальное устройство Windows, тип которого зависит от типа выбранного файла, для воспроизведения. Метод Play запускает сам процесс воспроизведения.

 

Рассмотрим теперь обработчик OnClick для кнопки Button2 (листинг 13.4).

Листинг 13.4. Останов воспроизведения файла

{

MediaPlayer1->Stop();

MediaPlayer1->Close();

}

Здесь все очень просто. Мы сначала вызываем метод Stop, останавливающий воспроизведение файла, а затем закрываем устройство с помощью метода Close.

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

Анимация

 

Идея компьютерной анимации выглядит довольно просто: на неподвижном фоне (заднем плане) рисуется движущийся объект (в компьютерной анимации такие изображения называются спрайтами). Затем фон восстанавливается в том месте, где был нарисован спрайт, а спрайт рисуется в новом месте. Таким образом, у зрителя возникает ощущение движения спрайта.

Однако на практике все выглядит несколько сложнее. Прежде всего, спрайты, как и неподвижный фон, хранятся в битовых картах. Само изображение спрайта может иметь какие угодно очертания, но битовая карта, в которой хранится спрайт, представляет собой прямоугольник. Как отобразить прямоугольную карту спрайта, сохранив фон из неподвижного изображения вокруг изображения спрайта? Именно эту задачу мы и будем решать в данном разделе. Анимация, которую мы создаем, будет представлять собой воздушный шар, летящий на фоне облаков. Прежде всего, выберем изображение для неподвижного фона.

Наша следующая задача — создание спрайта. Спрайт представляет собой бито­вую­­ карту размером 100´100 пикселов. Для того чтобы корректно решить пробле­му вывода фона вокруг спрайта, мы создадим две битовых карты ­.­

Маска спрайта

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

Изображение спрайта

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

Для размещения в программе фонового изображения и двух битовых карт спрайта мы воспользуемся тремя компонентами TImage (Image1 для неподвижного фо­на, Image2 для маски и Image3 для изображения спрайта). Для того чтобы загру­зить изображение из файла в компонент TImage во время редактирования програм­мы, следует щелкнуть на кнопке с многоточием в поле свойства Picture компонен­та TImage. Будет открыто диалоговое окно, в котором вы сможете выбрать графический файл для загрузки.

Компоненты Image1, Image2 и Image3 нужны только для хранения изображений, ­­­их нужно сделать невидимыми, присвоив свойству Visible значение false. Для ­­­­вы­­­во­­­­да са­мой анимации нам понадобится еще один компонент TImage (Image4). Разме­­ры этого компонента нужно установить равными размерам фонового изо­браже­ния.

Для того чтобы пояснить, как работает анимация, начнем писать функцию ­DrawScene (листинг 13.5).

Листинг 13.5. Первый вариант функции DrawScene

void __fastcall TForm1::DrawScene(int X, int Y)

{

Image4->Canvas->CopyMode = cmSrcCopy;

Image4->Canvas->Draw(0, 0, Image1->Picture->Bitmap);

Image4->Canvas->CopyMode = cmSrcAnd;

Image4->Canvas->Draw(X, Y, Image2->Picture->Bitmap);

}

Первая строка этой функции устанавливает режим копирования изображения из одного объекта TBitmap в другой. В данном случае устанавливается режим копирования cmSrcCopy, используемый по умолчанию. В этом режиме изображение просто переносится из одной битовой карты в другую. Само копирование выполняется с помощью метода Draw. Строка

Image4->Canvas->Draw(0, 0, Image1->Picture->Bitmap);

копирует изображение из компонента Image1 в компонент Image4. Первые два параметра метода соответствуют координатам верхнего левого угла копируемого прямоугольника относительно верхнего левого угла области, в которую выполняется копирование.

Далее мы устанавливаем режим копирования cmSrcAnd. В этом режиме белые ­пикселы одного изображения заменяются небелыми пикселами другого, а черные пиксе­лы заменяют любые цветные пикселы. Если вы вспомните, что цве­­та кодируются числами и черному цвету соответствует число 0x00000000, а бело­­му — 0x00FFFFFF, то поймете, что в этом режиме копирования цвет результирующего пик­­села получается в результате применения операции & к кодам исход­­ных пиксе­лов.­­­

Далее мы копируем изображение из компонента Image2 (содержащего маску спрайта) в компонент Image4. Для того чтобы увидеть эффект созданной нами проце­ду­ры,­ создайте обработчик события OnShow формы приложения и вставьте в не­го вызов:

DrawScene(10, 10);

В результате у вас получится изображение силуэта шара на фоне облаков.­

 

Силуэт шара на фоне облаков

Теперь добавим в функцию DrawScene еще две строки (листинг 13.6).

Листинг 13.6. Окончательный вариант функции DrawScene

void __fastcall TForm1::DrawScene(int X, int Y)

{

Image4->Canvas->CopyMode = cmSrcCopy;

Image4->Canvas->Draw(0, 0, Image1->Picture->Bitmap);

Image4->Canvas->CopyMode = cmSrcAnd;

Image4->Canvas->Draw(X, Y, Image2->Picture->Bitmap);

Image4->Canvas->CopyMode = cmSrcPaint;

Image4->Canvas->Draw(X, Y, Image3->Picture->Bitmap);

}

В режиме копирования cmSrcPaint при объединении черного и окрашенного пиксе­лов получается пиксел с цветом окрашенного пиксела (в этом режиме к кодам цве­тов применяется операция |). Далее мы выводим изображение из компонента Image3 (содержащего окрашенный спрайт на черном фоне) в компонент Image4, в ту­ же область, в которую ранее мы выводили маску спрайта. Если теперь вызвать фун­кцию­

DrawScene(10, 10);

мы получим изображение воздушного шара на фоне облаков (рис. 13.5).

Корректное отображение спрайта и фона

Итак, мы научились выводить спрайт. Однако для анимации этого недостаточно. Нужно, чтобы спрайт еще и двигался. Впрочем, у нас уже есть почти все, что нужно для анимации. Благодаря параметрам X и Y функция DrawScene может выводить спрайт в разных областях компонента Image4.

Введем в класс TMainForm переменные XPos и YPos. Для «оживления» картинки мы во­с­­пользуемся уже знакомым нам компонентом TTimer. Разместите этот компонент­ в форме вашего приложения. Свойству Enabled присвойте значениеfalse, чтобы тай­мер не запустился сразу после запуска приложения. Свойству Interval присвой­те­ значе­ние, определяющее частоту событий таймера. Например, значению 50 бу­дет соответ­ствовать частота 20 событий в секунду (напомним, что значение Interval за­да­ется в миллисекундах). Теперь назначим обработчик событию OnTimer (листи­нг­ 13.7).­

Листинг 13.7. Обработчик события OnTimer

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

DrawScene(XPos, YPos);

if((Image4->Height - YPos < Image2->Height) ||

(Image4->Width - XPos < Image2->Width))

Timer1->Enabled = false;

XPos += 4;

YPos += 4;}

Вначале функция DrawScene рисует сцену анимации, причем положение спрайта определяется значениями переменных XPos и YPos. Затем выполняется проверка, не достиг ли нижний или правый край прямоугольника, в который заключен спрайт, нижнего или правого края фонового изображения. В этом случае таймер останавливается при помощи присваивания

Timer1->Enabled = false;

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

Теперь нам нужно добавить кнопку, запускающую анимацию. Разместите в фор­ме­ ком­понент TButton и назначьте следующий обработчик его событию OnClick ­(листинг 13.8).

Листинг 13.8. Запуск анимации

void __fastcall TForm1::Button1Click(TObject *Sender)

{

XPos = YPos = 0;

Timer1->Enabled = true;

}

Думаю, этот листинг в комментариях не нуждается.

4.7 Воспроизведение анимационных роликов
с помощью компонента TAnimate

Компонент TAnimate, расположенный на вкладке Win32 палитры компонентов, позволяет воспроизводить видеоклипы, записанные в формате AVI (Audio Video Interleaved) без звукового сопровождения. Эти файлы представляют собой по­следовательность кадров — битовых карт.

Компонент TAnimate может воспроизводить клипы avi из ресурсов приложения, из файлов соответствующего формата или из библиотеки Shell32.dll.

Анимация, воспроизводимая компонентом TAnimate, может быть задана одним из двух способов: при помощи свойства FileName, которому передается имя avi-файла, или при помощи свойства CommonAVI. Свойство CommonAVI позволяет воспроизводить стандартные анимации Windows, такие как анимация процесса копирования файлов. Это свойство имеет перечислимый тип TCommonAVI, объявленный следующим образом:

enum TCommonAVI {aviNone, aviFindFolder, aviFindFile, aviFindComputer,

aviCopyFiles, aviCopyFile, aviRecycleFile, aviEmptyRecycle, aviDeleteFile};

Описания значений типа TCommonAVI приведены в табл. 13.3.

Таблица 13.3. Описание элементов типа TCommonAVI

Элемент Описание
AviNone Нет стандартной анимации (анимация должна быть задана в свойстве FileName)
aviFindFolder Поиск папки
aviFindFile Поиск файла
aviFindComputer Поиск компьютера
aviCopyFiles Копирование нескольких файлов
aviCopyFile Копирование одного файла
aviRecycleFile Удаление файла в корзину
aviEmptyRecycle Очистка корзины
aviDeleteFile Удаление файла

Напишем программу для просмотра стандартных анимаций Windows, подобную описанной выше программе тестирования стандартных звуков.

Создайте новое графическое приложение и разместите в его форме компоненты TPanel и TAnimate. Компонент TPanel, с которым мы до сих пор не встречались, пред­став­­ляет собой контейнер для других визуальных компонентов и обычно использу­ет­ся для размещения элементов управления. Присвойте свойству Align этого ком­по­­нента значение alTop, в результате чего он будет «привязан» к верхнему краю фор­мы приложения. Свойству Align компонента TAnimateприсвойте значение alClient. В результате этот компонент займет все пространство формы, не занятое ком­понентом Panel1. Из этого примера должно быть понятно удобство применения­ компонента TPanel. Этот компонент позволяет выделить место для размещения эле­ментов управления, когда все остальное пространство формы должно быть за­ня­то другим компонентом или компонентами.

В компоненте Panel1 разместите компоненты TComboBox и TButton. Свойству Style компонента CombpBox1 присвойте значение csDropDownList, а свойству Caption компонента Button1 — строку "Воспроизвести".

Создайте обработчик события OnCreate объекта Form1 (листинг 13.9).

Листинг 13.9. Обработчик события OnCreate объекта Form1

void __fastcall TForm1::FormCreate(TObject *Sender)

{

ComboBox1->Items->Add("aviFindFolder");

ComboBox1->Items->Add("aviFindFile");

ComboBox1->Items->Add("aviFindComputer");

ComboBox1->Items->Add("aviCopyFiles");

ComboBox1->Items->Add("aviCopyFile");

ComboBox1->Items->Add("aviRecycleFile");

ComboBox1->Items->Add("aviEmptyRecycle");

ComboBox1->Items->Add("aviDeleteFile");

ComboBox1->ItemIndex = 0;

}

Этот обработчик заполняет компонент ComboBox1 перечнем констант, соответствующих стандартным анимациям.

Теперь создайте обработчик события OnClick для компонента Button1 (листинг­ 13.10).­

Листинг 13.10. Обработчик события OnClick компонента Button1

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Animate1->CommonAVI = TCommonAVI(ComboBox1->ItemIndex+1);

Animate1->Play(1, 0, 1);

}

В этом обработчике мы пошли на хитрость. Зная, что элементам перечислимого типа TCommonAVI соответствуют целые числа, причем первому элементу соответствует число 0 и т. д., мы просто преобразуем значение ItemIndex в типTCommonAVI. Нам приходится прибавлять единицу к значению ItemIndex потому, что в списке значений в компоненте ComboBox1 мы пропустили первое — aviNone.

Далее мы воспроизводим выбранную анимацию с помощью метода Play. Первый ар­гумент этого метода — номер кадра AVI, с которого следует начать воспроизве­дение. Второй аргумент — номер кадра, которым следует закончить воспроизведе­ние. Передавая 0 в этом параметре, мы указываем, что хотим воспроизвести анима­цию до последнего кадра. Третий параметр метода Play — количество повторов вос­производимой анимации. Мы задали однократное воспроизведение. Если бы в этом параметре мы передали значение 0, выбранная анимация повторялась бы бес­конечно. Остановить воспроизведение анимации можно при помощи ме­тода Stop.­

Для воспроизведения анимации из файла следует присвоить свойству CommonAVI зна­­­­чение aviNone, а свойству FileName — имя avi-файла. В остальном все выполняет­ся аналогично.

4.8 Медиаплеер в Borland C++ Builder

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

Создайте заготовку нового приложения Borland C++ Builder. Разместите в форме приложения два компонента TPanel. Назовите получившиеся объекты ControlPanel и ViewPanel. Свойству Align объекта ControlPanel присвойте значениеalBottom, что приведет к выравниванию этого компонента по нижнему краю формы. Свойству Align объекта ViewPanel присвойте значение alClient, чтобы он занял все оставшееся пространство формы.

На панели ControlPanel разместим компоненты TButton и TMediaPlayer. В приложение­ нужно добавить также компонент OpenDialog. Свойству Caption объекта Button1 ­при­своим строку "Открыть...". Эта кнопка понадобится нам для выбора имени воспроизводимого файла — единственное, что компонент TMediaPlayer не умеет делать­ сам. Задача вывода изображения компонентом TMediaPlayer решается двумя способами. Компонент может выводить изображение на поверхность другого визуального компонента VCL. Для этого ссылку на соответствующий компонент нужно присвоить свойству Display компонента TMediaPlayer. Если компоненту TMediaPlayer не указана специальная область вывода изображения, он открывает отдельное окно. В нашем приложении для вывода изображения будет использоваться компонент ViewPanel (ссылку на который и следует назначить свойству Display). У компонента TMediaPlayer есть свойство VisibleButtons, позволяющее определить, какие кноп­ки управления будут видимы. Щелкните на значке + слева от имени этого свойства. Раскроется список свойств Visible кнопок управления. Поскольку наше при­ложение не предназначено для записи данных, мы присвоим значение false свойству btRecord, в результате чего кнопка Record (Запись) станет невидимой.

Свойство DisplayRect объекта MediaPlayer1 определяет размеры области вывода изображения. Лучше всего, если эти размеры будут совпадать с размерами компонента, который выполняет роль дисплея. Для этого создадим обработчик события OnShow главной формы и добавим в него строку:

MediaPlayer1->DisplayRect = ViewPanel->BoundsRect;

Такую же строку следует добавить в обработчик события OnResize объекта ViewPanel.

Событию OnClick объекта Button1 назначим обработчик, приведенный в листинге 13.11.

Листинг 13.11. Обработчик события OnClick

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if (OpenDialog1->Execute())

{

MediaPlayer1->FileName = OpenDialog1->FileName;

MediaPlayer1->Open();

}

}

Мы уже выполняли подобную операцию, так что комментировать ее не бу­­дем. Отметим только метод Open, открывающий устройство мультимедиа. Тип ус­трой­ства мультимедиа, с которым работает медиаплеер, определяется свойствомDeviceType. По умолчанию этому свойству присвоено значение dtAutoSelect, при котором медиаплеер пытается самостоятельно определить тип устройства исходя из расширения имени воспроизводимого файла.

Хотя наше приложение еще не закончено, мы уже можем проверить, как оно работает. Запустите приложение, откройте какой-нибудь видеофайл и щелкните на кнопке Воспроизведение. Файл воспроизводится, но сразу можно обнаружить два неприятных момента: кнопки Перемотка вперед и Перемотка назад не работают, а при завершении приложения возникает исключительная ситуация, связанная с тем, что открытое устройство MCI не было закрыто должным образом. Последнюю проблему мы решим, назначив обработчик событию OnClose главной формы (листинг 13.12).

Листинг 13.12. Обработчик события OnClose

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{

MediaPlayer1->Close();

}

Этот обработчик закрывает устройство (если оно было открыто) перед уничтожением формы приложения.

Теперь рассмотрим обработчики кнопок медиаплеера. В компоненте TMediaPlayer определены события OnClick и OnNotify. Первое из этих событий генерируется при щелчке на одной из кнопок медиаплеера. Поскольку для всех кнопок медиапле­ера генерируется одно событие, обработчику события должна быть передана информация о том, на какой кнопке был сделан щелчок. Эта информация передается в параметре Button, имеющем тип TMPBtnType, определенный как

enum TMPBtnType {btPlay, btPause, btStop, btNext, btPrev, btStep, btBack,

btRecord, btEject};

Эти значения соответствуют кнопкам Воспроизведение, Пауза, Останов, Перемотка в ко­нец, Перемотка в начало, Перемотка вперед, Перемотка назад, Запись, Извлечение но­си­теля.

Напишем обработчик события OnClick компонента MediaPlayer1 (листинг 13.13).

Листинг 13.13. Обработчик события OnClick компонента MediaPlayer1

void __fastcall TForm1::MediaPlayer1Click(TObject *Sender,

TMPBtnType Button, bool &DoDefault)

{

DoDefault = false;

switch(Button)

{

case btStep:

MediaPlayer1->Position = MediaPlayer1->Position + 25000;

MediaPlayer1->Step();

break;

case btBack:

MediaPlayer1->Position = MediaPlayer1->Position - 25000;

MediaPlayer1->Step();

break;

default:

DoDefault = true;

break;

}

}

Параметр DoDefault, передаваемый по ссылке, определяет, должно ли выполняться действие, назначенное кнопке по умолчанию (при этом ему должно быть присвоено значение true).

В нашем обработчике мы проверяем, на какой кнопке был сделан щелчок. Если на кнопке btStep (перемотка вперед) или кнопке btBack (перемотка назад), мы увеличиваем или уменьшаем значение свойства Position, указывающего текущую позицию воспроизведения на определенную величину, после чего вызываем метод Step, осуществляющий переход на новую позицию. Метод Step по умолчанию останавливает воспроизведение. Для всех остальных кнопок мы присваиваем ­параметру DoDefault значение true, в результате чего выполняется действие, связанное с кнопкой по умолчанию.


 

ЗАКЛЮЧЕНИЕ

За тот период что я прохожу практику на ОАО КБП, научился работать с такими программами как SolidWorks, P-cad 2002, p-cad 2004, p-cad 2006.

Первая программа отвечает за 3D моделирование, создание деталей и с дальнейшей возможностью сделать по ней чертеж. P-cad-ы отвечают за вывод на плоттер чертежей различных размеров.

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

 

1. C++ и Borland C++ Builder. Самоучитель Боровский Андрей Наумович



Поделиться:




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

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


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