Volker Racho
-
Nabend zusammen,
ich bastel gerade an nem programm, in dem ich unter anderem auch bitblt benutze. damit will ich wiederholt einen speicherkontext in ein fenster kopieren und damit so ne kleine 3D-animation machen. das klappt auch alles ne zeit land recht gut, doch ab einem gewissen punkt verschwinden auf einmal die farben (nur noch schwarz-weiss) und als nächstes fängt er an, nicht mehr in das fenster sondern auf den gesamten Bildschirm zu kopieren (also bezugspunkt ganz oben links -> hdc=0? ohne stretchen oder ähnliches). hoffe das ist irgenwie klar geworden, ist n bißchen blöd zu erklären.
ich bezweifele, dass jemand lust hat sich durch den ganzen quellcode zu wühlen, aber vlt hat jemand aufgrund der genanten symptome schon einen verdacht. vlt habe ich ja irgendwelche objekte nicht gelöscht oder ähnliches, so dass sich das nach ner zeit aufsummiert und zu problemen führt. weiss nicht mehr, woran es noch liegen könnte. hab schon alles mögliche ausprobiert.
mein fehlerquellen-favorit ist diese fkt.
void drawPattern (HDC hdc, t_coord **P, double PhiZMax, int i, int j) { POINT apt[4]; HBRUSH hb [10]; double PhiZMean = (P[i][j].PhiZ + P[i+1][j].PhiZ + P[i+1][j+1].PhiZ + P[i][j+1].PhiZ)/4; hb[0] = CreateSolidBrush (RGB (190, 0, 0)); hb[1] = CreateSolidBrush (RGB (255, 0, 0)); hb[2] = CreateSolidBrush (RGB (255, 128, 0)); hb[3] = CreateSolidBrush (RGB (255, 255, 0)); hb[4] = CreateSolidBrush (RGB (128, 255, 0)); hb[5] = CreateSolidBrush (RGB (0, 255, 0)); hb[6] = CreateSolidBrush (RGB (0, 255, 128)); hb[7] = CreateSolidBrush (RGB (0, 255, 255)); hb[8] = CreateSolidBrush (RGB (0, 128, 255)); hb[9] = CreateSolidBrush (RGB (0, 0, 255)); apt[0].x =(int)(P[i][j].x); apt[0].y =(int)(P[i][j].y); apt[1].x =(int)(P[i+1][j].x); apt[1].y =(int)(P[i+1][j].y); apt[2].x =(int)(P[i+1][j+1].x); apt[2].y =(int)(P[i+1][j+1].y); apt[3].x =(int)(P[i][j+1].x); apt[3].y =(int)(P[i][j+1].y); if ((PhiZMean <= PhiZMax) && (PhiZMean > 0.8*PhiZMax)) SelectObject (hdc, hb[0]); else if ((PhiZMean <= 0.8*PhiZMax) && (PhiZMean > 0.6*PhiZMax)) SelectObject (hdc, hb[1]); else if ((PhiZMean <= 0.6*PhiZMax) && (PhiZMean > 0.4*PhiZMax)) SelectObject (hdc, hb[2]); else if ((PhiZMean <= 0.4*PhiZMax) && (PhiZMean > 0.2*PhiZMax )) SelectObject (hdc, hb[3]); else if ((PhiZMean <= 0.2*PhiZMax) && (PhiZMean > 0)) SelectObject (hdc, hb[4]); else if ((PhiZMean <= 0) && (PhiZMean > -0.2*PhiZMax)) SelectObject (hdc, hb[5]); else if ((PhiZMean <= -0.2*PhiZMax) && (PhiZMean > -0.4*PhiZMax )) SelectObject (hdc, hb[6]); else if ((PhiZMean <= -0.4*PhiZMax) && (PhiZMean > -0.6*PhiZMax)) SelectObject (hdc, hb[7]); else if ((PhiZMean <= -0.6*PhiZMax) && (PhiZMean > -0.8*PhiZMax)) SelectObject (hdc, hb[8]); else if ((PhiZMean <= -0.8*PhiZMax) && (PhiZMean >= -PhiZMax )) SelectObject (hdc, hb[9]); Polygon (hdc, apt, 4); // for (int i=0; i++; i<10) // DeleteObject (hb[i]); }vlt sieht hier ja jemand einen fehler.
da ich das programm in einem seminar demonstrieren soll, wäre es schön wenn der fehler bis dahin verschwunden ist und ich ne gelungene präsentation zustande bringe
ich bin also für jeden tip dankbar, und poste auch gerne mehr code, falls mehr infos benötigt werden.gruß volker
-
Warum hast du DeleteObject auskommentiert?
Und zur SelectObject Funktion:
This function returns the previously selected object of the specified type. An application should always replace a new object with the original, default object after it has finished drawing with the new object.
-
DeleteObject hab ich auskommentiert, weils am fehler nix ändert. im petzold mein ich gelesen, dass man objekte in einem speicherkontext nicht löschen muss (die fkt bekommt als hdc einen speicherkontext übergeben. habs nur mal probeweise eingesetzt.
also meinst du, bei SelectObject sollte ich was in der Art machen:
oldBrush = SelectObject (hdc, newBrush); ... zeichnen ... SelectObject (hdc, oldBrush);meinst du denn, dass das zu dem beschriebenen fehler führen kann?
-
in obiger form ändert es nix an dem fehler
-
Du musst vor dem Löschen der Brushes in jedem Fall das alte Objekt wieder selektieren!
Der Code so wie er gepostet ist erzeugt undendlich viele Brushes! Selbst Wenn Du das Löschen einbaust, wird der selektierte Brush nicht gelöscht, da er nicht aus dem DC entfernt wurde.
Der Effekt ist nur zu erklärlich.