OffScreen Grafik

Thomasio

Erfahrenes Mitglied
Ich habe ein Fenster, mit 3 Dutzend Child´s, von denen gut die Hälfte nur beim Programmstart einmal gezeichnet werden müssen, danach ändern sie sich nicht mehr, weder Position noch Inhalt.
Also hatte ich die dumme Idee, ich baue mir bei Programmstart eine statische OffScreenDC, berechne den Inhalt der unveränderlichen Fenster, BitBlt alles in die OffScreenDC und kann mir die Hälfte der Fenster von Haus aus sparen, weil die damit Bestandteil vom Hintergrund des MainWindow werden.

Im WM_PAINT BitBlt ich dann von der OffScreenDC nach hdc und alles erscheint perfekt.

Code:
if(!OffScreenDC)
  {
      OffScreenDC = CreateCompatibleDC(hdc);
      OffScreenBitmap = CreateCompatibleBitmap(hdc, 640, 480);

      BITMAP bm;
      // usw.
  }

BitBlt(hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom,
       OffScreenDC, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY);

Dummerweise ist das in der Praxis nicht ganz so perfekt wie es klingt, zumindest nicht unter XP.
Während unter Vista alles ohne Probleme läuft, vergisst er unter XP nach einer Weile den Inhalt der OffScreenDC, sprich es gibt keinen Error, BitBlt wird nach wie vor ausgeführt, nur ist die OffScreenDC leer und alles was da vorher drin war wird transparent, im Schnitt nach ca 10 Minuten.

Wie kann es sein, dass der Fehler NUR unter XP auftritt, auch reproduzierbar, man muss nur ne Weile warten, aber unter Vista sauber läuft, am Code kanns kaum liegen, sonst würde es auch unter Vista nicht gehen.
 
Das klingt nach einem Resourcenproblem, d.h. irgendwo gibst du irgend etwas nicht sauber frei.

Zeig mal den ganzen Darstellungscode.
 
Is auch keine gute Idee, die du da hattest :D Beim Resizen, Verschieben usw. wirst de neu zeichnen müssen.

Kannst den Inhalt des DCs aber einfach einmal Zeichnen und dann einfach nur noch reinblitten ...
 
Den ganzen Code wäre heftig, das sind gut 1000 Zeilen, wo ich berechne, was angezeigt wird.
Das ist auch der Grund, warum ich es nur einmal berechnen will und nicht bei jedem WM_PAINT
Einmal berechnet ändert es sich nicht mehr, WM_SIZE gibt es nicht, nur bei minimize, restore und ähnlichem muss ich das Ganze so wie es ist neu zeichnen.
Darum die Idee, wenn ich das in die OffScreenDC packe, kann ich die ganze Berechnung ab dem zweiten WM_PAINT weg lassen und brauche nur noch BitBlt.

Mir wäre schon geholfen, zu wissen, dass XP den Inhalt der statischen HDC nicht irgendwann vergessen kann.
Fehlersuche im Code schaffe ich dann schon.
Mir fällt halt nur heftig auf, dass es unter Vista stundenlang problemlos läuft und unter XP gerade mal 10 Minuten.
Also habe ich mal vermutet, dass XP da irgendein Timeout Limit hat, wie lange eine HBITMAP und/oder HDC im Speicher bleibt, während Vista das unbegrenzt behält.

Nicht sauber freigeben halte ich fast für ausgeschlossen, weil ich die OffScreenDC ganz absichtlich gar nicht wieder frei gebe, ich will sie ja behalten.
Die wird zu Anfang einmal definiert und gezeichnet und dann nur noch als SourceDC fürs BitBlt verwendet.

Wie auch immer, wenn ihr mir sagt, dass das eigentlich gehen müsste, sprich meine Grundidee funktioniert, dann kann ich beruhigt den Fehler im Code suchen.
Im Moment zweifele ich halt daran, ob der Fehler nicht vielleicht grundsätzlicher Natur ist und meine Fehlersuche demnach sinnlos.
 
Nja mal doch einfach mal aufn HDC, blitte den auf ne Bitmap und kopier die einfach später rein .. sollte auf jedenfall gehen ;)
 
Nachdem ich mal beruhigt war, weil es ja eigentlich gehen müsste, habe ich mal anderweitig zu suchen angefangen.
Fündig geworden bin ich auch, aber an völlig anderer Stelle als erwartet.
Ich hatte vor kurzem irgendwo ein windiges Stück Freeware runtergeladen, dieses hat ein GDI Leak, und das verursacht dann den Fehler in meiner Anwendung.
Mache ich das Ding zu, läuft mein Programm völlig ohne Probleme.

Ich wüsste zu gerne, wie ein anderes Programm die Grafik von Meinem zerschiessen kann (und das auch nur unter XP), aber nachdem das eh ein Stück Müll war, habe ich es gelöscht und Ruhe.

Auf jeden Fall danke für eure Mühe.
 
Zurück