Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Bilder zeichnen schlägt sporadisch fehl

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.04.2009, 16:58 Uhr
öni



Hallo,

ich versuche zur Zeit ein BlackJack in C zu implementieren und habe Probleme mit der Kartenanzeige. Manchmal werden meine Karten einfach nicht angezeigt, was ich mir allerdings nicht erklären kann, da der Fehler sehr sporadisch auftritt, die Chance steht zur zeit fast 50:50. Ich habe das ganze schon gedebuggt, er läuft durch die Funktion allerdings zeigt er kein Bild an, was mir allerdings nicht sehr viel weiterhilft

Hier sollten die Bilder angezeigt werden

C++:
                     BeginPaint (hWnd, &ps) ;
                     hdcMem = CreateCompatibleDC (hdc) ;
                     SelectObject (hdcMem, Karte[zufall]) ;
                     BitBlt (hdc, x, 400 , karte[zufall].bmWidth,  karte[zufall].bmHeight, hdcMem, 0, 0, SRCCOPY);



Hier werden die Bilder vorgeladen das sie später nur noch angezeigt werden müssen.

C++:
for( k=1,j=0; k<14; k++) //bilder sind wie folgt benannt, 11,12,13,14,21,22,23,24,31,32......
                for ( i=1; i<5; i++,j++ )                
                {
                    
                    //Pfad wird wieder geleert
                    sprintf(pfad, "\0");

                    strcpy (pfad,"C:\\Dokumente und Einstellungen\\meinOrdner\\Eigene Dateien\\Visual Studio 2008\\Projects\\BlackJack\\karten\\");
                    
                                                        
                    sprintf(&text, "%d%d.bmp", k,i);                    
                    
                    *pfad = strcat (pfad, text);
                    pfad[0] = 'C';    

                    Karte[j] = (HBITMAP)LoadImage(0,pfad,IMAGE_BITMAP, 75, 100,          LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_CREATEDIBSECTION);
                    
                    if(Karte[j]==NULL)
                        {
                            sprintf(text,"Das Bild ");
                            *text = strcat(text, pfad);
                            *text = strcat (text, "konnte nicht geladen werden");
                            MessageBox(hWnd,pfad,"Error",0);
                        }
                
                    GetObject (Karte[j], sizeof (BITMAP), &karte[j]) ;
                }

Dieser Post wurde am 11.04.2009 um 16:59 Uhr von öni editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.04.2009, 12:52 Uhr
TOSHMAX



Hi,

es gibt mehrere Möglichkeiten warum das nicht geht.
Vielleicht gibst du hdcMem nicht wieder frei.

Aber genau sagen was da nicht stimmt kann ich so nicht, da müsstest du den gesamten Ausschnitt der Bild-Darstellung posten.

Gruß
TOSHMAX
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.04.2009, 20:06 Uhr
öni



Danke mal für den Tipp aber, wann muss ich den die Funktionen

DeleteDC(hdcMem);
EndPaint(hWnd, &ps);

anwenden?
Ich hab versucht überall wo ich StartPaint aufruf auch wieder EndPaint aufzurufen, dann zeichnete er allerdings gar nichts mehr, und wenn ich es ganz weglasse ich es wieder so wie am Anfang, eben 50:50 Chance ob es nun gezeichnet wird.

Bei DeleteDC bin ich mir ganz im Unklaren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.04.2009, 09:08 Uhr
TOSHMAX



EndPaint ruft man nur auf, nachdem man sich einen DC mit BeginPaint geholt hat.
DeleteDC benutzt man bei fast allen anderen DCs, wobei auch noch ausnahmen gibt wie z.B GetDC, wo man ReleaseDC nehmen muss.

Dein Code könnte also so aussehen:

C++:
//DC holen um in ihn zu zeichnen
PAINTSTRUCT ps;
HDC hDC = BeginPaint(hWnd, &ps);

//Bitmap Darstellung vorbereiten
HDC hDCMem = CreateCompatibleDC(hDC);
SelectObject(hDCMem, Karte[zufall]);

//Bitmap aus hDCMem in hDC kopieren
BitBlt(hDC, x, 400 , karte[zufall].bmWidth,  karte[zufall].bmHeight, hDCMem, 0, 0, SRCCOPY);

//hDCMem freigeben und das Zeichnen beenden
DeleteDC(hDCMem);
EndPaint(hWnd, &ps);



Weglassen der DeleteDC und EndPaint ist genauso schlimm, wie wenn du dir Speicher mit new holst und ihn nicht wieder freigibst.

Dass er es manchmal zeichnet und das andere Mal wieder nicht liegt wahrscheinlich daran, dass BeginPaint einen DC zurückgibt bei dem du nur in die Update Region zeichnen kannst. D. h. es wird nur das dargestellt, was neu gezeichnet werden soll.

In der MSDN kannst du dir alle Funktionen die mit Device Contexten zu tun haben genauer anschauen.

Gruß
TOSHMAX

Dieser Post wurde am 14.04.2009 um 09:10 Uhr von TOSHMAX editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: