<?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[Geflacker trotz double buffering?]]></title><description><![CDATA[<p>Naja, wie der threadtitel schon sagt hab ich ein kleines Problem mit meinem Fensterchen. Meine WM_PAINT Message wird folgender maßen behandelt</p>
<pre><code class="language-cpp">case WM_PAINT:
        {
            PAINTSTRUCT ps;
            ps.fErase = 0;
            HDC hdc = BeginPaint(hwnd, &amp;ps);
            HDC hdc2 = CreateCompatibleDC(hdc);
            HBITMAP hbm = CreateCompatibleBitmap(hdc, 400, 216);
            SelectObject(hdc2, hbm);
            for(int i = 0; i &lt; POLY_COUNT; ++i)
            {
                if(polys[i] != NULL)
                {
                    HBRUSH brush;
                    if(polys[i]-&gt;hasFlag(FLAG_GUESSED))
                    {
                        brush = CreateSolidBrush(RGB(200,200,255));
                    }
                    // hier sind noch nen paar else ifs die aber genauso aus sehn wie das hier drüber...
                    else
                    {
                        brush = CreateSolidBrush(RGB(255,255,255));
                    }

                    HPEN pen = CreatePen(PS_SOLID, 2, RGB(0,0,0));

                    SelectObject(hdc2, brush);
                    SelectObject(hdc2, pen);

                    Polygon(hdc2, polys[i]-&gt;poly, polys[i]-&gt;polyVertices);

                    DeleteObject(brush);
                    DeleteObject(pen);
                }
            }
            BitBlt(hdc, 0, 0, 400, 216, hdc2, 0, 0, SRCCOPY);
            DeleteObject(hbm);
            DeleteDC(hdc2);
            EndPaint(hwnd, &amp;ps);
            return 0;
        }
</code></pre>
<p>Wenn ich nur ein oder wenige Polygone (die sind nicht all zu groß und es sind ca. 70 stk. mit jewels 6 Ecken falls das wichtig is) update fällt es noch nicht auf. Sobald jedoch das ganze Fenster neu gezeichnet werden soll, flackert das Fenster einmal merkbar in weiss auf.</p>
<p>Muss/Kann ich evtl. an irgend einer zusätzlichen Stelle einstellen, dass der background nie &quot;gecleared&quot; wird?</p>
<p>Hab ich beim double buffering irgendwas falsch gemacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/155949/geflacker-trotz-double-buffering</link><generator>RSS for Node</generator><lastBuildDate>Thu, 23 Jul 2026 11:37:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/155949.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Aug 2006 12:13:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Geflacker trotz double buffering? on Fri, 11 Aug 2006 12:13:55 GMT]]></title><description><![CDATA[<p>Naja, wie der threadtitel schon sagt hab ich ein kleines Problem mit meinem Fensterchen. Meine WM_PAINT Message wird folgender maßen behandelt</p>
<pre><code class="language-cpp">case WM_PAINT:
        {
            PAINTSTRUCT ps;
            ps.fErase = 0;
            HDC hdc = BeginPaint(hwnd, &amp;ps);
            HDC hdc2 = CreateCompatibleDC(hdc);
            HBITMAP hbm = CreateCompatibleBitmap(hdc, 400, 216);
            SelectObject(hdc2, hbm);
            for(int i = 0; i &lt; POLY_COUNT; ++i)
            {
                if(polys[i] != NULL)
                {
                    HBRUSH brush;
                    if(polys[i]-&gt;hasFlag(FLAG_GUESSED))
                    {
                        brush = CreateSolidBrush(RGB(200,200,255));
                    }
                    // hier sind noch nen paar else ifs die aber genauso aus sehn wie das hier drüber...
                    else
                    {
                        brush = CreateSolidBrush(RGB(255,255,255));
                    }

                    HPEN pen = CreatePen(PS_SOLID, 2, RGB(0,0,0));

                    SelectObject(hdc2, brush);
                    SelectObject(hdc2, pen);

                    Polygon(hdc2, polys[i]-&gt;poly, polys[i]-&gt;polyVertices);

                    DeleteObject(brush);
                    DeleteObject(pen);
                }
            }
            BitBlt(hdc, 0, 0, 400, 216, hdc2, 0, 0, SRCCOPY);
            DeleteObject(hbm);
            DeleteDC(hdc2);
            EndPaint(hwnd, &amp;ps);
            return 0;
        }
</code></pre>
<p>Wenn ich nur ein oder wenige Polygone (die sind nicht all zu groß und es sind ca. 70 stk. mit jewels 6 Ecken falls das wichtig is) update fällt es noch nicht auf. Sobald jedoch das ganze Fenster neu gezeichnet werden soll, flackert das Fenster einmal merkbar in weiss auf.</p>
<p>Muss/Kann ich evtl. an irgend einer zusätzlichen Stelle einstellen, dass der background nie &quot;gecleared&quot; wird?</p>
<p>Hab ich beim double buffering irgendwas falsch gemacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115286</guid><dc:creator><![CDATA[Matroc]]></dc:creator><pubDate>Fri, 11 Aug 2006 12:13:55 GMT</pubDate></item><item><title><![CDATA[Reply to Geflacker trotz double buffering? on Fri, 11 Aug 2006 12:30:01 GMT]]></title><description><![CDATA[<p>Also ich kenn mich mit WinAPI nicht gut aus, mir ist nur grad langweilig <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>
<p>Aber meine Vermutung: es gibt in deinem Programm wahrscheinlich sehr viele WM_PAINT-Messages. Und da du ja bei jeder WM_PAINT Message das Fenster neu gezeichnet wird, gibts flackern, besonders weil dein WM_PAINT ja relativ lang braucht (es muss immerhin jedes mal den offscreen-buffer neu zeichnen und dann den offscreen-buffer auf den Bildschirm kopieren).</p>
<p>Deine Polygone scheinen sich aber eh innerhalb von WM_PAINT nicht zu aendern, also: zeichne dir deinen offscreen-buffer anderswo (z. B. bei jeder Aenderung der Polygone) , dann brauchst du innerhalb von WM_PAINT nur noch den offscreen auf den Bildschrim kopieren. Das sollte schneller gehen und damit wahrscheinlich weniger flackern. Oder wenn du's noch weiter optimieren willst: zeichne bei jedem WM_PAINT nur den Teil neu, der auch wirklich neu zu zeichnen ist (da ich mich mit WinAPI nicht auskenne weiss ich nicht, ob das ueberhaupt moeglich ist <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>
<p>DISCLAIMER: ich hab wie gesagt keine Ahnung von WinAPI, mir ist nur der Threadtitel ins Auge gesprungen... kann also sein dass ich komplett daneben lieg mit meiner Vermutung <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1115294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115294</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Fri, 11 Aug 2006 12:30:01 GMT</pubDate></item><item><title><![CDATA[Reply to Geflacker trotz double buffering? on Fri, 11 Aug 2006 12:36:37 GMT]]></title><description><![CDATA[<p>Auf die Nachricht WM_ERASEBKGND einfach mit { return 1 ;} antworten.<br />
Es gibt noch andere Möglichkeiten. Guck da: <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="➡"
    /> <a href="http://www.catch22.net/tuts/flicker.asp" rel="nofollow">http://www.catch22.net/tuts/flicker.asp</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115299</guid><dc:creator><![CDATA[Elektronix]]></dc:creator><pubDate>Fri, 11 Aug 2006 12:36:37 GMT</pubDate></item><item><title><![CDATA[Reply to Geflacker trotz double buffering? on Fri, 11 Aug 2006 12:36:50 GMT]]></title><description><![CDATA[<p>Du kannst Objekte, die im DC selektiert sind, nicht löschen (DeleteObject).<br />
Daher bekommst Du auch GDI-Leaks...</p>
<p>MSDN schrieb:</p>
<blockquote>
<p>Return Values<br />
If the function succeeds, the return value is nonzero.</p>
<p>If the specified handle is not valid or is currently selected into a DC, the return value is zero.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1115303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115303</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Fri, 11 Aug 2006 12:36:50 GMT</pubDate></item><item><title><![CDATA[Reply to Geflacker trotz double buffering? on Fri, 11 Aug 2006 12:43:25 GMT]]></title><description><![CDATA[<p>vielen dank, das mit dem WM_ERASEBKGND hat geholfen. Nen paar von den anderen Hinweisen aus dem Link werd ich mir auch noch mal zu herzen nehmen, auch, wenn das Zeichnen des Fensters jetzt schon recht fix geht...</p>
<p>wegen den GDI leaks, was kann ich da tun?<br />
und warum wurde der beitrag zum double buffer im faq dann noch nicht angepasst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115311</guid><dc:creator><![CDATA[Matroc]]></dc:creator><pubDate>Fri, 11 Aug 2006 12:43:25 GMT</pubDate></item><item><title><![CDATA[Reply to Geflacker trotz double buffering? on Fri, 11 Aug 2006 12:46:14 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>[...]<br />
Aber meine Vermutung: es gibt in deinem Programm wahrscheinlich sehr viele WM_PAINT-Messages. Und da du ja bei jeder WM_PAINT Message das Fenster neu gezeichnet wird, gibts flackern, besonders weil dein WM_PAINT ja relativ lang braucht (es muss immerhin jedes mal den offscreen-buffer neu zeichnen und dann den offscreen-buffer auf den Bildschirm kopieren).<br />
[...]</p>
</blockquote>
<p>Nop das kann nicht sein, da das flackern nur entsteht, wenn der Bildschirminhalt, sprich der DC, der<br />
über BeginPaint(...) ermittelt wurde, neu gezeichnet wird und dies in geringen Zeitabständen sehr oft<br />
geschieht. Den 'offscreen-buffer' (eigentlich: Back-Buffer^^) kannste so oft wie du willst 'bemalen';<br />
Davon wird nix flackern. <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>
<blockquote>
<p>Du kannst Objekte, die im DC selektiert sind, nicht löschen (DeleteObject).<br />
Daher bekommst Du auch GDI-Leaks...<br />
[...]</p>
</blockquote>
<p>Genau! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> Das würd ich persönlich so lösen:</p>
<pre><code class="language-cpp">HDC hdcDest = ...;
HPEN hpOldPen = reinterpret_cast&lt;HPEN&gt;(SelectObject(hdcDest, CreatePen(...));
// ...
// Hier kannste dann in hdcDest mit dem erstellten 'Pen' rumalen ...
// ...
DeleteObject(SelectObject(hdcDest, hpOldPen));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1115318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115318</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Fri, 11 Aug 2006 12:46:14 GMT</pubDate></item><item><title><![CDATA[Reply to Geflacker trotz double buffering? on Fri, 11 Aug 2006 13:03:00 GMT]]></title><description><![CDATA[<p>[edit] ähm, zu langsam... [/edit]</p>
<p>Wenn du einen DC erstellst (zB. mit <em>CreateDC( )</em>) enthält dieser einen Satz von default-Objekten für Brush, Palette, Font, Pen und Region. Wenn du diese default-Objecte mit <em>SelectObject( sonstwas )</em> ersetzt, sind diese nicht mehr zugreifbar -&gt; GDI-Leak. Die default-Objekte werden bei einem <em>DeleteDC( )</em> automatisch gelöscht.</p>
<p>Abhilfe:</p>
<pre><code class="language-cpp">HDC dc = CreateDC( &quot;DISPLAY&quot;, 0, 0, 0 );

HBRUSH old_brush = reinterpret_cast&lt; HBRUSH &gt;( SelectObject( CreateSolidBrush( RGB( 0xff, 0xff, 0 ) ) ) );

// do some painting with the selected brush...

DeleteObject( SelectObject( old_brush ) );
DeleteDC( dc );
</code></pre>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115325</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Fri, 11 Aug 2006 13:03:00 GMT</pubDate></item><item><title><![CDATA[Reply to Geflacker trotz double buffering? on Fri, 11 Aug 2006 13:03:17 GMT]]></title><description><![CDATA[<p>Hähä, doppelt gemoppelt hält ja bekanntlich immer besser <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>
<p>EDIT: <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8250">@Swordfish</a>: Haste jetzt die neue I-Net Leitung ( <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="➡"
    /> ICQ) ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115330</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Fri, 11 Aug 2006 13:03:17 GMT</pubDate></item><item><title><![CDATA[Reply to Geflacker trotz double buffering? on Fri, 11 Aug 2006 13:10:39 GMT]]></title><description><![CDATA[<p>nö, leider noch nicht.</p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115339</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Fri, 11 Aug 2006 13:10:39 GMT</pubDate></item><item><title><![CDATA[Reply to Geflacker trotz double buffering? on Fri, 11 Aug 2006 14:06:31 GMT]]></title><description><![CDATA[<p>ok vielen Dank für eure Hilfe.</p>
<p>Jetzt funzt alles perfekt, genau so hatte ich mir das vorgestellt <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/1115395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115395</guid><dc:creator><![CDATA[Matroc]]></dc:creator><pubDate>Fri, 11 Aug 2006 14:06:31 GMT</pubDate></item></channel></rss>