<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Richtiges Resetten eines DC, nachdem man ein Bild und eine Schrift hineingewählt hat]]></title><description><![CDATA[<p>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:</p>
<pre><code class="language-cpp">//DC Erstellen: ...

//Bild hineinwählen und alten Zustand speichern:
HBITMAP oldBitmap=static_cast&lt;HBITMAP&gt; (SelectObject (dc, bitmap));

//Irgendwas machen: ...

//Originalzustand wiederherstellen:
SelectObject (dc, oldBitmap);

//DC löschen: ...
</code></pre>
<p>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):</p>
<pre><code class="language-cpp">HDC windowDC=GetDC (NULL);

//Erstellen des DCs
HDC dc=CreateCompatibleDC (windowDC);

//Hineinwählen des Bildes
HBITMAP oldBitmap=static_cast&lt;HBITMAP&gt; (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);
</code></pre>
<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/157443/richtiges-resetten-eines-dc-nachdem-man-ein-bild-und-eine-schrift-hineingewählt-hat</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 16:20:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/157443.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Aug 2006 17:20:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Richtiges Resetten eines DC, nachdem man ein Bild und eine Schrift hineingewählt hat on Fri, 25 Aug 2006 17:20:08 GMT]]></title><description><![CDATA[<p>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:</p>
<pre><code class="language-cpp">//DC Erstellen: ...

//Bild hineinwählen und alten Zustand speichern:
HBITMAP oldBitmap=static_cast&lt;HBITMAP&gt; (SelectObject (dc, bitmap));

//Irgendwas machen: ...

//Originalzustand wiederherstellen:
SelectObject (dc, oldBitmap);

//DC löschen: ...
</code></pre>
<p>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):</p>
<pre><code class="language-cpp">HDC windowDC=GetDC (NULL);

//Erstellen des DCs
HDC dc=CreateCompatibleDC (windowDC);

//Hineinwählen des Bildes
HBITMAP oldBitmap=static_cast&lt;HBITMAP&gt; (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);
</code></pre>
<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1124618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124618</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Fri, 25 Aug 2006 17:20:08 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiges Resetten eines DC, nachdem man ein Bild und eine Schrift hineingewählt hat on Fri, 25 Aug 2006 18:41:03 GMT]]></title><description><![CDATA[<p>Ich hab deinen code mal so erweitert, wie ich es mache. Hat bisher immer geklappt</p>
<pre><code class="language-cpp">//DC Erstellen
HDC hDC;

//...

//Bild hineinwählen und alten Zustand speichern:
HBITMAP oldBitmap=static_cast&lt;HBITMAP&gt; (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: ...
</code></pre>
<p>edit: achja, ich prog nur in C, also was du da mit deinem &quot;static_cast&lt;HBITMAP&gt;&quot; machst - k.a. da musste selber wissen ob das passt :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1124659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124659</guid><dc:creator><![CDATA[jule37]]></dc:creator><pubDate>Fri, 25 Aug 2006 18:41:03 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiges Resetten eines DC, nachdem man ein Bild und eine Schrift hineingewählt hat on Fri, 25 Aug 2006 18:46:46 GMT]]></title><description><![CDATA[<p>NES-Spieler schrieb:</p>
<blockquote>
<p>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.</p>
</blockquote>
<p>Also du kannst das schon so machen, da fehlt nur noch was, hab dir den Code mal korrigiert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> :</p>
<pre><code class="language-cpp">HDC windowDC=GetDC (NULL);

//Erstellen des DCs
HDC dc=CreateCompatibleDC (windowDC);

// Hineinwählen des Bildes
HBITMAP oldBitmap = reinterpret_cast&lt;HBITMAP&gt; (SelectObject (dc, bitmap));

// Hineinwählen der Schrift
HFONT hfPrevFont = reinterpret_cast&lt;HFONT&gt;(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.ä. -&gt; wofür legst du dann windowDC an ?

//Löschen des DCs
DeleteDC (dc);

ReleaseDC (NULL, windowDC);
</code></pre>
<p>Siehe dazu auch:</p>
<p>Infos zu SelectObject(...) schrieb:</p>
<blockquote>
<p>This function returns the previously selected object of the specified type.<br />
An application should always replace a new object with the original, default<br />
object after it has finished drawing with the new object.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1124663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124663</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Fri, 25 Aug 2006 18:46:46 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiges Resetten eines DC, nachdem man ein Bild und eine Schrift hineingewählt hat on Fri, 25 Aug 2006 19:24:56 GMT]]></title><description><![CDATA[<p>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.</p>
<blockquote>
<p>Wie ist es mit DeleteObject(bitmap); bzw. DeleteObject(SelectObject(dc, oldBitmap)); ?! ...Weiß ja nicht wie du die verwendest...</p>
</blockquote>
<p>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.</p>
<blockquote>
<p>BTW: Fehlt da nicht noch ein blitting auf den WindowDC o.ä. -&gt; wofür legst du dann windowDC an ?</p>
</blockquote>
<p>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.<br />
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>
<p>P.S.: An jule37:</p>
<pre><code class="language-cpp">HBITMAP oldBitmap=static_cast&lt;HBITMAP&gt; (SelectObject (dc, bitmap));
</code></pre>
<p>ist die C++-Schreibweise für</p>
<pre><code class="language-cpp">HBITMAP oldBitmap=(HBITMAP) SelectObject (dc, bitmap);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1124681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124681</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Fri, 25 Aug 2006 19:24:56 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiges Resetten eines DC, nachdem man ein Bild und eine Schrift hineingewählt hat on Fri, 25 Aug 2006 20:00:38 GMT]]></title><description><![CDATA[<p>NES-Spieler schrieb:</p>
<blockquote>
<p>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>
</blockquote>
<p>Nimm einfach:</p>
<pre><code class="language-cpp">HDC hdcMem = CreateCompatibleDC(NULL)
</code></pre>
<p>Denn <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<blockquote>
<p>[...]<br />
HDC CreateCompatibleDC(<br />
HDC hdc // handle to the device context<br />
);<br />
[...]<br />
hdc:<br />
Handle to an existing device context. <strong>If this handle is NULL, the function creates<br />
a memory device context compatible with the application's current screen</strong>.<br />
[...]</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1124698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124698</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Fri, 25 Aug 2006 20:00:38 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiges Resetten eines DC, nachdem man ein Bild und eine Schrift hineingewählt hat on Fri, 25 Aug 2006 20:16:39 GMT]]></title><description><![CDATA[<p>Warum geht das bei CreateCompatibleDC, aber nicht bei CreateCompatibleBitmap?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1124705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124705</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Fri, 25 Aug 2006 20:16:39 GMT</pubDate></item><item><title><![CDATA[Reply to Richtiges Resetten eines DC, nachdem man ein Bild und eine Schrift hineingewählt hat on Fri, 25 Aug 2006 21:11:19 GMT]]></title><description><![CDATA[<p>NES-Spieler schrieb:</p>
<blockquote>
<p>Warum geht das bei CreateCompatibleDC, aber nicht bei CreateCompatibleBitmap?</p>
</blockquote>
<p>lol, ich hab die Funktionen ja nicht geschrieben...da wirst du dich wohl an M§ wenden müssen...glaub die waren einfach inkonsequent <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1124726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124726</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Fri, 25 Aug 2006 21:11:19 GMT</pubDate></item></channel></rss>