<?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[Ownerdraw Code funktioniert, ist er aber auch richtig?]]></title><description><![CDATA[<p>Hallo,</p>
<p>habs nun endlich hinbekommen meinem Button komplett selbst zu zeichnen und augenscheinlich funktioniert auch alles, jedoch kenn ich mich mit den Draw Routinen nur sehr bescheiden aus, deshalb meine Frage ist der Code auch &quot;safe&quot; oder kann es zu irgendwelchen Leaks kommen? Also hier der Code:</p>
<pre><code class="language-cpp">case WM_DRAWITEM:{
		HDC			hDC;
		HBRUSH		hBrush;
		RECT			rc, rc_icon, rc_color;
		UINT			state, flag;
		LPDRAWITEMSTRUCT	di;

		di = (LPDRAWITEMSTRUCT)lParam;
		state = di-&gt;itemState;
		hDC = GetDC(di-&gt;hwndItem);
		rc = di-&gt;rcItem;
		rc_color = rc_icon = rc;
		rc_color.left += 6;
		rc_color.top += 6;
		rc_color.right -= 17;
		rc_color.bottom -= 6;
		rc_icon.left += 5;
		rc_icon.top += 5;
		hBrush = CreateSolidBrush(GetSysColor(CTLCOLOR_DLG));
		FillRect(hDC, &amp;rc, hBrush);
		hBrush = CreateSolidBrush(RGB(0, 0, 255));
		if(state &amp; ODS_SELECTED){
			rc_color.left++;
			rc_color.top++;
			rc_color.right++;
			rc_color.bottom++;
			rc_icon.left++;
			rc_icon.top++;
			flag = EDGE_SUNKEN;
		}else{
			flag = EDGE_RAISED;
		}
		DrawEdge(hDC, &amp;rc, flag, BF_RECT);
		if(state &amp; ODS_FOCUS){
			rc.top += 3;
			rc.left += 3;
			rc.right -= 3;
			rc.bottom -= 3;
			DrawFocusRect(hDC, &amp;rc);
		}
		FillRect(hDC, &amp;rc_color, hBrush);
		DrawIconEx(hDC, rc_icon.left, rc_icon.top, hIcon, 0, 0, 0, 0, DI_NORMAL);
		ReleaseDC(di-&gt;hwndItem, hDC);
		return 1;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/209662/ownerdraw-code-funktioniert-ist-er-aber-auch-richtig</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Apr 2026 06:45:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/209662.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Apr 2008 04:48:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ownerdraw Code funktioniert, ist er aber auch richtig? on Wed, 02 Apr 2008 04:48:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>habs nun endlich hinbekommen meinem Button komplett selbst zu zeichnen und augenscheinlich funktioniert auch alles, jedoch kenn ich mich mit den Draw Routinen nur sehr bescheiden aus, deshalb meine Frage ist der Code auch &quot;safe&quot; oder kann es zu irgendwelchen Leaks kommen? Also hier der Code:</p>
<pre><code class="language-cpp">case WM_DRAWITEM:{
		HDC			hDC;
		HBRUSH		hBrush;
		RECT			rc, rc_icon, rc_color;
		UINT			state, flag;
		LPDRAWITEMSTRUCT	di;

		di = (LPDRAWITEMSTRUCT)lParam;
		state = di-&gt;itemState;
		hDC = GetDC(di-&gt;hwndItem);
		rc = di-&gt;rcItem;
		rc_color = rc_icon = rc;
		rc_color.left += 6;
		rc_color.top += 6;
		rc_color.right -= 17;
		rc_color.bottom -= 6;
		rc_icon.left += 5;
		rc_icon.top += 5;
		hBrush = CreateSolidBrush(GetSysColor(CTLCOLOR_DLG));
		FillRect(hDC, &amp;rc, hBrush);
		hBrush = CreateSolidBrush(RGB(0, 0, 255));
		if(state &amp; ODS_SELECTED){
			rc_color.left++;
			rc_color.top++;
			rc_color.right++;
			rc_color.bottom++;
			rc_icon.left++;
			rc_icon.top++;
			flag = EDGE_SUNKEN;
		}else{
			flag = EDGE_RAISED;
		}
		DrawEdge(hDC, &amp;rc, flag, BF_RECT);
		if(state &amp; ODS_FOCUS){
			rc.top += 3;
			rc.left += 3;
			rc.right -= 3;
			rc.bottom -= 3;
			DrawFocusRect(hDC, &amp;rc);
		}
		FillRect(hDC, &amp;rc_color, hBrush);
		DrawIconEx(hDC, rc_icon.left, rc_icon.top, hIcon, 0, 0, 0, 0, DI_NORMAL);
		ReleaseDC(di-&gt;hwndItem, hDC);
		return 1;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1484919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1484919</guid><dc:creator><![CDATA[Farbklecks]]></dc:creator><pubDate>Wed, 02 Apr 2008 04:48:09 GMT</pubDate></item><item><title><![CDATA[Reply to Ownerdraw Code funktioniert, ist er aber auch richtig? on Wed, 02 Apr 2008 06:47:07 GMT]]></title><description><![CDATA[<p>Was Du mit CreateSolidBrush erstellst musst Du auch mit DeleteObject<br />
wieder frei geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1484954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1484954</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Wed, 02 Apr 2008 06:47:07 GMT</pubDate></item><item><title><![CDATA[Reply to Ownerdraw Code funktioniert, ist er aber auch richtig? on Wed, 02 Apr 2008 07:29:50 GMT]]></title><description><![CDATA[<p>Soweit ich das sehe ist das OK.</p>
<p>Nur es gibt einfachere Funktionen Buttons zu zeichen:<br />
DrawFrameControl<br />
und<br />
DrawThemeBackground (wenn themeing eingeschaltet ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1484967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1484967</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 02 Apr 2008 07:29:50 GMT</pubDate></item><item><title><![CDATA[Reply to Ownerdraw Code funktioniert, ist er aber auch richtig? on Wed, 02 Apr 2008 08:02:44 GMT]]></title><description><![CDATA[<p>Der Aufruf von GetDC/ReleaseDC ist eigentlich unnötig, weil der DC schon fertig in DRAWITEMSTRUCT (di-&gt;hDC) daherkommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1484987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1484987</guid><dc:creator><![CDATA[sri]]></dc:creator><pubDate>Wed, 02 Apr 2008 08:02:44 GMT</pubDate></item><item><title><![CDATA[Reply to Ownerdraw Code funktioniert, ist er aber auch richtig? on Wed, 02 Apr 2008 08:26:29 GMT]]></title><description><![CDATA[<p>sri schrieb:</p>
<blockquote>
<p>Der Aufruf von GetDC/ReleaseDC ist eigentlich unnötig, weil der DC schon fertig in DRAWITEMSTRUCT (di-&gt;hDC) daherkommt.</p>
</blockquote>
<p>Wie wahr! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Gut aufgepasst...<br />
Es kann sogar zu Fehlfunktionen führen, denn das List-Ctrl könnte auf die Idee kommen den DC weiter zu nutzen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485006</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 02 Apr 2008 08:26:29 GMT</pubDate></item><item><title><![CDATA[Reply to Ownerdraw Code funktioniert, ist er aber auch richtig? on Wed, 02 Apr 2008 17:33:27 GMT]]></title><description><![CDATA[<p>Ich hab den hDC, also GetDC(...) und ReleaseDC(..), jetzt entfernt. Weiterhin hab ich nach jedem Aufruf von FillRect(...) den Brush mit DeleteObject(...) gelöscht und DrawFrameControl(..) zum Zeichnen des Buttos verwendet. Erwartungsgmäß funktioniert der Code einwandfrei, danke für die Hinweise. Hier nochmal der überarbeitete Code, ich hoffe der ist nun optimal?</p>
<pre><code class="language-cpp">void OwnerDraw_ColorButton(LPARAM lParam, COLORREF mycolor){

	HBRUSH		hBrush;
	RECT			rc_icon, rc_color;
	LPDRAWITEMSTRUCT	di;

	di = (LPDRAWITEMSTRUCT)lParam;
	rc_color = rc_icon = di-&gt;rcItem;
	rc_color.left += 6;
	rc_color.top += 6;
	rc_color.right -= 17;
	rc_color.bottom -= 6;
	rc_icon.left += 5;
	rc_icon.top += 5;
	if(di-&gt;itemState &amp; ODS_SELECTED){
		rc_color.left++;
		rc_color.top++;
		rc_color.right++;
		rc_color.bottom++;
		rc_icon.left++;
		rc_icon.top++;
		DrawFrameControl(di-&gt;hDC, &amp;di-&gt;rcItem, DFC_BUTTON, DFCS_BUTTONPUSH | DFCS_PUSHED);
	}else{
		DrawFrameControl(di-&gt;hDC, &amp;di-&gt;rcItem, DFC_BUTTON, DFCS_BUTTONPUSH);
	}
	if(di-&gt;itemState &amp; ODS_FOCUS){
		di-&gt;rcItem.top += 3;
		di-&gt;rcItem.left += 3;
		di-&gt;rcItem.right -= 3;
		di-&gt;rcItem.bottom -= 3;
		DrawFocusRect(di-&gt;hDC, &amp;di-&gt;rcItem);
	}
	hBrush = CreateSolidBrush(mycolor);
	FillRect(di-&gt;hDC, &amp;rc_color, hBrush);
	DeleteObject(hBrush);
	DrawIconEx(di-&gt;hDC, rc_icon.left, rc_icon.top, hIcon, 0, 0, 0, 0, DI_NORMAL);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1485400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485400</guid><dc:creator><![CDATA[Farbklecks]]></dc:creator><pubDate>Wed, 02 Apr 2008 17:33:27 GMT</pubDate></item></channel></rss>