<?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[WM_PAINT und WM_TIMER]]></title><description><![CDATA[<p>Moinsen,</p>
<p>ich versteh mal wieder etwas nicht:</p>
<p>Fillrect() und drawpoints() zeichnen ein paar Sachen in einen Backbuffer (HDC), mache ich ein BitBlt() im WM_TIMER geht alles gut.</p>
<p>Jetzt habe ich gelernt man soll IMMER im WM_PAINT-Zweig zeichnen. Gut, habe ich gedacht, stell ich das halt um, nach verschiedenen Anläufen bekomme ich es aber dann doch nicht hin.</p>
<p>Im folgenden Code habe ich jetzt in beiden Zweigen BitBlt() drin, ich mach es natürlich nur in WM_PAINT oder WM_TIMER nicht in beiden. Gleiches gilt für FillRect() - apropos: kann ich für FillRect nicht einfach ein InvalidateRect() aufrufen und WM_PAINT zeichnet dann den Hintergrund neu (wenn es denn mal funktioniert)? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Jemand Vorschläge?</p>
<pre><code class="language-cpp">case WM_TIMER:
	KillTimer(hWnd, timer_id);	// erstmal anhalten
	xmin = ifs_st-&gt;xmin;		// maximale Ausdehnung holen
	xmax = ifs_st-&gt;xmax;
	ymin = ifs_st-&gt;ymin;
	ymax = ifs_st-&gt;ymax;

	// Alles was zuvor gezeichnet wurde löschen
	if (xmin &lt;= xmax &amp;&amp; ymin &lt;= ymax) {
		rect.left	= xmin;		rect.top	= ymin;
		rect.right	= xmax+1;	rect.bottom	= ymax+1;
		//auch das wird gezeichnet
		FillRect(myBackBuffer, &amp;rect, (HBRUSH)GetStockObject(WHITE_BRUSH));
		ifs_st-&gt;xmin = ifs_st-&gt;width	+  1;
		ifs_st-&gt;xmax = ifs_st-&gt;ymax		= -1;
		ifs_st-&gt;ymin = ifs_st-&gt;height	+  1;
	}
	// (... do some iterations, mutations etc. ...)
	if (ifs_st-&gt;npoints) {
		drawpoints(ifs_st);		// Zeichne Punkte in myBackBuffer, läuft!
	}
	// myBackBuffer wird samt Inhalt auf den Bildschirm gezeichnet
	BitBlt (myDevCon, xmin, ymin, xmax - xmin + 1, ymax - ymin + 1, myBackBuffer, xmin, ymin, SRCCOPY);

	SetTimer(hWnd, timer_id, idelay, NULL);
	break;

case WM_PAINT:
	myDevCon = BeginPaint(ifs_st-&gt;window, &amp;ps);

	//Nix, denada, schwarz rrrrrhhhh!
	BitBlt (myDevCon, xmin, ymin, xmax - xmin + 1, ymax - ymin + 1, myBackBuffer, xmin, ymin, SRCCOPY);
	EndPaint(ifs_st-&gt;window, &amp;ps);
	break;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/162118/wm_paint-und-wm_timer</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 10:31:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/162118.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 14 Oct 2006 23:08:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to WM_PAINT und WM_TIMER on Sat, 14 Oct 2006 23:08:43 GMT]]></title><description><![CDATA[<p>Moinsen,</p>
<p>ich versteh mal wieder etwas nicht:</p>
<p>Fillrect() und drawpoints() zeichnen ein paar Sachen in einen Backbuffer (HDC), mache ich ein BitBlt() im WM_TIMER geht alles gut.</p>
<p>Jetzt habe ich gelernt man soll IMMER im WM_PAINT-Zweig zeichnen. Gut, habe ich gedacht, stell ich das halt um, nach verschiedenen Anläufen bekomme ich es aber dann doch nicht hin.</p>
<p>Im folgenden Code habe ich jetzt in beiden Zweigen BitBlt() drin, ich mach es natürlich nur in WM_PAINT oder WM_TIMER nicht in beiden. Gleiches gilt für FillRect() - apropos: kann ich für FillRect nicht einfach ein InvalidateRect() aufrufen und WM_PAINT zeichnet dann den Hintergrund neu (wenn es denn mal funktioniert)? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Jemand Vorschläge?</p>
<pre><code class="language-cpp">case WM_TIMER:
	KillTimer(hWnd, timer_id);	// erstmal anhalten
	xmin = ifs_st-&gt;xmin;		// maximale Ausdehnung holen
	xmax = ifs_st-&gt;xmax;
	ymin = ifs_st-&gt;ymin;
	ymax = ifs_st-&gt;ymax;

	// Alles was zuvor gezeichnet wurde löschen
	if (xmin &lt;= xmax &amp;&amp; ymin &lt;= ymax) {
		rect.left	= xmin;		rect.top	= ymin;
		rect.right	= xmax+1;	rect.bottom	= ymax+1;
		//auch das wird gezeichnet
		FillRect(myBackBuffer, &amp;rect, (HBRUSH)GetStockObject(WHITE_BRUSH));
		ifs_st-&gt;xmin = ifs_st-&gt;width	+  1;
		ifs_st-&gt;xmax = ifs_st-&gt;ymax		= -1;
		ifs_st-&gt;ymin = ifs_st-&gt;height	+  1;
	}
	// (... do some iterations, mutations etc. ...)
	if (ifs_st-&gt;npoints) {
		drawpoints(ifs_st);		// Zeichne Punkte in myBackBuffer, läuft!
	}
	// myBackBuffer wird samt Inhalt auf den Bildschirm gezeichnet
	BitBlt (myDevCon, xmin, ymin, xmax - xmin + 1, ymax - ymin + 1, myBackBuffer, xmin, ymin, SRCCOPY);

	SetTimer(hWnd, timer_id, idelay, NULL);
	break;

case WM_PAINT:
	myDevCon = BeginPaint(ifs_st-&gt;window, &amp;ps);

	//Nix, denada, schwarz rrrrrhhhh!
	BitBlt (myDevCon, xmin, ymin, xmax - xmin + 1, ymax - ymin + 1, myBackBuffer, xmin, ymin, SRCCOPY);
	EndPaint(ifs_st-&gt;window, &amp;ps);
	break;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1154897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154897</guid><dc:creator><![CDATA[timmix]]></dc:creator><pubDate>Sat, 14 Oct 2006 23:08:43 GMT</pubDate></item><item><title><![CDATA[Reply to WM_PAINT und WM_TIMER on Sun, 15 Oct 2006 07:09:28 GMT]]></title><description><![CDATA[<p>Wenn du deinen Back-Buffer in WM_TIMER verändern willst, sollte dieser auf jeden Fall erstmal static sein, damit er bei WM_PAINT auch nocht gültig ist. FillRect ersetzt kein InvalidateRect bzw. umgekehrt, denn wenn du deinen ganzen Back-Buffer mit BitBlt nachher auf den Fenster kopierst hat das, was Windows ggf. vorher machen würde eh keine Auswirkung. Also in WM_TIMER bzw. einmal nach dem Anlegen des Back-Buffers falls du nicht immer alles neu zeichnest ein FillRect, damit dieser einheitlich mit der entsprechenden Farbe gefüllt ist. Und dann in WM_TIMER nachdem du alles hineingezeichnet hast ein InvalidateRect, damit dein Fenster weiß, dass es sich mal wieder aktualisieren sollte (ggf. anschließend noch ein UpdateWindow. Und in WM_PAINT dann einfach dein BitBlt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154942</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Sun, 15 Oct 2006 07:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to WM_PAINT und WM_TIMER on Sun, 15 Oct 2006 10:26:42 GMT]]></title><description><![CDATA[<p>Im WM_PAINT-Zweig ist xmin etc. nicht definiert (wie du es bei WM_TIMER gemacht hast) ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1155018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1155018</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sun, 15 Oct 2006 10:26:42 GMT</pubDate></item></channel></rss>