Richtiges Resetten eines DC, nachdem man ein Bild und eine Schrift hineingewählt hat
-
Wenn man einen Device Context hat und dort ein Bild reinwählt, soll man ja den alten Zustand speichern und den DC am Ende zurücksetzen:
//DC Erstellen: ... //Bild hineinwählen und alten Zustand speichern: HBITMAP oldBitmap=static_cast<HBITMAP> (SelectObject (dc, bitmap)); //Irgendwas machen: ... //Originalzustand wiederherstellen: SelectObject (dc, oldBitmap); //DC löschen: ...Nun ist es bei mir so, daß ich zwei Dinge in den DC hineinwähle: Zuerst ein Bild und dann eine Schrift (HFONT), um auf das Bild mit bestimmter Formatierung zu schreiben. Das ganze sieht momentan so aus (bitmap und font sind zwei bereits vorhandene Variablen, die mit CreateCompatibleBitmap bzw. mit CreateFont erstellt wurden):
HDC windowDC=GetDC (NULL); //Erstellen des DCs HDC dc=CreateCompatibleDC (windowDC); //Hineinwählen des Bildes HBITMAP oldBitmap=static_cast<HBITMAP> (SelectObject (dc, bitmap)); //Hineinwählen der Schrift SelectObject (dc, font); //Der Text wird auf das Bild bitmap mit der Schrift font geschrieben TextOut (dc, 0, 0, text, strlen (text)); //Herstellen des Originalzustandes des DCs SelectObject (dc, oldBitmap); //Löschen des DCs DeleteDC (dc); ReleaseDC (NULL, windowDC);Ich würde jetzt gern wissen: Ist das so richtig? Oder muß ich auch noch ein oldFont abfangen, das ich dann zwischen TextOut und dem letzten SelectObject setze? Ist es überhaupt gut, zwei Dinge gleichzeitig in den DC zu laden (Bild und Schrift)? Bitte klärt mich auf.
-
Ich hab deinen code mal so erweitert, wie ich es mache. Hat bisher immer geklappt
//DC Erstellen HDC hDC; //... //Bild hineinwählen und alten Zustand speichern: HBITMAP oldBitmap=static_cast<HBITMAP> (SelectObject (hDC, bitmap)); //auch für Font HFONT hOldFont = (HFONT)SelectObject(hDC, CreateFont(...)); //Irgendwas machen: ... //Originalzustand wiederherstellen: DeleteObject(SelectObject(hDC, oldBitmap)); DeleteObject(SelectObject(hDC, hOldFont)); //DC löschen: ...edit: achja, ich prog nur in C, also was du da mit deinem "static_cast<HBITMAP>" machst - k.a. da musste selber wissen ob das passt :p
-
NES-Spieler schrieb:
Ich würde jetzt gern wissen: Ist das so richtig? Oder muß ich auch noch ein oldFont abfangen, das ich dann zwischen TextOut und dem letzten SelectObject setze? Ist es überhaupt gut, zwei Dinge gleichzeitig in den DC zu laden (Bild und Schrift)? Bitte klärt mich auf.
Also du kannst das schon so machen, da fehlt nur noch was, hab dir den Code mal korrigiert
:HDC windowDC=GetDC (NULL); //Erstellen des DCs HDC dc=CreateCompatibleDC (windowDC); // Hineinwählen des Bildes HBITMAP oldBitmap = reinterpret_cast<HBITMAP> (SelectObject (dc, bitmap)); // Hineinwählen der Schrift HFONT hfPrevFont = reinterpret_cast<HFONT>(SelectObject(dc, font)); //Der Text wird auf das Bild bitmap mit der Schrift font geschrieben TextOut (dc, 0, 0, text, strlen (text)); //Herstellen des Originalzustandes des DCs SelectObject(dc, oldBitmap); // /!\ Wie ist es mit DeleteObject(bitmap); bzw. DeleteObject(SelectObject(dc, oldBitmap)); ?! ...Weiß ja nicht wie du die verwendest... SelectObject(dc, hfPrevFont); // /!\ Wie ist es mit DeleteObject(font); bzw. DeleteObject(SelectObject(dc, hfPrevFont)); ?! ...Weiß ja nicht wie du die verwendest... // /!\ BTW: Fehlt da nicht noch ein blitting auf den WindowDC o.ä. -> wofür legst du dann windowDC an ? //Löschen des DCs DeleteDC (dc); ReleaseDC (NULL, windowDC);Siehe dazu auch:
Infos zu SelectObject(...) schrieb:
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.
-
Vielen Dank für die Antworten. Man kann also mehrere verschiedenartige GDI-Objekte gleichzeitig in einen DC packen, muß aber vor dem Löschen auch jedes einzelne dieser Objekte (und nicht nur das erste) wieder zurücksetzen. O.k., dann mach ich das so.
Wie ist es mit DeleteObject(bitmap); bzw. DeleteObject(SelectObject(dc, oldBitmap)); ?! ...Weiß ja nicht wie du die verwendest...
Die Bitmap-Variable kannst Du Dir als Parameter denken. Die wird noch gebraucht, deshalb wurde sie dort nicht gelöscht. (Das passiert später.) Aber die Schrift mußte wirklich noch gelöscht werden, stimmt.
BTW: Fehlt da nicht noch ein blitting auf den WindowDC o.ä. -> wofür legst du dann windowDC an ?
Ich habe den Code soweit runtergebrochen, daß nur das wesentliche dort steht. Es ging mir ja nur darum, wie man den DC initialisiert und wieder ordentlich resettet. Deshalb hier kein Blitvorgang.
Der Window-DC (welcher in diesem Fall ja ohnehin direkt auf den Desktop zeichnen würde) wird gebraucht, damit der eigentliche DC mit der Funktion CreateCompatibleDC erstellt werden kann.P.S.: An jule37:
HBITMAP oldBitmap=static_cast<HBITMAP> (SelectObject (dc, bitmap));ist die C++-Schreibweise für
HBITMAP oldBitmap=(HBITMAP) SelectObject (dc, bitmap);
-
NES-Spieler schrieb:
Der Window-DC (welcher in diesem Fall ja ohnehin direkt auf den Desktop zeichnen würde) wird gebraucht, damit der eigentliche DC mit der Funktion CreateCompatibleDC erstellt werden kann.
Nimm einfach:
HDC hdcMem = CreateCompatibleDC(NULL)Denn

[...]
HDC CreateCompatibleDC(
HDC hdc // handle to the device context
);
[...]
hdc:
Handle to an existing device context. If this handle is NULL, the function creates
a memory device context compatible with the application's current screen.
[...]
-
Warum geht das bei CreateCompatibleDC, aber nicht bei CreateCompatibleBitmap?
-
NES-Spieler schrieb:
Warum geht das bei CreateCompatibleDC, aber nicht bei CreateCompatibleBitmap?
lol, ich hab die Funktionen ja nicht geschrieben...da wirst du dich wohl an M§ wenden müssen...glaub die waren einfach inkonsequent
.