Примеры Delphi и C# из жизни

Примеры программирования на языках Delphi, C#

 




Загрузка изображения из ресурса с помощью GDI+ | Delphi

Частенько возникает необходимость загрузить изображение из ресурса, прилинкованного к программе. Рассмотрим вариант для gdi+

Для начала необходимо создать файл описания ресурса
myresources.rc
IMG1 GIF giffile.gif
IMG2 BITMAP bitmapfile.bmp


Далее, превратим его в файл ресурса, который подключим к проекту с помощью директивы компилятора {$R myresource.res}
brcc32.exe myresource.rc


Теперь, собственно код для загрузки:
var
 MainForm: TMainForm;
 g: TGPGraphics;
 bmp: TGPBitmap;
:
procedure TMainForm.FormCreate(Sender: TObject);
var
 resHandle, resSize, hBuffer: Cardinal;
 presData, pBuffer: pointer;
 resIStream: IStream;
 ERROR: Boolean;
begin
 // получаем хэндл указанного ресурса
 resHandle := FindResource(HInstance, 'IMG1', 'GIF');
 if resHandle = 0 then ERROR := True;
 // получаем размер ресурса
 resSize := SizeofResource(HInstance, resHandle);
 if resSize = 0 then ERROR := True;
 // получаем указатель на первый байт ресурса
 presData := LockResource(LoadResource(HInstance, resHandle));
 if presData = nil then ERROR := True;
 // выделяем необходимое количество байт в куче(heap) и получаем хэндл
 hBuffer := GlobalAlloc(GMEM_MOVEABLE, resSize);
 if hBuffer <> 0 then begin
 // получаем указатель на выделенный блок памяти
 pBuffer := GlobalLock(hBuffer);
 if pBuffer <> nil then begin
 // копируем ресурс в память
 CopyMemory(pBuffer, presData, resSize);
 // и создаем на его основе поток в памяти
 if CreateStreamOnHGlobal(hBuffer, False, resIStream) = S_OK
 then
 // используем перегруженный метод создания изображения из потока
 bmp := TGPBitmap.Create(resIStream);
 end;
 end;
end;