Witam!
Zacząłem ostatnio bawić się nieco DD i wyszystko bylo ok, dopóki nie spróbowałem wczytac bitmapy do IDirectDrawSurface4. Niby bitmapa laduje się do pamięci, potem przepisuje się do obiektu IDirectDrawSurface4, ale jak próbuje narysować tą powierzchnie na buforze to ciągle mam DDERR_SURFACEBUSY. Wszytsko robie tak jak jest w kursie (tyle że przerabiam kod z C). Jeśli ktoś wie co moge robić źle niech poratuje!
hError przechwytuje błędy DD. Kod obslugi błędów wywaliłem, żeby nie zaśmiecać.
procedure LoadBmpToDDS(const BMPFileName : PAnsiChar; out lpDDS : IDIRECTDRAWSURFACE4);
var
ddsd : TDDSURFACEDESC2;
bitmapa : HBITMAP;
bmpS : BITMAP;
pomoc : HDC;
hdcc : HDC;
begin
lpDDS := nil;
bitmapa := LoadImage(0, BMPFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
pomoc := CreateCompatibleDC(0);
SelectObject(pomoc, bitmapa);
ZeroMemory(@ddsd, SizeOf(ddsd));
ddsd.dwSize := SizeOf(ddsd);
ddsd.dwFlags := DDSD_CAPS or DDSD_WIDTH or DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN or DDSCAPS_SYSTEMMEMORY;
GetObject(bitmapa, SizeOf(bmpS), @bmpS);
ddsd.dwWidth := bmpS.bmWidth;
ddsd.dwHeight := bmpS.bmHeight;
hError := lpDD4.CreateSurface(ddsd, lpDDS, nil);
hError := lpDDS.GetDC(hdcc);
BitBlt(hdcc, 0, 0, bmpS.bmWidth, bmpS.bmHeight, pomoc, 0, 0, SRCCOPY);
hError := lpDDS.ReleaseDC(hdcc);
DeleteDC(pomoc);
DeleteDC(hdcc);
DeleteObject(bitmapa);
end;
I rysowanie na buforze
lpDDSBufor.Blt(0, 0, lpDDSbmp, nil, DDBLTFAST_WAIT);