<?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[Wem gehört das Handle? (SelectObject)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage, die aus der MSDN nicht eindeutig hervorgeht. Und zwar, wird in Zeile 2 das brush-Handle an das device übergeben. Wem gehört da das Handle? Immer noch mir und es wird eine Kopie erstellt, oder wird es nicht mehr von mir verwaltet; d. h. es wird von Windows bzw. dem dispose von device automatisch mit gelöscht? Wenn das Handle nach SelectObject nicht mehr mir gehört, darf ich Zeile 8 nicht mehr aufrufen, weil es sonst irgendwann crashen könnte?</p>
<p>Fragen über Fragen...</p>
<p>MfG</p>
<p>Christian</p>
<pre><code>brush=CreateSolidBrush(rgb);
oldbrush=(HBRUSH)SelectObject(device,brush);

RoundRect(device,hmrect-&gt;left,hmrect-&gt;top,hmrect-&gt;right,hmrect-&gt;bottom,roundingH,roundingV);

SelectObject(device,oldbrush);
DeleteObject(brush);
DeleteObject(oldbrush);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/171048/wem-gehört-das-handle-selectobject</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 04:25:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/171048.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Jan 2007 08:50:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wem gehört das Handle? (SelectObject) on Mon, 22 Jan 2007 08:50:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage, die aus der MSDN nicht eindeutig hervorgeht. Und zwar, wird in Zeile 2 das brush-Handle an das device übergeben. Wem gehört da das Handle? Immer noch mir und es wird eine Kopie erstellt, oder wird es nicht mehr von mir verwaltet; d. h. es wird von Windows bzw. dem dispose von device automatisch mit gelöscht? Wenn das Handle nach SelectObject nicht mehr mir gehört, darf ich Zeile 8 nicht mehr aufrufen, weil es sonst irgendwann crashen könnte?</p>
<p>Fragen über Fragen...</p>
<p>MfG</p>
<p>Christian</p>
<pre><code>brush=CreateSolidBrush(rgb);
oldbrush=(HBRUSH)SelectObject(device,brush);

RoundRect(device,hmrect-&gt;left,hmrect-&gt;top,hmrect-&gt;right,hmrect-&gt;bottom,roundingH,roundingV);

SelectObject(device,oldbrush);
DeleteObject(brush);
DeleteObject(oldbrush);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1214244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214244</guid><dc:creator><![CDATA[Zauberspiegel]]></dc:creator><pubDate>Mon, 22 Jan 2007 08:50:18 GMT</pubDate></item><item><title><![CDATA[Reply to Wem gehört das Handle? (SelectObject) on Mon, 22 Jan 2007 10:36:43 GMT]]></title><description><![CDATA[<p>oldbrush hast Du nicht erzeugt und gehört nicht Dir. Also lass es in Frieden.<br />
Du bist für alle Objekte verantwortlich, die Du erzeugst.<br />
Löschen darfst Du sie aber nur wenn sie in keinem Kontext mehr verwendet werden, ansonsten hast Du Leaks ohne Ende.</p>
<p>HTH</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1214321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214321</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 22 Jan 2007 10:36:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wem gehört das Handle? (SelectObject) on Mon, 22 Jan 2007 11:22:22 GMT]]></title><description><![CDATA[<p>Ok, danke für die Antwort!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1214353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214353</guid><dc:creator><![CDATA[Zauberspiegel]]></dc:creator><pubDate>Mon, 22 Jan 2007 11:22:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wem gehört das Handle? (SelectObject) on Wed, 24 Jan 2007 12:22:59 GMT]]></title><description><![CDATA[<p>Hmmm, das scheint ja nicht so zu stimmen denn:</p>
<pre><code>bitmap=CreateCompatibleBitmap(originaldevice,rect-&gt;right,rect-&gt;bottom);

        if(bitmap){

            SelectObject(memDC,bitmap);
            DeleteObject(bitmap);
        }
</code></pre>
<p>Obwohl mir das Handle nicht mehr gehört, lösche ich es! Wird da eine Kopie erzeugt?</p>
<p>Löscht WIN32 API eigentlich alles, nach dem Aufruf von DeleteDC?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215913</guid><dc:creator><![CDATA[Zauberspiegel]]></dc:creator><pubDate>Wed, 24 Jan 2007 12:22:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wem gehört das Handle? (SelectObject) on Wed, 24 Jan 2007 12:28:21 GMT]]></title><description><![CDATA[<p>Doch es stimmt!<br />
Dieser Code ist genau, dass was Memotyleaks erzeugt.</p>
<p>Ich habe es doch geschrieben:</p>
<blockquote>
<p>Löschen darfst Du sie aber nur wenn sie in keinem Kontext mehr verwendet werden, ansonsten hast Du Leaks ohne Ende.</p>
</blockquote>
<p>Hier wird ein Objekt erzeugt in einen DC selektiert und dann &quot;versucht&quot; zu löschen. Das lässt Windows aber nicht zu und es entsteht ein GDI-Leak. Die erzeugte Bitmap wird niemals mehr freigegeben!</p>
<p>Zauberspiegel schrieb:</p>
<blockquote>
<p>Löscht WIN32 API eigentlich alles, nach dem Aufruf von DeleteDC?</p>
</blockquote>
<p>Eben nicht! Objekte können über DC Grenzen hinweg benutzt werden!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215923</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 24 Jan 2007 12:28:21 GMT</pubDate></item><item><title><![CDATA[Reply to Wem gehört das Handle? (SelectObject) on Wed, 24 Jan 2007 12:32:00 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<p>Eben nicht! Objekte können über DC Grenzen hinweg benutzt werden!</p>
</blockquote>
<p>Das heißt ja, dass ichvor DeleteDC selber zu sorgen habe, dass das Bitmap, Pen, Brushes etc. mit DeleteObject gelöscht werden!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215929</guid><dc:creator><![CDATA[Zauberspiegel]]></dc:creator><pubDate>Wed, 24 Jan 2007 12:32:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wem gehört das Handle? (SelectObject) on Wed, 24 Jan 2007 16:15:05 GMT]]></title><description><![CDATA[<p>Zauberspiegel schrieb:</p>
<blockquote>
<p>Martin Richter schrieb:</p>
<blockquote>
<p>Eben nicht! Objekte können über DC Grenzen hinweg benutzt werden!</p>
</blockquote>
<p>Das heißt ja, dass ichvor DeleteDC selber zu sorgen habe, dass das Bitmap, Pen, Brushes etc. mit DeleteObject gelöscht werden!?</p>
</blockquote>
<p>Exakt! Und wenn Du es vergisst, gibt es eben Leaks. Ganz böse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1216152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216152</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Wed, 24 Jan 2007 16:15:05 GMT</pubDate></item><item><title><![CDATA[Reply to Wem gehört das Handle? (SelectObject) on Wed, 24 Jan 2007 23:42:37 GMT]]></title><description><![CDATA[<blockquote>
<p>Das heißt ja, dass ichvor DeleteDC selber zu sorgen habe, dass das Bitmap, Pen, Brushes etc. mit DeleteObject gelöscht werden!?</p>
</blockquote>
<p>Nein. Du musst NACHDEM du den letzten DC gelöscht hast der ein Objekt verwendet dieses Objekt löschen.<br />
Wenn du es &quot;by the book&quot; machen willst, dann selektierst du auch noch vor dem löschen des DCs wieder alle Objekte rein mit denen er angelegt wurde. Also inetwa so:</p>
<pre><code class="language-cpp">void foo()
{
    HBRUSH brush = CreateSolidBrush(...); // eigene brush her
    HDC dc = CreateDC(...); // eigenen DC her
    HBRUSH oldbrush = static_cast&lt;HBRUSH&gt;(SelectObject(dc, brush)); // eigene brush in eigenen DC reinstecken

    // ...

    SelectObject(dc,oldbrush); // alte brush wieder in den DC reinstecken
    DeleteDC(dc); // DC löschen
    DeleteObject(brush); // eigene brush löschen
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1216524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216524</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 24 Jan 2007 23:42:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wem gehört das Handle? (SelectObject) on Thu, 25 Jan 2007 14:45:04 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<blockquote>
<p>Das heißt ja, dass ichvor DeleteDC selber zu sorgen habe, dass das Bitmap, Pen, Brushes etc. mit DeleteObject gelöscht werden!?</p>
</blockquote>
<p>Nein. Du musst NACHDEM du den letzten DC gelöscht hast der ein Objekt verwendet dieses Objekt löschen.<br />
Wenn du es &quot;by the book&quot; machen willst, dann selektierst du auch noch vor dem löschen des DCs wieder alle Objekte rein mit denen er angelegt wurde. Also inetwa so:</p>
<pre><code class="language-cpp">void foo()
{
    HBRUSH brush = CreateSolidBrush(...); // eigene brush her
    HDC dc = CreateDC(...); // eigenen DC her
    HBRUSH oldbrush = static_cast&lt;HBRUSH&gt;(SelectObject(dc, brush)); // eigene brush in eigenen DC reinstecken

    // ...

    SelectObject(dc,oldbrush); // alte brush wieder in den DC reinstecken
    DeleteDC(dc); // DC löschen
    DeleteObject(brush); // eigene brush löschen
}
</code></pre>
</blockquote>
<p>Ähm ja...das implizierte mein Post <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="😉"
    /> . Also ich mach das immer in einem Schritt, da man sich dann die Variable 'brush', in Deinem Beispiel, sparen kann!</p>
<pre><code class="language-cpp">DeleteObject(SelectObject(dc, oldbrush));
DeleteDC(dc);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1216931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1216931</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Thu, 25 Jan 2007 14:45:04 GMT</pubDate></item></channel></rss>