![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите как из IDirectDrawSurface7 получить TBitmap? [D7, WinXP]
NOX © (2004-07-29 12:27:00)Подскажите пожалуйста как поверхность IDirectDrawSurface7 перевести в тип TBitmap. Пробовал через прямой
доступ к памяти по-пиксельно копировать цвета (16 бит), но получается просто белый фон почему-то. Может есть готовые средства?
Вот мой код:
var ddsd : TDDSurfaceDesc2;
hRet : HResult;
i, j, wrkColor : word;
begin
wrkBMP.Width:=32;
wrkBMP.Height:=32;
ZeroMemory(@ddsd, SizeOf(ddsd));
hRet:=ImgSurf.Lock(nil, ddsd, DDLOCK_WAIT, 0);
if Failed(hRet) then Exit;
for i:=0 to 31 do
for j:=0 to 31 do
begin
wrkColor:=PWORD( Integer(ddsd.lpSurface) + j * dsd.lPitch + i * 2 )^;
wrkBMP.Canvas.Pixels[i,j]:=RGB(wrkColor and $1f,
(wrkColor shr 5) and $3f,
(wrkColor shr 11) and $1f);
end;
ImgSurf.Unlock(nil);
Спасибо.
cyborg (2004-07-30 20:37:00) [1]
> [6] NOX (30.07.04 19:08)
Что работает чтоли? :) А-то я чего-то в своих играх скриншотосниматель не делал, сделать чтоли (мысль вслух) :)
NOX (2004-07-30 19:08:00) [2]Большое человеческое списибо, действительно забыл установить размер ddsd.dwSize.
Sapersky (2004-07-30 15:36:00) [3]У ddsd нужно размер установить:
ZeroMemory(@ddsd, SizeOf(ddsd));
ddsd.dwSize:=SizeOf(ddsd);
hRet:=ImgSurf.GetSurfaceDesc(ddsd);
Ещё, может быть, цветовой формат у битмапа, PixelFormat:=pf24bit или что-нибудь такое.
cyborg (2004-07-30 12:10:00) [4]Не знаю, не охото проверять, попробуй ImgSurf.ReleaseDC(DC); после сохранения поставить.
NOX (2004-07-30 11:52:00) [5]Вот мой код, но работает он что-то плохо, файл не создаётся.
ZeroMemory(@ddsd, SizeOf(ddsd));
hRet:=ImgSurf.GetSurfaceDesc(ddsd);
if hRet <> DD_OK then Exit;
ImgSurf.GetDC(DC);
wrkBMP.Width:=ddsd.dwWidth;
wrkBMP.Height:=ddsd.dwHeight;
BitBlt(wrkBMP.Canvas.Handle, 0, 0, ddsd.dwWidth, ddsd.dwHeight, DC, 0, 0, srccopy);
ImgSurf.ReleaseDC(DC);
wrkBMP.SaveToFile('C:\1.bmp');
cyborg (2004-07-29 20:02:00) [6]Surface.GetDC(DC)
Surface.ReleaseDC(DC);
С ними пляши
NOX (2004-07-29 19:29:00) [7]Неужели никто не знает???