SetSurfaceDesc
-
Hallo,
Ich hab mittels der Hilfefunktion "LoadBitmap" vom DirectX 7 SDK eine Bitmap in eine DirectDraw-Surface geladen. Ich hab aber beim Hauptobjekt die Funktion "SetDisplayMode" nicht verwendet, und die Bit-Tiefe der Surface entspricht also der, von der Bitmap.
Ich hab jetzt also eine gefüllte Surface mit 24-Bit Bilddaten und ich möchte diese Bilddaten gerne in 16-Bit haben. Im SDK hab ich was davon gelesen, das man dies durch die Funktion "SetSurfaceDesc" machen kann.
Nach ein paar Stunden bin ich also zu folgendem Code gekommen, welcher in der Funktion "SetSurfaceDesc" abstürzt, weil weder "testwindow1" noch "testwindow2" angezeigt wird.DDSURFACEDESC2 ddsdOld; // Alte Surface-Beschreibung DDSURFACEDESC2 ddsdNew; // Neue Surface-Beschreibung mit 16-Bit-Daten HRESULT ddrval; // Alte Surface-Beschreibung laden ZeroMemory (&ddsdOld, sizeof (ddsdOld)); ddsdOld.dwSize = sizeof (ddsdOld); ddrval = lpDDSurf->GetSurfaceDesc (&ddsdOld); if (ddrval != DD_OK) { return FALSE; }; // Ändern der Daten für 16-Bit ZeroMemory (&ddsdNew, sizeof (ddsdNew)); ddsdNew.dwSize = sizeof (ddsdNew); ddsdNew.dwFlags = DDSD_PITCH | DDSD_PIXELFORMAT; ddsdNew.ddpfPixelFormat = ddsdOld.ddpfPixelFormat; ddsdNew.ddpfPixelFormat.dwFlags = ddsdOld.ddpfPixelFormat.dwFlags | DDPF_RGB; ddsdNew.ddpfPixelFormat.dwRGBBitCount = 16; // Für 16 Bit ddsdNew.lPitch = ddsdOld.dwWidth*2; // 16Bit = 2 Byte = Breite * 2 // Einstellen der neuen Surface-Beschreibung ddrval = lpDDSurf->SetSurfaceDesc (&ddsdNew, 0); if (ddrval != DD_OK) { MessageBox (NULL, "testwindow 1", NULL, MB_OK); return FALSE; }; MessageBox (NULL, "testwindow 2", NULL, MB_OK);
Könnte mir bitte jemand sagen, was ich falsch mache, oder mir einen andere Möglichkeit, diese Bit-Konvertierung durchzuführen zeigen. Danke!
m.f.G. Daniel Lang