Fehlerhafte Funktion



  • Warum funktioniert diese Funktion hier nicht, wenn ich sie in WM_PAINT aufrufe:#

    int DrawTiles(HWND hWnd)
    {
    	int x=0;
    	int y=0;
    	int i=0;
    	HDC hdc,bufferhdc;
    
    	hdc=GetDC(hWnd);
    	bufferhdc=CreateCompatibleDC(hdc);
    
    	while (y<=150&&i<=tile_number)
    	{
    		x=0;
    		while (x<=96&&i<=tile_number)
    		{
    			SelectObject (bufferhdc,hTiles[i]);
    			BitBlt (hdc,x,y,32,30,bufferhdc,0,0,SRCCOPY);
                            //hTiles besitzt gültige Werte!!!
    			x+=32;
    			i++;
    		}
    		i++;		
    		y+=30;
    	}
    	return 0;
    }
    

    Bin echt am verzweifeln...



  • Hmm,

    ich glaube, man sollte in Reaktion auf WM_PAINT nicht GetDC aufrufen, sondern stattdessen BeginPaint und EndPaint verwenden.



  • Das Problem dabei ist aber, dass ich die Funktion auch noch bei anderen Messages aufrufen will und dan kann ich ja schlecht BeginPaint und EndPaint verwenden, oder? Aber bei den andren Messages funktioniert die Funktion auch manchmal nicht richtig... Obwohl sie ja vom Grundegerüst her stimmt oder?



  • Kleine Nachfrage: Er zeigt die Tiles nicht an, oder was funzt nicht ?



  • jep... immer nur das zuletzt einbgefügte... und das allerdings an der richtigen position von x und y... Ich versuchs jetzt nochmal statt in WM_PAINT mit einer anderen Message...



  • Das Problem dabei ist aber, dass ich die Funktion auch noch bei anderen Messages aufrufen will und dan kann ich ja schlecht BeginPaint und EndPaint verwenden, oder?

    Ich kann ja nicht mehr machen, als dich darauf hinweisen, wie es in der MSDN steht.
    Deine Sache.
    Außerdem möchte ich dich noch auf die Funktionen ReleaseDC und FreeDC hinweisen.



  • Wenn du kein BeginPaint/EndPaint in der WM_PAINT drin hast, sollte zumindest nen ValidateRect() ans Ende der WM_PAINT, sonst ballert Windows dein Fenster weiter mit WM_PAINT Nachrichten zu.

    Was meinen denn die Rückgabewerte und GetLastError() ?
    Die Bitmaps in hTiles[] sind ja auch nicht noch irgendwo in einen anderen DC selektiert ?

    Das Handle von CreateCompatibleDC() solltest du wie bereits erwähnt am Ende auch wieder freigeben (mit DeleteDC)



  • verdammt, könnte tatsächlich am selektieren liegen... ohoh... 🙄
    Aber im Prinzip könnte ich mir ja auch ein HDC Array erstellen, in das ich dann die einzelnen Bitmaps reinlade, dann hab ich ja das Problem mit dem noch selektiert nicht mehr, oder?
    Also:

    HDC hdcTiles[100];
    HBITMAP hTile;
    
    hTile = LoadImage (...);
    SelectObject (hdcTiles[tiles_number],hTile);
    
    //und dann in meiner Funktion DrawTiles()
    BitBlt (hdc,....,hdcTiles[i],...);
    

Anmelden zum Antworten