CreateCompatibleBitmap schlägt fehl?!?!?!? Warum?



  • Hi,
    ich weiß nicht warum folgender Code nicht funktioniert. Es geht ja alles gut, nur bei CreateCompatibleBitmap kommt ein NULL raus, warum? Was mache ich falsch?

    m_hWnd = hWnd;
    	GetClientRect(hWnd, &(m_rcScreenRect));
    	m_hdcFront = GetDC(m_hWnd);
    	if(m_hdcFront == NULL)
    	{
    		return false;
    	}
    
    	m_hdcBack = CreateCompatibleDC(m_hdcFront);
    	if(m_hdcBack == NULL)
    	{
    		Free();
    		return false;
    	}
    	m_hdcBitmap = CreateCompatibleDC(m_hdcFront);
    	if(m_hdcBitmap == NULL)
    	{
    		Free();
    		return false;
    	}
    	m_hCompBitmap = CreateCompatibleBitmap(m_hdcBitmap,m_rcScreenRect.right, m_rcScreenRect.bottom); // Hier
    	if(m_hOldBitmap == NULL)
    	{
    		Free();
    		return false;
    	}
    	m_hOldBitmap = (HBITMAP)SelectObject(m_hdcBack, m_hCompBitmap);	
    	if(m_hOldBitmap == NULL)
    	{
    		Free();
    		return false;
    	}
    

    Ich hoffe ihr könnt mir helfen



  • Probier da auch mal m_hdcFront zu verwenden.



  • Nein, es geht leider immer noch nicht, auch m_hdcBack bringt einen Fehler.



  • Was heisst, es schlägt fehl?
    Liegt es vielleicht einfach daran, dass in deinem if, was falsches überprüft wird?

    m_hCompBitmap = CreateCompatibleBitmap(m_hdcBitmap,m_rcScreenRect.right, m_rcScreenRect.bottom); // Hier
        if(m_hOldBitmap == NULL)
        {
            Free();
            return false;
        }
    

    Sollte hier nicht stehen:

    if(m_hCompBitmap == NULL)
    

    ?



  • ok, dummer fehler 🙄 , er beendet das programm nicht mehr aber er blittet auch nicht, ich schätze das liegt an der Flip Funktion:

    bool CBuffer::Blt(CBitmap Bitmap, int iX, int iY)
    {
    	bool bReturn;
    	HBITMAP hOldBitmap = (HBITMAP) SelectObject(m_hdcBitmap, Bitmap.GetBitmap());
    	bReturn = BitBlt(m_hdcBack, iX, iY, m_rcScreenRect.right,m_rcScreenRect.bottom,  m_hdcBitmap, 0, 0, SRCCOPY) != 0 ? true : false; //Muss das anders rum?
    	SelectObject(m_hdcBitmap, hOldBitmap);
    	return bReturn;
    }
    

    Aufruf:

    if(Buffer.Flip() == false) break;
    

    danke im vorraus



  • erstens sehe ich hier nirgendwo eine flipfunktion.
    zweitens: wieso mixt du MFC und WinAPI so grausam?
    drittens: was soll

    Bitmap.GetBitmap()
    

    ? Hast du dir in der MSDN schonmal angeschaut, was GetBitmap für eine Funktion ist ?!



  • CBitmap ist eine eigene Klasse, GetBitmap() gibt ein Handle auf das Bitmap(HBITMAP) zurück. In CBuffer ist eine Funktion die heißt Flip und kopiert den Backbuffer auf den Frontbuffer.



  • aha



  • Wieso übergibst du bei BitBlt Screen-Koordinaten? Und wo rufst du den ganzen Code (bes. CBuffer::Blt) auf? Sind dort die ganzen Variablen gültig?



  • Och man heute bin ich durcheinander 🙄 ... so nochmal:

    Funktion Flip:

    bool CBuffer::Flip()
    {
    // Debugger sagt das hdcFront,hdcBack und hdcBitmap, Werte ungleich null haben und somit korrekt initalisiert wurden
    	if(BitBlt(m_hdcFront, m_rcScreenRect.left, m_rcScreenRect.top,m_rcScreenRect.right, m_rcScreenRect.bottom, m_hdcBack, 0, 0, SRCCOPY) != 0)
    	{
    		return true;
    	}
    	else
    	{
    // Hier sind hdcFront und hdcBack... auch noch korrekte Werte
    		return false;
    	}
    }
    

    Und hier Aufruf:

    if(AnimateNextFrame(FRAME_RATE))
    			{
    				//ClearScreen(g_Buffer.hdcBack,g_Buffer.scrnRect,BLACK_BRUSH);
    				Box.CheckKeys(bKeys);
    				Box.Blt(Buffer,&Font);
    				if(iSpielZustand == SP_GAME)
    				{
    					if(!Map.CheckTeleports(&Player))
    					{
    					Map.Blt(&Buffer,Cam);
    
    					Player.Blt(Buffer,&Map,&Cam);
    					Player.CheckKeys(bKeys);
    
    					char strTemp[1024];
    					sprintf(strTemp,"%d,%d  %d,%d",(Player.GetX()+8)/16,(Player.GetY()+27)/16,Player.GetX()+8,Player.GetY()+27);
    					Buffer.TextBlt(strTemp,0,0,RGB(255,255,255));
    					//TextOut(g_Buffer.hdcBack,0,0,strTemp,strlen(strTemp));
    					}
    				}
    				else if(iSpielZustand == SP_INTRO)
    				{
    
    					Buffer.Blt(&Intro,200,150);
    					if(bKeys[VK_SPACE]) iSpielZustand = SP_GAME;
    				}
    
    				if(Buffer.Flip() == false) break;
    							}
    

    ...*nochmal debug*...
    hmm, warum sind die hBitmaps leer?
    Ist dieser Code richtig?

    m_hBitmap = (HBITMAP)LoadImage(NULL,strFileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
    




  • Dankeschö, jetzt haben die Bitmaps wieder einen Wert, 😃 doch das Flippen geht immer noch nicht 😞



  • und was sagt GetLastError() dazu?



  • GetLastError sagt bei mir 87, ich weiß leider nicht was für ein Fehler das ist. ich hab mal gehört das Getlasterror nur bei Win NT oder höher geht



  • MSDN sagt:

    87 | The parameter is incorrect. | ERROR_INVALID_PARAMETER
    

    Häh???



  • Wo hast du GetLastError aufgerufen?



  • int i = 0;
    i = GetLastError();
    	DeInit();// Hier beträgt i = 87
    	UnregisterClass(WINDOWCLASS,hInstance);
    	return msg.wParam ;										
    }
    


  • MBytey schrieb:

    int i = 0;
    i = GetLastError();
    	DeInit();// Hier beträgt i = 87
    	UnregisterClass(WINDOWCLASS,hInstance);
    	return msg.wParam ;										
    }
    

    und was steht drüber 😃


Anmelden zum Antworten