Problem beim Anzeigen von Bild
-
Hallo,
irgendwie funktioniert bei mir die Blt Funktion nicht( oder bei meiner BMP_in_Surface Funktion stimmt etwas nicht). Wenn ich blitten will bleibt der Bildschirm einfach weiß. Hier ist mal der Code:// Clip_Rect initialisieren RECT Clip_rect Clip_Rect.top = 0; Clip_Rect.left = 0; Clip_Rect.right = SCREEN_BREITE; Clip_Rect.bottom = SCREEN_HOEHE; // Offscreen Surface erzeugen if(!CreateOffscreenSurface(&lpStartScreen)) { MessageBox(hwnd,"Bang","Fehler bei CreateOffscreen",MB_ICONEXCLAMATION); // BMP_in_Surface aufrufen if(!BMP_in_Surface("Startscreen.bmp",lpStartScreen, true)) { MessageBox(hwnd,"Bang","fehler bei Lade BMP!!",MB_ICONEXCLAMATION); } // Blit aufrufen lpDDSBack->Blt(&Clip_Rect,lpStartScreen,&Clip_Rect,DDBLT_WAIT | DDBLT_KEYSRC, NULL); // Funktion BMP_in_Surface bool BMP_in_Surface(LPCSTR BMP_datei,LPDIRECTDRAWSURFACE7 lpDDSurf,bool Palette_laden) { LPBYTE lpbyBild; HANDLE hDatei; BITMAPFILEHEADER BMPFileHead; BITMAPINFOHEADER BMPFileInfo; RGBQUAD Palette[256]; DWORD dwLeseSpeicher; DDSURFACEDESC2 ddsd; LPSTR lpZielRAM; LPSTR lpQuellRAM; int DDS_Breite; int DDS_Hoehe; ZeroMemory(&ddsd,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); lpDDSurf->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL); DDS_Breite = ddsd.dwWidth; DDS_Hoehe = ddsd.dwHeight; if(!(lpbyBild=(LPBYTE)malloc(DDS_Breite*DDS_Hoehe))) { return false; } hDatei = Oeffne_Datei(BMP_datei); if(hDatei == INVALID_HANDLE_VALUE) { return false; } if(!ReadFile(hDatei,&BMPFileHead,sizeof(BMPFileHead),&dwLeseSpeicher,NULL)) { CloseHandle(hDatei); return false; } if(!ReadFile(hDatei,&BMPFileInfo,sizeof(BMPFileInfo),&dwLeseSpeicher,NULL)) { CloseHandle(hDatei); return false; } if((BMPFileInfo.biWidth != DDS_Breite) || (BMPFileInfo.biHeight != DDS_Hoehe) || (BMPFileInfo.biBitCount != 8)) { CloseHandle(hDatei); return false; } if(!ReadFile(hDatei,Palette,sizeof(Palette),&dwLeseSpeicher,NULL)) { CloseHandle(hDatei); return false; } if(!ReadFile(hDatei,lpbyBild,DDS_Breite*DDS_Hoehe,&dwLeseSpeicher,NULL)) { CloseHandle(hDatei); return false; } CloseHandle(hDatei); lpZielRAM = (LPSTR)ddsd.lpSurface; lpQuellRAM = (LPSTR)(&lpbyBild[(DDS_Hoehe-1)*DDS_Breite]); for(int j=0; j<DDS_Hoehe; j++) { memcpy(lpZielRAM,lpQuellRAM,DDS_Breite); lpZielRAM += ddsd.lPitch; lpQuellRAM -= DDS_Breite; } lpDDSurf->Unlock(NULL); if(lpbyBild) free(lpbyBild); if(Palette_laden) { PALETTEENTRY pe[256]; HRESULT ddrval; ZeroMemory(pe,MAX_FARBEN*sizeof(PALETTEENTRY)); for(int i=0; i<MAX_FARBEN; i++) { pe[i].peRed = Palette[i].rgbRed; pe[i].peGreen = Palette[i].rgbGreen; pe[i].peBlue = Palette[i].rgbBlue; pe[i].peFlags = PC_NOCOLLAPSE; } ddrval = lpDD->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256,pe,&lpDDPal,NULL); if(ddrval != DD_OK) { MessageBox(hwnd,"Bitmap Fehler: Create Palette","Bang",MB_ICONEXCLAMATION); return false; } ddrval = lpDDSPrimary->SetPalette(lpDDPal); if(ddrval != DD_OK) { MessageBox(hwnd,"Bitmap Fehler: Set Palette","Bang",MB_ICONEXCLAMATION); return false; } } return true; } // Funktion für Offscreen erzeugen bool CreateOffscreenSurface(LPDIRECTDRAWSURFACE7 * lpDDSurface) { HRESULT ddrval; DDSURFACEDESC2 ddsd; DDSCAPS2 ddscaps; ZeroMemory(&ddsd,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; ddsd.dwHeight = SCREEN_HOEHE; ddsd.dwWidth = SCREEN_BREITE; ddrval = lpDD->CreateSurface(&ddsd,lpDDSurface,NULL); if(ddrval != DD_OK) return false; return true; }
Liegt es vielleicht am Aufruf der Funktion? Danke für eure Hilfe.
MFG Julian
-
Ich wollt nur noch hinzufügen, dass ich eher glaub das es an dem Aufruf der Funktion Blt liegt. Da ich die Funktion für das laden der Bilder von Stefan Zerbst's Buch ist und da sollte sie eigentlich schon funktionieren.
MFG Julian
-
Haste den colorkey gesetzt der nicht geblittet werden soll?
wenn nicht, könnteste den Flag "DDBLT_KEYSRC" bei der blt funktion wegmachen. Vielleicht gehts dann.
-
Hi,
danke, es geht jetzt.
MFG Julian