Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[98.84.18.52] |
|
Сообщ.
#1
,
|
|
|
Может быть кому-нибудь пригодиться данный код или он послужит отправной точкой. Аналогия WinApi функции LoadImage без каких-либо примочек, простенько, но свою задачу выполняет. Для одного проекта требовалось поместить на STATIC PNG изображение, пришлось написать такой вот код.
unit F_GdipImg; { GdipLoadImage(hInstance, MAKEINTRESOURCEW(RC_IMAGE), TYPE_RCDATA, GetSysColor(COLOR_BTNFACE)); GdipLoadImage(hInstance, MAKEINTRESOURCEW(RC_IMAGE), TYPE_PNG, GetSysColor(COLOR_BTNFACE)); GdipLoadImage(hInstance, MAKEINTRESOURCEW(RC_IMAGE), TYPE_GIF, GetSysColor(COLOR_BTNFACE)); GdipLoadImage(hInstance, MAKEINTRESOURCEW(RC_IMAGE), TYPE_JPEG, GetSysColor(COLOR_BTNFACE)); GdipLoadImage(0, 'C:\Image.png', TYPE_SHARED, GetSysColor(COLOR_BTNFACE)); } interface uses Windows, F_GdiPlus, F_IStream; const TYPE_RCDATA = 1; TYPE_PNG = 2; TYPE_GIF = 3; TYPE_JPEG = 4; TYPE_SHARED = 5; function GdipLoadImage(hinst: HMODULE; lpszName: PWideChar; uType: UINT; RgbClr: TColorRef): HBITMAP; implementation // function GdipLoadImage(hinst: HMODULE; lpszName: PWideChar; uType: UINT; RgbClr: TColorRef): HBITMAP; var hRes : HRSRC; dwResSize: DWORD; hResLoad : HGLOBAL; lpResLock: Pointer; hMem : HGLOBAL; pData : Pointer; hr : HRESULT; pStream : IStream; Bitmap : TGpImage; hGlob : HGLOBAL; lpszType : PWideChar; begin Result := 0; case uType of TYPE_SHARED: begin GdipLoadImageFromFile(lpszName, Bitmap); if (Bitmap <> nil) then try GdipCreateHBITMAPFromBitmap(Bitmap, Result, ColorRefToARGB(RgbClr)); finally // GdipLoadImageFromFile. GdipDisposeImage(Bitmap); end; end; else begin case uType of TYPE_RCDATA: lpszType := MAKEINTRESOURCEW(RT_RCDATA); TYPE_PNG : lpszType := 'PNG'; TYPE_GIF : lpszType := 'GIF'; TYPE_JPEG : lpszType := 'JPEG'; end; hRes := FindResourceW(hinst, lpszName, lpszType); if (hRes <> 0) then try dwResSize := SizeofResource(hinst, hRes); if (dwResSize <> 0) then try hResLoad := LoadResource(hinst, hRes); if (hResLoad <> 0) then try lpResLock := LockResource(hResLoad); if (lpResLock <> nil) then try hMem := GlobalAlloc(GMEM_MOVEABLE, dwResSize); if (hMem <> 0) then try pData := GlobalLock(hMem); if (pData <> nil) then try // если передать TRUE в CreateStreamOnHGlobal, то поток сам // освободит выделенную память и не потребуется использовать // GetHGlobalFromStream. CopyMemory(pData, lpResLock, dwResSize); pStream := nil; hr := CreateStreamOnHGlobal(hMem, FALSE, pStream); if (hr = S_OK) then try GdipLoadImageFromStream(pStream, Bitmap); if (Bitmap <> nil) then try GdipCreateHBITMAPFromBitmap(Bitmap, Result, ColorRefToARGB(RgbClr)); finally // GdipLoadImageFromStream. GdipDisposeImage(Bitmap); end; finally // CreateStreamOnHGlobal. hr := GetHGlobalFromStream(pStream, hGlob); if (hr = S_OK) then GlobalFree(hGlob); pStream := nil; end; finally // GlobalLock. end; finally // GlobalAlloc. GlobalUnlock(hMem); GlobalFree(hMem); end; finally // LockResource. UnlockResource(HGLOBAL(lpResLock)); end; finally // LoadResource. FreeResource(hResLoad); end; finally // SizeofResource. end; finally // FindResource. end; end; end; end; end. |