Доброго времени суток. Потребовалось написать приложение под WinCE. В коде используется функция GetDIBits, которая и отсутсвует в ОС. Необходимо сделать аналог функции. Поиском выдает что-то непонятное... Попытался сделать сам, но познания в области копирования указателей и прочего очень скудные. Направьте в нужное русло...
В программе в исходниках используется код:
ldc := CreateCompatibleDC(0);
GetDIBits(ldc, src, 0, srcbmp.bmHeight, srcdib, srcdibbmap, DIB_RGB_COLORS);
DeleteDC(ldc);
Я сделал свою функцию:
function GetDIBits2(const hdcSrc: HDC; srcBmp: HBitmap; StartScan, NumScans: UINT;
out Bits: Pointer; out BitInfo: TBitmapInfo; const Usage: UINT): Integer;
var
ret : DWORD;
bi : Windows.BITMAP;
bmi : TBitmapInfo;
lpBits: Pointer;
hbmMem: HBITMAP;
hbmOld: HBITMAP;
begin
(*
{$IFDEF WINCE}
Result := 0;
Exit;
{$ELSE}
Result := GetDIBits(DC, srcBmp, StartScan, NumScans, Bits, BitInfo, Usage);
{$ENDIF}
*)
Result := 0;
ret := GetObjectW(srcBmp, SizeOf(Windows.BITMAP), @bi);
if (ret = 0) then
Exit;
ZeroMemory(@bmi, SizeOf(TBitmapInfo));
bmi.bmiHeader.biSize := SizeOf(bmi.bmiHeader);
bmi.bmiHeader.biWidth := bi.bmWidth;
bmi.bmiHeader.biHeight := -bi.bmHeight;
bmi.bmiHeader.biPlanes := 1;
bmi.bmiHeader.biBitCount := 32;
bmi.bmiHeader.biCompression := BI_RGB;
bmi.bmiHeader.biSizeImage := bi.bmWidth * bi.bmHeight * 4;
hbmMem := CreateDIBSection(hdcSrc, bmi, DIB_RGB_COLORS, lpBits, 0, 0);
if (hbmMem <> 0) then
try
hbmOld := SelectObject(hdcSrc, hbmMem);
if (hbmOld <> 0) then
try
GetObjectW(hbmMem, SizeOf(TBitmapInfo), @bmi);
BitInfo := bmi;
//CopyMemory(@BitInfo, @bmi, SizeOf(TBitmapInfo));
GetObjectW(hbmMem, SizeOf(Windows.BITMAP), @bi);
Bits := @bi.bmBits;
//CopyMemory(Bits, bi.bmBits, bmi.bmiHeader.biSizeImage);
finally
SelectObject(hdcSrc, hbmOld);
end;
finally
DeleteObject(hbmMem);
end;
end;
Выдает ахинею из пикселей с утечкой ресурсов. Вот не знаю, сколько ошибок допустил. Если не присваивать Bits к bi.bmBits, вроде без утечки. Вообще, тут многое непонятно. Тут надо выделять память и копировать указатель или можно обойтись присваиванием? Также как и BitInfo с bmi или нет? Хотелось бы знать что делает оригинальная GetDIBits.