к оглавлению

Программа управления мультимедийным устройством

Здесь рассмотрен пример программы, позволяющей управлять мультимедийным оборудованием, таким как проигрыватель видеофайлов и устройство CD-ROM.

На вкладке System располагается компонент MediaPlayer, с помощью которого можно управлять устройствами мультимедиа на компьютере. Данный компонент будет служить основой для создания программы MultiPlayer.
Определимся с необходимыми компонентами и сформируем интерфейс программы. Создайте новое приложение и поместите на его форму компонент MediaPlayer. Он будет выполнять в программе функции органов управления для проигрывания файлов, их остановки и перемотки. Теперь поместите на форму компонент Panel из вкладки Standard. Этот элемент послужит в качестве экрана для вывода изображения. Далее поместите на форму компонент OpenDialog из вкладки Dialog для обеспечения открытия окна загрузки файлов. Для создания в программе главного меню поместите на форму компонент MainMenu из вкладки Standard. С целью придания программе удобства пользования поместите на форму компонент ТооlBar, который позволит создать кнопки для выполнения различных команд. Наконец, поместите на форму компонент ImageList из палитры Win32 для загрузки и хранения в нем рисунков иконок кнопок и пунктов главного меню.

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

Таблица 25.1. Свойства компонентов

Компонент Свойство Значение
MediaPiayer1 AutoOpen false
MediaPiayer1  Cursor CrHandPoint
MediaPiayer1  Display Panel1
Panel1 Caption Пустая строка

Кроме того, можно отключить некоторые кнопки в компоненте MediaPlayer1 с помощью его свойств VisibleButtons, установив значение false для ненужных кнопок, например для кнопки записи btRecord.
У компонента OpenDialog1 необходимо настроить свойство фильтра файлов. Чтобы это сделать, щелкните левой кнопкой мыши по кнопке с тремя точками, расположенной правее поля Filter, и в открывшемся окне редактора Filter Editor введите строки в соответствии с рис. 25.1.

Окно редактора Filter Editor

Рис. 25.1. Окно редактора Filter Editor


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

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

Окно редактора ImageList

Рис. 25.2. Окно редактора ImageList

Щелкните в этом окне по кнопке Add для добавления в компонент файлов с рисунками. При этом откроется окно выбора файлов (рис. 25.3).

Окно выбора файлов

Рис. 25.3. Окно выбора файлов

Выберите в нем каталог C:\Program Files\Common Files\Borland Shared\Images\Buttons\ и загрузите файлы с рисунками, подходящими по смыслу для кнопок с функциями открытия и закрытия файлов, проигрывания и останова мультимедийных файлов, открытия и закрытия дверки CD-ROM и для выхода из программы. Обратите внимание на то, что все рисунки состоят из двух частей: цветной и серо-белой. Это позволит в программе показывать кнопки как доступные, так и недоступные.

Каждый раз при загрузке очередного файла рисунки будут помещаться в окно формы заполнения компонента ImageList1 с автоматическим присвоением им номеров от нуля. В дальнейшем эти номера рисунков будут использоваться в программе как индексы рисунков.
Для обеспечения доступа к рисункам ImageList1 компоненты ToolBar1 и MainMenu1 должны иметь в свойстве Images имя компонента ImageList1.

Оно выбирается из разворачиваемого списка в свойстве Images инспектора объектов (рис. 25.4).

Окно инспектора объектов

Рис. 25.4. Окно инспектора объектов

Теперь создайте пункты главного меню и панели инструментов. Для этого щелкните дважды левой кнопкой мыши по компоненту MainMenu1, и в отрывшемся окне редактора меню задайте свойство Caption в виде строки File для первого пункта меню и нажмите клавишу <Enter>.

Далее щелкните по пункту меню File, а затем по пустому полю, появившемуся ниже. Задайте для него свойство Caption в виде строки Open. Ниже создайте пункт с названием Close. Еще ниже — разделитель, присвоив свойству Caption значение в виде символа "-" (минус). Последним в разделе File создайте пункт меню Exit. Правее пункта File создайте еще две группы пунктов меню с названиями Play и CD (рис. 25.5).

Окно редактора меню

Рис. 25.5. Окно редактора меню

Группу Play дополните пунктами меню Go и Pause, а группу CD — пунктами Open и Close. Закройте окно редактора меню.
Для добавления кнопок панели инструментов ToolBar1 необходимо щелкнуть по ней правой кнопкой мыши, и в открывшемся окне (рис. 25.6) выбрать команду New Button.

Окно редактора ToolBar1

Рис. 25.6. Окно редактора ToolBar1

При этом на панели инструментов появится новая пустая кнопка. Вновь откройте окно редактирования панели и выберите команду New Separator. На панели инструментов появится разделитель. Аналогично добавьте на панель две сдвоенные  кнопки (с разделителем) и одну одиночную.

Теперь задайте компонентам созданных кнопок осмысленные имена с помощью свойства имен Name в соответствии с табл. 25.2.

Таблица 25.2. Имена компонентов

Компонент Значение свойства Name Компонент Значение свойства Name
ToolButton1 ToolButtonFileOpen ToolButton6 ToolButtonSp2
ToolButton2 ToolButtonFileClose ToolButton7 ToolButtonCDOpen
ToolButton3 ToolButtonSp1 ToolButton8 ToolButtonCDCiose
ToolButton4 ToolButtonPlay ToolButton9 ToolButtonSp3
ToolButton5 ToolButtonPause ToolButton10 ToolButtonExit

Приступайте к графическому оформлению кнопок и пунктов меню. Начните с кнопок панели инструментов TooIButton1. Выделите первую слева кнопку на этой панели, и в инспекторе объектов найдите для нее свойство Imagelndex. Щелкните левой кнопкой мыши на поле правее этого свойства, а затем по кнопке со стрелкой, направленной вниз, для раскрытия списка доступных рисунков. Выберите из этих рисунков, загруженных вами в компонент ранее, рисунок, подходящий по смыслу для команды открытия файла. При этом свойство Imagelndex примет значение, соответствующее индексу выбранного рисунка.
Повторите эту операцию для остальных кнопок панели инструментов за исключением разделителей. Естественно, что кнопкам должны назначаться рисунки, подходящие по смыслу выполняемых ими команд. В результате должна получиться форма, похожая на представленную на рис. 25.7.

Окно формы с компонентами

Рис. 25.7. Окно формы с компонентами

Проделайте аналогичную операцию для пунктов главного меню программ! MainMenu1. Для этого щелкните дважды левой кнопкой мыши по компо ненту MainMenu1 и в открывшемся редакторе меню выберите первый пунк File. Задайте его свойство Imagelndex аналогично тому, как это было сдела но для первой кнопки панели инструментов. Подобным образом назначьте индексы рисунков всем остальным пунктам меню и закройте редактор меню. Теперь при запуске программы пункты меню будут содержать не только текст команды, но и рисунок, соответствующий этой команде, как показано на рис. 25.8.

Окно программы с рисунками в меню команд

Рис. 25.8. Окно программы с рисунками в меню команд

 

Такое оформление обогащает интерфейс программы и делает ее намного привлекательнее для пользователей.
Осталось ввести код программы для обработчиков команд — и программа будет готова. С целью сокращения трудозатрат и придания программе изящности создайте обработчики команд только для пунктов главного меню, а кнопкам панели инструментов назначьте имена созданных обработчиков, чтобы не дублировать записи.
Начните с пункта меню Open группы File. Выберите этот пункт меню, при этом откроется редактор кода с заготовкой функции обработки события OnClick:

void __fastcall TForm1::Open1Click(TObject *Sender)
{

}

Впишите между фигурными скобками этого обработчика следующие программные строки:

if(OpenDialog1->Execute()){
 MediaPlayer1->FileName=OpenDialog1->FileName;
 MediaPlayerl->Open();}

 

Они позволят выполнить диалог открытия файлов и загрузить его в компонент MediaPlayer1.
Аналогично назначьте функции обработки для  пункта меню File | Close, введя в заготовку обработчика команды код программы:

MediaPlayer1->Close();

 

Для пункта меню Play | Go введите программную строку проигрывания файла:

 MediaPlayer1->Play();

 

Пункт меню Play | Pause снабдите обработчиком с программной строкой приостановки проигрывания файла:

 MediaPlayer1->Pause();

 

Обработчик команды меню CD | Open заполните программными строками открытия устройства CD-ROM:

mciSendString("Set  cdaudio door open wait",   NULL,   0,   Handle);

 

Для пункта меню CD | Close введите программную строку закрытия привода CD-ROM:

mciSendString("Set  cdaudio door closed wait",   NULL,   0,   Handle);

 

Замените значок (иконку) программы с помощью команды главного меню Project | Options | Application на предварительно созданный во встроенном редакторе Image Edit файл иконки с расширением ico. Сохраните и откомпилируйте программу.
Теперь программа будет работать. Осталось активизировать кнопки панели инструментов. Для этого зададим их обработчик события OnCIick. Щелкните левой кнопкой мыши по кнопке открытия файла на панели инструментов программы. В инспекторе объектов откройте вкладку событий Events. Щелкните по полю правее события OnCIick и выберите в раскрывающемся списке имя обработчика события Open1Click. Этот обработчик был создан нами для выполнения пункта главного меню File | Open. Аналогично назначьте имена обработчиков событий для остальных кнопок панели инструментов программы. Имена обработчиков несут в себе смысл выполняемой ими команды, а сами обработчики принадлежат пунктам главного меню программы.
Программа готова. Запустите ее и проверьте, как она работает. При необходимости устраните обнаруженные компилятором ошибки.

Добавьте в программу еще один эффект. Ранее было упомянуто, что рисунки для иконок состоят из двух частей: цветной и серо-белой, что позволяет программе показывать кнопки как доступные, так и недоступные. Воспользуемся этим. Сделаем так, чтобы при запуске программы доступной была кнопка панели инструментов CD Open, а кнопка CD Close — недоступной. И пусть после каждого открытия и закрытия CD-ROM эта ситуация меняется на противоположную. Для этого изменим свойство Imagelndex компонента ToolButtonCDClose на индекс серо-белого рисунка закрытия CD-ROM. Аналогично необходимо поступить с компонентом пункта CD | Close главного меню программы. Кроме того, в обработчике открытия CD-ROM необходимо добавить строки программы для изменения порядка индексов рисунков компонента ImageList1:

ImageList1->Move(10,11);

ImageList2->Move(13,12);

А в обработчике закрытия CD-ROM надо добавить строки программы для восстановления первоначального порядка индексов рисунков компонента ImageList1:

ImageList1->Move(12,13);

ImageList2->Move(11,10);

Теперь после запуска программы вы увидите, что кнопка закрытия устройства CD-ROM будет серой в отличие от кнопки CD Open. А после операции открытия CD-ROM картина поменяется на противоположную.
Обратите внимание, то же самое происходит и с рисунками пунктов главного меню программы для команд открытия и закрытия CD-ROM!

Введите в программу еще одну полезную функцию, которая позволит закрывать приложение при нажатии кнопки <Esc> на клавиатуре. Для этого сформируйте для формы Form1 приложения обработчик события ОпKeyPress и введите в него программную строку:

if(Key==VK_ESCAPE)   Close();

Теперь программу легко закрыть, нажав одну-единственную кнопку <Esc> на клавиатуре.

Для того чтобы в программе появилась памятка об этом, задайте в свойстве Shortcut для пункта меню File | Exit значение в виде строки Esc. После этого данная строка будет присутствовать в записи самого пункта меню как напоминание об этой возможности. Аналогично можно поступить и с другими пунктами меню, назначив для их выполнения новые клавиши или их комбинации.
Для придания нового качества программе научимся сворачивать ее в так называемый tray (Поддон), который представляет собой служебное подвальное окно на рабочем столе компьютера, где обычно размещаются значки программ часов, регулятора громкости, настройки экрана и т. д.

Для этого поместите на форму приложения компонент Тгау из вкладки Samples и задайте его свойство Visible равным true. Теперь при запуске и сворачивании программы ее значок будет всегда находиться в подвале рабочего стола для служебных программ. Разворачивание программы осуществляется двойным щелчком левой кнопки мыши по этому значку.
Наконец придайте программе еще большую изящность, добавив в нее контекстное меню. Как известно, это меню вызывается нажатием правой кнопки мыши на поле программы. Создайте меню, состоящее из двух пунктов-команд: разворачивающей и сворачивающей программу. Поместите на форму программы компонент PopupMenu из вкладки Standard. Щелкните по нему дважды левой кнопкой мыши и в открывшемся редакторе пунктов меню создайте пункты Развернуть и Свернуть по аналогии с тем, как это делалось при создании пунктов главного меню программы.

Закройте редактор пунктов контекстного меню.
Теперь необходимо обеспечить доступ из главной формы Form1 и из компонента Traylcon1 к этому контекстному меню. Для этого в инспекторе объектов задайте для свойства PopupMenu этих компонентов значение PopupMenu1, выбрав его из разворачиваемого списка. Имя данного компонента появилось в списке после того, как мы поместили этот компонент на форму приложения. Естественно, что таких компонентов может быть несколько, они будут автоматически получать порядковые номера и могут использоваться в программе разными компонентами. В нашей программе можно обойтись одним-единственным компонентом контекстного меню.
Теперь, когда созданы пункты контекстного меню, необходимо сформировать для них обработчики события OnCIick. О том, как это делается, неоднократно говорилось ранее, поэтому описание этой процедуры опускается.

Для пункта меню Развернуть впишите в обработчик события OnCIick программную строку:
Traylcon1->Restore ();

Следующую программную строку вставьте в обработчик события OnCIick для пункта меню Свернуть:
TrayIcon1->Minimize();

Теперь при запуске программы контекстное меню будет появляться для развернутого приложения. После сворачивания программы в подвал меню будет недоступно. Для того чтобы оно стало доступным из подвала, замените значение imNone свойства PopupMenuOn компонента Traylcon1 на значение imRightCIickUp, которое позволит вызывать меню по щелчку правой кнопки мыши на компоненте.
Пункты контекстного меню можно оформить графически так же, как это сделано для пунктов главного меню. Для этого задайте в свойстве Images компонента PopupMenu1 имя ImageList1, выбрав его из разворачивающегося списка, и добавьте в компонент ImageList1 пару рисунков.

Для придания программе большей привлекательности можно добавить в нее всплывающие подсказки, которые появляются при наведении курсора мыши на быструю кнопку и сообщают пользователю ее назначение. Для этого необходимо задействовать свойство Hint компонентов быстрых кнопок.
Активизируйте окно инспектора объектов и щелкните левой кнопкой мыши по кнопке программы, отвечающей за открытие файла. Инспектор объектов автоматически переключится на редактирование свойств этого компонента. В строке Hint введите строку Открыть файл, которая будет появляться в качестве справки.
Теперь установите свойство ShowHint этого же компонента в состояние true, для того чтобы разрешить отображение строки справки при работе программы. Аналогичную процедуру необходимо проделать для остальных быстрых кнопок программы, задав их свойству Hint значения в виде строк: Закрыть файл, Начать, Пауза, Открыть CD-ROM и Закрыть CD-ROM соответственно.
Запустите программу и проверьте, что она работает так, как было задумано.

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

Примечания:
к оглавлению

Знаете ли Вы, почему "черные дыры" - фикция?
Согласно релятивистской мифологии, "чёрная дыра - это область в пространстве-времени, гравитационное притяжение которой настолько велико, что покинуть её не могут даже объекты, движущиеся со скоростью света (в том числе и кванты самого света). Граница этой области называется горизонтом событий, а её характерный размер - гравитационным радиусом. В простейшем случае сферически симметричной чёрной дыры он равен радиусу Шварцшильда".
На самом деле миф о черных дырах есть порождение мифа о фотоне - пушечном ядре. Этот миф родился еще в античные времена. Математическое развитие он получил в трудах Исаака Ньютона в виде корпускулярной теории света. Корпускуле света приписывалась масса. Из этого следовало, что при высоких ускорениях свободного падения возможен поворот траектории луча света вспять, по параболе, как это происходит с пушечным ядром в гравитационном поле Земли.
Отсюда родились сказки о "радиусе Шварцшильда", "черных дырах Хокинга" и прочих безудержных фантазиях пропагандистов релятивизма.
Впрочем, эти сказки несколько древнее. В 1795 году математик Пьер Симон Лаплас писал:
"Если бы диаметр светящейся звезды с той же плотностью, что и Земля, в 250 раз превосходил бы диаметр Солнца, то вследствие притяжения звезды ни один из испущенных ею лучей не смог бы дойти до нас; следовательно, не исключено, что самые большие из светящихся тел по этой причине являются невидимыми." [цитата по Брагинский В.Б., Полнарёв А. Г. Удивительная гравитация. - М., Наука, 1985]
Однако, как выяснилось в 20-м веке, фотон не обладает массой и не может взаимодействовать с гравитационным полем как весомое вещество. Фотон - это квантованная электромагнитная волна, то есть даже не объект, а процесс. А процессы не могут иметь веса, так как они не являются вещественными объектами. Это всего-лишь движение некоторой среды. (сравните с аналогами: движение воды, движение воздуха, колебания почвы). Подробнее читайте в FAQ по эфирной физике.

Bourabai Research Institution home page

Bourabai Research - Технологии XXI века Bourabai Research Institution