<?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[OnPaint spinnt]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein eigenes Steuerelement geschrieben, dass von der Optik her an eine CListCtrl erinnert. Eigentlich läuft das Ding aber wenn ich das Programm mehrere Stunden laufen lasse, dann wird plötzlich die standard Schrift genommen und nicht meine eigene und außerdem wird keine der definieren Farben mehr benutzt um den Hintergrund zu zeichnen. Es ist also alles weiss, Schrift schwarz und Schrift standard Schrift.</p>
<p>Hier mein Code:</p>
<pre><code class="language-cpp">void myListCtrl::OnPaint() 
{
	// Variablen
	CPaintDC	paint_dc(this);
	CMemDC		dc(&amp;paint_dc);

	// Farben
	COLORREF	m_backgroundColor	= RGB(255, 255, 255);
	COLORREF	m_systemGREY		= RGB(236, 233, 216);
	COLORREF	m_darkGREY			= RGB(173, 170, 153);
	COLORREF	m_lightGREEN		= RGB(149, 255, 144);
	COLORREF	m_darkGREEN			= RGB(  9, 198,   0);

	// Textart
	HFONT		m_Font = CreateFont(14,0, 0,0, FW_THIN, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, &quot;Arial&quot;);

	// Bereiche
	CRect		client_rect;
	CRect		content_rect;

	// Bestimmen, wo gezeichnet werden soll
	GetClientRect(client_rect);

	content_rect = client_rect;
	content_rect.top+=1;
	content_rect.right-=2;
	content_rect.left+=1;

	dc.SetBkMode(TRANSPARENT);							// Alle nicht bemalten Flächen sind durchsichtig
	dc.SelectObject(m_Font);							// Schriftart laden

	dc.FillSolidRect( client_rect, m_backgroundColor );	// Hintergrund malen

	// Titelleiste zeichnen
	//
		// Hintergrund zeichnen
		HPEN	border_pen	= CreatePen( PS_SOLID,0,m_darkGREY );	SelectObject( dc, border_pen );
		HBRUSH	backg_fill	= CreateSolidBrush( m_systemGREY );		SelectObject( dc, backg_fill);

		Rectangle(	dc, 
					content_rect.left, 
					content_rect.top, 
					content_rect.right, 
					content_rect.top+row_height);

		// Spalten und Spaltenbeschriftung
		int x = content_rect.left;

		for( int i=0; i&lt;myCols.size(); i++ )
		{
			// Beschriftung
			dc.TextOut(x+5,content_rect.top+1,myCols[i].title);

			// Trennlinie
			x	+=	myCols[i].width;

			dc.MoveTo( x, content_rect.top);
			dc.LineTo( x, content_rect.top+row_height	);
		}

	// Content
	//
		// Hintergrundfarbe wählen
		backg_fill	= CreateSolidBrush( m_backgroundColor );	SelectObject( dc, backg_fill);

		int y = content_rect.top+row_height+2;

		// Rahmen für die Zeilen
		for( i=0; i&lt;m_iVisibleLines; i++)
		{
			Rectangle(	dc, 
						content_rect.left, 
						y, 
						content_rect.right, 
						y+row_height);

			y+=row_height-1;
		}

		// Rahmen für die Spalten
		border_pen	= CreatePen( PS_SOLID,0,m_darkGREY );		SelectObject( dc, border_pen);
		x = content_rect.left;

		for( i=0; i&lt;myCols.size()-1; i++ )
		{
			x	+=	myCols[i].width;

			dc.MoveTo( x, content_rect.top+row_height+4);
			dc.LineTo( x, y	);
		}

		// Content eintragen
		CString data;
		y = content_rect.top+row_height+2;

		for( i=m_iFirstLine; i&lt;row_data_set.size(); i++)
		{
			x = content_rect.left;

			for( int j=0; j&lt;3; j++ )
			{
				if(j==0) data = row_data_set[i].data1;
				if(j==1) data = row_data_set[i].data2;
				if(j==2) data.Format(&quot;%.3f&quot;,row_data_set[i].data3); 

				dc.TextOut(x+6,y+1,data);
				x	+=	myCols[j].width;
			}

			y+=row_height-1;
		}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/197490/onpaint-spinnt</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 16:07:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197490.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 11 Nov 2007 10:24:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to OnPaint spinnt on Sun, 11 Nov 2007 10:24:05 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein eigenes Steuerelement geschrieben, dass von der Optik her an eine CListCtrl erinnert. Eigentlich läuft das Ding aber wenn ich das Programm mehrere Stunden laufen lasse, dann wird plötzlich die standard Schrift genommen und nicht meine eigene und außerdem wird keine der definieren Farben mehr benutzt um den Hintergrund zu zeichnen. Es ist also alles weiss, Schrift schwarz und Schrift standard Schrift.</p>
<p>Hier mein Code:</p>
<pre><code class="language-cpp">void myListCtrl::OnPaint() 
{
	// Variablen
	CPaintDC	paint_dc(this);
	CMemDC		dc(&amp;paint_dc);

	// Farben
	COLORREF	m_backgroundColor	= RGB(255, 255, 255);
	COLORREF	m_systemGREY		= RGB(236, 233, 216);
	COLORREF	m_darkGREY			= RGB(173, 170, 153);
	COLORREF	m_lightGREEN		= RGB(149, 255, 144);
	COLORREF	m_darkGREEN			= RGB(  9, 198,   0);

	// Textart
	HFONT		m_Font = CreateFont(14,0, 0,0, FW_THIN, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, &quot;Arial&quot;);

	// Bereiche
	CRect		client_rect;
	CRect		content_rect;

	// Bestimmen, wo gezeichnet werden soll
	GetClientRect(client_rect);

	content_rect = client_rect;
	content_rect.top+=1;
	content_rect.right-=2;
	content_rect.left+=1;

	dc.SetBkMode(TRANSPARENT);							// Alle nicht bemalten Flächen sind durchsichtig
	dc.SelectObject(m_Font);							// Schriftart laden

	dc.FillSolidRect( client_rect, m_backgroundColor );	// Hintergrund malen

	// Titelleiste zeichnen
	//
		// Hintergrund zeichnen
		HPEN	border_pen	= CreatePen( PS_SOLID,0,m_darkGREY );	SelectObject( dc, border_pen );
		HBRUSH	backg_fill	= CreateSolidBrush( m_systemGREY );		SelectObject( dc, backg_fill);

		Rectangle(	dc, 
					content_rect.left, 
					content_rect.top, 
					content_rect.right, 
					content_rect.top+row_height);

		// Spalten und Spaltenbeschriftung
		int x = content_rect.left;

		for( int i=0; i&lt;myCols.size(); i++ )
		{
			// Beschriftung
			dc.TextOut(x+5,content_rect.top+1,myCols[i].title);

			// Trennlinie
			x	+=	myCols[i].width;

			dc.MoveTo( x, content_rect.top);
			dc.LineTo( x, content_rect.top+row_height	);
		}

	// Content
	//
		// Hintergrundfarbe wählen
		backg_fill	= CreateSolidBrush( m_backgroundColor );	SelectObject( dc, backg_fill);

		int y = content_rect.top+row_height+2;

		// Rahmen für die Zeilen
		for( i=0; i&lt;m_iVisibleLines; i++)
		{
			Rectangle(	dc, 
						content_rect.left, 
						y, 
						content_rect.right, 
						y+row_height);

			y+=row_height-1;
		}

		// Rahmen für die Spalten
		border_pen	= CreatePen( PS_SOLID,0,m_darkGREY );		SelectObject( dc, border_pen);
		x = content_rect.left;

		for( i=0; i&lt;myCols.size()-1; i++ )
		{
			x	+=	myCols[i].width;

			dc.MoveTo( x, content_rect.top+row_height+4);
			dc.LineTo( x, y	);
		}

		// Content eintragen
		CString data;
		y = content_rect.top+row_height+2;

		for( i=m_iFirstLine; i&lt;row_data_set.size(); i++)
		{
			x = content_rect.left;

			for( int j=0; j&lt;3; j++ )
			{
				if(j==0) data = row_data_set[i].data1;
				if(j==1) data = row_data_set[i].data2;
				if(j==2) data.Format(&quot;%.3f&quot;,row_data_set[i].data3); 

				dc.TextOut(x+6,y+1,data);
				x	+=	myCols[j].width;
			}

			y+=row_height-1;
		}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1401243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401243</guid><dc:creator><![CDATA[Hecker.Michael]]></dc:creator><pubDate>Sun, 11 Nov 2007 10:24:05 GMT</pubDate></item><item><title><![CDATA[Reply to OnPaint spinnt on Sun, 11 Nov 2007 17:08:20 GMT]]></title><description><![CDATA[<p>Das wundert mich nicht. Du erzeugst einen Font, selektierst diesen in den DC und dann wird dieser Font nicht wieder aus dem DC entfernt. Dadurch kann der Font auch nicht zerstört werden.</p>
<p>Also immer bei einem SelectObject, den Rückgabewert merken und später (vor dem Ende der OnPaint Routine) wieder den alten Wert selektieren.</p>
<p>Außerdem sehe ich nicht, dass der Font wieder zerstört wird.<br />
Erzeuge den Font doch nur einmal.</p>
<pre><code class="language-cpp">CFont *pOldFont = dc.SelectObject(&amp;m_Font);                          
...
dc.SelectObject(pOldFont);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1401493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401493</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sun, 11 Nov 2007 17:08:20 GMT</pubDate></item><item><title><![CDATA[Reply to OnPaint spinnt on Mon, 12 Nov 2007 13:02:34 GMT]]></title><description><![CDATA[<p>Hallo Martin,<br />
vielen Dank für deinen Beitrag.<br />
Ich konnte das Problem gestern lösen und dein Beitrag ist Teil der Lösung.</p>
<p>Was ich jetzt anders mache:</p>
<pre><code class="language-cpp">CPen *pen1 = new CPen;			
		pen1-&gt;CreatePen( PS_SOLID,0,RGB(0,0,0) );
		dc-&gt;SelectObject(pen1);

[...]

pen1-&gt;DeleteObject();			
delete pen1;
</code></pre>
<p>Das für alle CBrush, CPen &amp; CFont.</p>
<p>Grüße,<br />
Michael</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401832</guid><dc:creator><![CDATA[Hecker.Michael]]></dc:creator><pubDate>Mon, 12 Nov 2007 13:02:34 GMT</pubDate></item><item><title><![CDATA[Reply to OnPaint spinnt on Mon, 12 Nov 2007 13:46:57 GMT]]></title><description><![CDATA[<p>1. Hast Du nicht gelesen wie es richtig geht. Denn auch in diesem Fall bleibt der CPen in dem DC selektiert.<br />
2. Du brauchst die CPen Objekte nicht mit new erzeugen. Das kostet nur Zeit. Erzeuge sie wie bisher auf dem Stack...<br />
3. Das explizite Aufrufen von DeleteObject ist nicht noitwendig, das besorgt der Destruktor.</p>
<pre><code class="language-cpp">CPen pen1;
pen1.CreatePen( PS_SOLID,0,RGB(0,0,0) );
CPen *pPenOld = dc-&gt;SelectObject(&amp;pen1);

[...]

dc-&gt;SelectObject(pPenOld);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1401858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401858</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 12 Nov 2007 13:46:57 GMT</pubDate></item></channel></rss>