Советы по Delphi

         

Загрузка изображения/курсора из RES-файла


Загрузка изображений и курсоров из RES-файлов

Изображения и курсоры могут храниться в файлах ресурсов (RES) и прилинковываться (связаваться) к EXE-файлу вашего приложения. RES-файлы могут создаваться с помощью Delphi утилит Image Editor и Borland Resource Workshop, входящие в поставку Delphi RAD Pack. Изображения и курсоры, хранимые в RES-файлах (после упаковки их в EXE или DLL) могут быть извлечены с помощью API функций LoadBitmap и LoadCursor соответственно.

Загрузка изображений

Функция API LoadBitmap определена следующим образом:

function LoadBitmap(Instance: THandle; BitmapName: PChar): HBitmap;

Первый параметр должен содержать дескриптор модуля (EXE или DLL), содержащего файл RES, из которого вы хотите получить ресурс. Delphi хранит дескриптор запущенного EXE-файла в глобальной переменной с именем Hinstance. В приведенном ниже примере мы предполагаем, что модуль, из которого мы пытаемся загрузить изображение, - ваше приложение. Тем не менее, модуль мог бы быть другим EXE- или DLL-файлом. Следующий пример загружает изображение с именем BITMAP_1 из RES-файла, прилинкованного к EXE-файлу приложения:



procedure TForm1.Button1Click(Sender: TObject);varBmp: TBitmap;beginBmp := TBitmap.Create;Bmp.Handle := LoadBitmap(HInstance,'BITMAP_1');Canvas.Draw(0, 0, Bmp);Bmp.Free;end;

Имеется один недостаток использования API вызова LoadBitmap: LoadBitmap все же является API вызовом Windows 3.0, и грузит изображение только как DDB (Device Dependent Bitmaps). Это может вызвать проблемы с цветовой палитрой при загрузке DIB (Device Independent Bitmaps) из RES-файла. Приведенный ниже код может использоваться для извлечения DIB-ов из RES-файлов. Данный код загружает изображение как общий ресурс, передает его в поток, после чего делает Delphi вызов LoadFromStream, реализующий палитру автоматически.

procedure TForm1.Button1Click(Sender: TObject);constBM = $4D42; {Идентификатор типа изображения}varBmp: TBitmap;BMF: TBitmapFileHeader;HResInfo: THandle;MemHandle: THandle;Stream: TMemoryStream;ResPtr: PByte;ResSize: Longint;beginBMF.bfType := BM;{Ищем, загружаем и блокируем ресурс, содержащий BITMAP_1}HResInfo := FindResource(HInstance, 'BITMAP_1', RT_Bitmap);MemHandle := LoadResource(HInstance, HResInfo);ResPtr := LockResource(MemHandle);
{Создаем Memory-поток, устанавливаем его размер, записываемтуда заголовок изображения и, наконец, само изображение }Stream := TMemoryStream.Create;ResSize := SizeofResource(HInstance, HResInfo);Stream.SetSize(ResSize + SizeOf(BMF));Stream.Write(BMF, SizeOf(BMF));Stream.Write(ResPtr^, ResSize);
{Освобождаем поток и сбрасываем его позицию в 0}FreeResource(MemHandle);Stream.Seek(0, 0);
{Создаем TBitmap и загружаем изображение из MemoryStream}Bmp := TBitmap.Create;Bmp.LoadFromStream(Stream);Canvas.Draw(0, 0, Bmp);Bmp.Free;Stream.Free;end;
<

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