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


Anmelden zum Antworten