lgImages,
smImages: TImageList);
var
icon: TIcon;
smIconHandle, lgIconHandle: HICON;
i: Integer;
begin
//Загрузка каждого значка (неоптимально, но просто)
i := 0;
while Integer(
ExtractIconEx(PAnsiChar(filename), i, lgIconHandle,
smIconHandle, 1)
) > 0 do
begin
Inc(i);
//Большой значок
icon := TIcon.Create;
icon.Handle := lgIconHandle;
lgImages.AddIcon (icon);
//Малый значок
icon := TIcon.Create;
icon.Handle := smIconHandle;
smImages.AddIcon (icon);
end;
end;
В листинге 4.37 для извлечения значков из файла используется очередная полезная функция модуля ShellApi – Extract IconEx. Прототип функции таков:
function ExtractIconEx (lpszFile: PChar; nIconIndex: Integer;
var phiconLarge, phiconSmall: HICON;
nIcons: UINT): UINT;
Функция ExtractlconEx принимает следующие параметры:
• lpszFile – путь файла, из которого извлекаются значки;
• nIconlndex – номер первого извлекаемого значка; нумерация начинается с нуля (если номер равен -1 и параметры piconLarge и piconSmall нулевые, то функция возвращает количество значков в файле);
• piconLarge, piconSmall – ссылки на переменные типа HI CON (либо на первые элементы массива array. of HICON) для помещения в них дескрипторов больших и малых значков соответственно;
• nIcons – количество извлекаемых значков (по сути, может быть количество элементов в передаваемых в функцию массивах: лишние элементы не будут заполнены).
Функция возвращает количество значков, извлеченных из файла, или количество значков в файле при соответствующем значении параметра nlconlndex.
В листинге 4.36 используется не совсем оптимальный способ извлечения значков из файла – по одному. Однако он подойдет для большинства случаев. Другой (но не единственный) вариант – использование массива. Тогда функцииЕх^асИсопЕх передаются первые элементы массивов для дескрипторов значков (функции нужен адрес начала массива), а в качестве последнего параметра – количество элементов в массиве. Таким образом, если количество значков в файле превзойдет количество элементов в массиве, то вызов функции ExtractlconEx можно будет повторить, передав в качестве параметра nlconlndex значение, возвращенное функцией ExtractlconEx, умноженное на номер вызова функции (начиная с нуля).
Можно также использовать динамический массив, предварительно установив его размер, вызвав функцию ExtractlconEx с параметром nlconlndex, равным -1. Установить значения параметров piconLarge, piconSmall в ноль (не меняя объявления функции) можно, объявив указатель на HICON (AHICON), присвоив ему значение nil и передав его в качестве упомянутых параметров в функцию.
На рис. 4.11 приводится внешний вид формы приложения после извлечения значков из файла Explorer. ехе.
Обработчик нажатия кнопки Загрузить значки представленной н а рис. 4.11 формы приводится в листинге 4.38.
Рис. 4.11. Пример извлеченных из ЕХЕ-файла значков
Листинг 4.38. Составление списков значков и их отображение
procedure TForm1.cmbLoadIconClick(Sender: TObject);
var
i: Integer;
item: TListItem;
begin
lvwIconsLg.Clear;
lvwIconsSm.Clear;
//Загрузка значков в ImageList
ImageListLg.Clear;
ImageListSm.Clear;
LoadIcons(txtFile.Text, ImageListLg, ImageListSm);
//Создание элементов в ListView с большими и малыми значками
for i := 0 to ImageListLg.Count – 1 do
begin
item := lvwIconsLg.Items.Add();
item.Caption := 'Icon' + IntToStr(i+1);
item.ImageIndex := i;
item := lvwIconsSm.Items.Add ();
item.Caption := 'Icon' + IntToStr(i+1);
item.ImageIndex := i;
end;
end;
Подразумевается, что имена элементов управления ListView: для отображения больших значков – lvwIconLg и для отображения малых lvwIconSm. На форме также расположены два элемента управления ImageList: ImageListLg для хранения больших и ImageListSm для хранения малых значков.
С помощью окна Object Inspector список ImageListLg назначен в качестве источника больших изображений (свойство Largelmages) для lvwIconLg. Соответственно, список ImageListSm назначен в качестве источника малых изображений (свойство Smalllmages) для lvwIconSm.
Глава 5 Мультимедиа
• Воспроизведение звука с помощью системного динамика
• Использование компонента MediaPlayer
• Компонент Animate
• Разработка звукового проигрывателя
• Видеопроигрыватель
Использование мультимедийных технологий позволяет повысить качество программ и придает им профессиональный вид, более привлекательный для пользователя. Среди разнообразных применений мультимедиа наиболее интересны аудио– и видеовозможности компьютера. Использование звуков и видео в программах позволяет иным образом взаимодействовать с пользователем: озвучивать его действия, информировать о некоторых событиях, просматривать видеоролики и т. п.
В рамках предложенной главы будут рассмотрены основные возможности мультимедийных средств и компонентов среды Delphi. Будут описаны компоненты Animate и MediaPLayer, использование API-функций для генерации звука системным динамиком и для воспроизведения звука из ресурсных файлов.
В отличие от языков Turbo Pascal и Borland Pascal, Delphi не содержит процедур типа Sound и NoSound, предназначенных для работы со звуком. Для использования мультимедийных возможностей компьютера в Delphi служат специальные компоненты Animate и MediaPLayer.
Компонент MediaPLayer является основным элементом воспроизведения аудио– и видеофайлов. Многофункциональный элемент MediaPLayer обладает рядом важных характеристик (свойств) и обеспечивает управление мультимедийными устройствами.
Для создания и воспроизведения простейшей анимации предназначен компонент Animate. Он позволяет воспроизводить файлы в формате AVI (Audio-Video Interleaved – Аудио– и видеосмесь).5.1. Воспроизведение звука с помощью системного динамика
Звуковое сопровождение является важной частью большинства современных мультимедийных приложений. В простейших случаях генерации звукового сигнала удобно использовать процедуру Веер модуля SysUtils. В этом случае нет необходимости использовать вышеупомянутые мультимедийные компоненты языка, а звук создается встроенным системным динамиком. Процедура Веер осуществляет вызов одноименной API-функции, поэтому ее использование не составит большого труда (листинг 5.1).
Листинг 5.1.
Генерация звукового сигнала посредством функции Веер
procedure TForm1.Button1Click(Sender: TObject);
begin
Beep; //Генерация звукового сигнала
MessageDlg('Звуковой сигнал был подан', mtError, [mbOK], 0);
end;
Наряду с Веер для получения звукового сигнала используется API-функция MessageBeep (uType: UINT): Boolean, генерирующая стандартный системный звук, тип которого указывает параметр uType. Параметр функции MessageBeep может задаваться двумя способами: в виде шестнадцатеричного числа или поименованной константы. Например, системный звук по умолчанию задается константой МВ_ОК, а стандартный системный звук задается шестнадцатеричным числом $ FFFFFFFF. Функция возвращает параметр типа Boolean, который в случае успешного выполнения (воспроизведения звука) равен True.
5.2. Использование компонента MediaPlayer
Мультимедийный проигрыватель Media Player является многофункциональным управляющим элементом. Он представляет программисту набор свойств и методов, позволяющих манипулировать файлами и устройствами мультимедиа, поддерживать воспроизведение и перемещение между остальными фонограммами (дорожками, записями), а также идентифицировать подключенные устройства.
Компонент MediaPlayer содержит следующие кнопки (рис. 5.1, слева направо).
• Play – воспроизведение.
• Pause – пауза.
• Stop – остановка.
• Next – переход к следующей фонограмме (дорожке). Для случая одной фонограммы выполняется переход в ее конец.
• Prev – переход к предыдущей фонограмме. Для случая одной фонограммы выполняется переход в ее начало.
• Step – переход на несколько кадров вперед.
• Back – возврат на несколько кадров назад.
• Record – включение режима записи.
• Eject – извлечение носителя.
Рис. 5.1. Вид компонента MediaPlayer
Компонент MediaPlayer обладает рядом свойств, которые позволяют управлять