Bild auf primäre Oberfläche blitten



  • Hallo zusammen!

    Ich probiere seit Ewigkeiten ein Bild in mein Windowsfenster blitten zu können, aber irgendwie will es nicht funktionieren 😞

    Ich habe mir eine Funktion programmiert, die ein Bild in eine Oberfläche kopieren soll und anschliessend will ich diese Oberfläche in die primäre Hauptoberfläche kopieren.

    Das Bild war mal eins von Britney Spears 🙂 ich hab aber auch schon probiert ein weisses 100*100 Bild in Paint ein wenig zu bemalen und dann anzuzeigen.

    Ich hoffe jemand kann mir helfen, ich bin echt am verzweifeln. Es gibt nun den Fehler aus, dass es nicht geblittet werden konnte (also beim Blitten) aber durch debuggen komm ich nicht dahinter wo der Fehler ist.

    So rufe ich die Funktion auf und speichere sie in einer Oberfläche (Typ LPDIRECTDRAWSURFACE7):

    //sekundäre oberfläche laden
       lpDDSurface = CreateSurfaceFromBitmap("G:\\britney.bmp",100,100);
    

    So sieht die Funktion aus:

    LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPSTR File, int dWidth, int dHeight)
    {
    	//device context für das bild und die oberfläche
    	HDC hBmDC, hSurfDC;
    
    	//handle der zu ladenden bitmap
    	HBITMAP hBM;
    
    	//oberflächenbeschreibung
    	DDSURFACEDESC2 SurfDesc;
    
    	//zeiger auf die oberfläche
    	LPDIRECTDRAWSURFACE7 lpDDSurface;
    
    	//bild laden
    	hBM = (HBITMAP)LoadImage(0,File, IMAGE_BITMAP,dWidth,dHeight,LR_LOADFROMFILE);
    
    	//ist ein fehler aufgetreten?
    	if(NULL == hBM)
    	{
    		Error("Fehler 1");
    		return NULL;
    	}
    
    	//oberflächenbeschreibung initialisierne
    	ZeroMemory(&SurfDesc,sizeof(SurfDesc));
    	SurfDesc.dwSize = sizeof(SurfDesc);
    
    	//Caps höhe und breite berücksichtigen
    	SurfDesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
    
    	SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
    
    	SurfDesc.dwWidth = dWidth;
    
    	SurfDesc.dwHeight = dHeight;
    
    	//oberfläche anlegen
    	if(FAILED(lpDD7->CreateSurface(&SurfDesc,&lpDDSurface,NULL)))
    	{
    		Error("Fehler 2");
    		return NULL;
    	}
    
    	//device context von fläche holen
    	lpDDSurface->GetDC(&hSurfDC);
    
    	//kompatiblen DC für bild anlegen
    	hBmDC = CreateCompatibleDC(hSurfDC);
    
    	//bild für DC holen
    	SelectObject(hBmDC,hBM);
    
    	//bild in oberfläche kopieren
    	BitBlt(hSurfDC,0,0,dWidth,dHeight,hBmDC,0,0,SRCCOPY);
    
    	//Device Context freigeben
    	lpDDSurface->ReleaseDC(hSurfDC);
    
    	//DC und bild löschen
    	DeleteDC(hBmDC);
    	DeleteObject(hBM);
    
    	//zeiger zurückgeben
    	return lpDDSurface;
    
    }
    

    Und so will ich schlussendlich die generierte Oberfläche in die Hauptoberfläche kopieren (hier kommt der Fehler):

    if(FAILED( lpDDSPrimary->BltFast(10,10,lpDDSurface,NULL,DDBLT_WAIT) ))
    	{
    		Error("Blt ist fehlgeschlagen");
    		return;
    	}
    

    Ich muss noch sagen dass das Windowsfenster einwandfrei läuft, der Fehler liegt also beim blitten.

    Ich wäre einem Helfer zu ewigem Dank verpflichtet 🙂 👍

    Grüsse CorDharel



  • Auf http://home.arcor.de/3dkult/ kannst du dir eine DirectDraw basierende Bibliothek runterladen. In dieser wird in ein Windows-Fenster gebilttet.
    Musst dich aber durch den Code arbeiten.



  • Fehlercode anschauen wäre sicher nicht verkehrt.

    Bye, TGGC


Anmelden zum Antworten