Немного об использовании ресурсов (часть третья)
В этой статье будет расмотрен еще один момент , связанный с работой ресурсов. А именно использование файлов картинок, звуков и пр. в ресурсах исполняемого файла. Данная техника широко любима людьми, которые не любят когда в папке с программой куча мелких файлов. Все это можно изящно спрятать от пользователя.
Микрософт создала довольно простые методы для данной задачи. Есть общий метод для разных форматов, но для форматов WAV , BMP , ICO созданы специальные функции для загрузки и воспроизведения.
Так чтобы поместить файлы в ресурсы надо записать в файле ресурсов:
Для BMP:
1000 RT_BITMAP "1.bmp"
Для ICO:
100 ICON "1.ico"
Для WAV:
200 WAVE "1.wav"
Как вы понимаете, первым идет идентификатор (может быть любым) для последующего обращения к ресурсу в программе. Вторым идет тип ресурса. И третьим полный путь до ресурса.
Загрузить изображение из ресурсов для использования его другими функиями GDI можно с помощью функции LoadImage. Ее параметры рассматривались в этой статье. Поэтому сразу опишу примерную загрузку:
Dim As HBITMAP bmp bmp=LoadImage(GetModuleHandle(0),1000,IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR)
Здесь в первом параметре функции передается хендл модуля, в
котором размещен ресурс картинки, а во втором идентификатор ресурса.
Для загрузки иконки можно использовать тоже прошлую функцию , но вместо типа IMAGE_BITMAP указать тип IMAGE_ICON:
Dim As HICON ico ico=LoadImage(GetModuleHandle(0),100,IMAGE_ICON,0,0,LR_DEFAULTCOLOR)
Так же для загрузки иконки можно использовать более удобную функцию LoadIcon:
Dim As HICON ico ico=LoadIcon(GetModuleHandle(0),100)
Как рисовать изображения имея хендл, можно найти пример в этой
статье. С иконками аналогично.
Для того, чтобы проиграть звук из ресурсов, можно применить функцию PlaySound:
PlaySound(200,GetModuleHandle(0),SND_RESOURCE)
Для других типов файлов можно применить свой тип ресурса примерно
так:
text mytextfile test.txt
Здесь тип ресурса mytextfile , а его имя text. Загрузить же это дело
придется по средствам нескольких WinApi функций. Для начала объявим нужные нам
переменные:
#INCLUDE "windows.bi" Dim As HRSRC ResH Dim As HGLOBAL MemH Dim As Integer ResSize Dim As Ubyte Ptr ResPtr
Прежде всего надо найти ресурс с помощью функции FindResource:
ResH = FindResource(0, "text", "mytextfile")
Здесь первый параметр хендл модуля, в котором расположен ресурс. Второй
его имя. И третий его тип. Функция возвратит хендл блока информации о ресурсе.
Его мы будем использовать двумя другими функциями SizeOfResource и LoadResource.
Функция SizeOfResource вернет нам размер в байтах данного ресурса:
ResSize = SizeOfResource(0, ResH)
В первом параметре передается хендл модуля, в котором расположен ресурс. Во втором хендл блока информации.
Функция LoadResource загружает ресурс в глобальную память. У нее те же параметры , что и у SizeOfResource. Возвращаемое значение функции - хендл глобального блока памяти.
MemH = LoadResource(0, ResH)
Для того, чтобы получить доступ к этому блоку, его надо закрепить за своим указателем. Данную возможность дает функция LockResource . У нее один параметр хендл глобального блока памяти.
ResPtr = Cptr(Ubyte Ptr, LockResource(MemH))
После того, как ресурс закреплен, хендл глобального блока памяти можно
освободить с помощью функции FreeResource
FreeResource(MemH)
И далее используя указатель, можно прочитать данные хотя бы так:
For a As Integer= 0 To ResSize-1 Print Chr(ResPtr[a]); Next
В окончании статьи хочется добавить, что многие библиотеки (как для музыки, так и графики) имеют методы работы с ресурсами. Не стесняйтесь использовать данную технику.