<?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[GDI Flimmern Backbuffering]]></title><description><![CDATA[<p>Hi,<br />
ich habe ein kleines Problem mit Backbuffering. Ich schreibe gerade an einem Intro , indem so Starwars mässig Text nach oben Scrollt und immer kleiner wird. Im Hintergrund sind Sterne. Und genau da liegt das Problem. Ich nehme nicht ein grosses Bitmap was das ganze Fenster ausfüllt, sondern ein kleines was so rastermässig immer wieder nebeneinander angeordnet wird. Wenn jetzt der Animationsthread gestartet wird der den Text scrollt, flimmert es ganz schrecklich. Ich denke ich habe da irgendwas mit dem Backbuffering nicht ganz verstanden. Ich poste hier mal meine Paintmethode, es wär gut wenn ihr euch das mal angucken würdet und vielleicht den Fehler findet. Habe auch schon alles mögliche probiert aber ich kriegs einfach nicht gebacken. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<pre><code>void CIntro::paint(HWND hwnd,HBITMAP g_hbmBall){    
    PAINTSTRUCT ps;
    BITMAP bm;
    HDC hdc = BeginPaint(hwnd,&amp;ps);

    HDC hdcMem = CreateCompatibleDC(hdc);    
    HBITMAP hbmOld = (HBITMAP) SelectObject(hdcMem, g_hbmBall);
    GetObject(g_hbmBall, sizeof(bm), &amp;bm);        
    for (int i=0;i&lt;=ysize;i+=bm.bmHeight){
        for (int j=0;j&lt;=xsize;j+=bm.bmWidth){            
            BitBlt(hdc, j, i, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
        }
    }
    SelectObject(hdcMem, hbmOld);    
    DeleteObject(hbmOld);
    DeleteDC(hdcMem);

    SetBkMode(hdc,TRANSPARENT); //Hier wird die Schrift gezeichnet
    SetTextColor(hdc,RGB(200,200,50));
    for (int i=0;i&lt;10;i++){
        if (schrift[i]-&gt;getActive()) schrift[i]-&gt;paint(hdc);
    }

    EndPaint(hwnd,&amp;ps);	
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/82199/gdi-flimmern-backbuffering</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 09:19:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/82199.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Aug 2004 10:01:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Mon, 09 Aug 2004 10:01:41 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich habe ein kleines Problem mit Backbuffering. Ich schreibe gerade an einem Intro , indem so Starwars mässig Text nach oben Scrollt und immer kleiner wird. Im Hintergrund sind Sterne. Und genau da liegt das Problem. Ich nehme nicht ein grosses Bitmap was das ganze Fenster ausfüllt, sondern ein kleines was so rastermässig immer wieder nebeneinander angeordnet wird. Wenn jetzt der Animationsthread gestartet wird der den Text scrollt, flimmert es ganz schrecklich. Ich denke ich habe da irgendwas mit dem Backbuffering nicht ganz verstanden. Ich poste hier mal meine Paintmethode, es wär gut wenn ihr euch das mal angucken würdet und vielleicht den Fehler findet. Habe auch schon alles mögliche probiert aber ich kriegs einfach nicht gebacken. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<pre><code>void CIntro::paint(HWND hwnd,HBITMAP g_hbmBall){    
    PAINTSTRUCT ps;
    BITMAP bm;
    HDC hdc = BeginPaint(hwnd,&amp;ps);

    HDC hdcMem = CreateCompatibleDC(hdc);    
    HBITMAP hbmOld = (HBITMAP) SelectObject(hdcMem, g_hbmBall);
    GetObject(g_hbmBall, sizeof(bm), &amp;bm);        
    for (int i=0;i&lt;=ysize;i+=bm.bmHeight){
        for (int j=0;j&lt;=xsize;j+=bm.bmWidth){            
            BitBlt(hdc, j, i, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
        }
    }
    SelectObject(hdcMem, hbmOld);    
    DeleteObject(hbmOld);
    DeleteDC(hdcMem);

    SetBkMode(hdc,TRANSPARENT); //Hier wird die Schrift gezeichnet
    SetTextColor(hdc,RGB(200,200,50));
    for (int i=0;i&lt;10;i++){
        if (schrift[i]-&gt;getActive()) schrift[i]-&gt;paint(hdc);
    }

    EndPaint(hwnd,&amp;ps);	
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/578229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578229</guid><dc:creator><![CDATA[Belial]]></dc:creator><pubDate>Mon, 09 Aug 2004 10:01:41 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Mon, 09 Aug 2004 10:34:13 GMT]]></title><description><![CDATA[<p>Belial schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void CIntro::paint(HWND hwnd,HBITMAP g_hbmBall){
</code></pre>
</blockquote>
<p>Note: C als Prefix ist schlecht (s. [1],[2]).</p>
<p>Belial schrieb:</p>
<blockquote>
<pre><code class="language-cpp">/* ... */
    GetObject(g_hbmBall, sizeof(bm), &amp;bm);        
    for (int i=0;i&lt;=ysize;i+=bm.bmHeight){
        for (int j=0;j&lt;=xsize;j+=bm.bmWidth){            
            BitBlt(hdc, j, i, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
        }
    }
</code></pre>
</blockquote>
<p>Hier blittest du mehrmals hdcMem auf hdc. hdc ist dein Frontbuffer, da solltest du am besten nur einmal draufblitten.</p>
<p>Belial schrieb:</p>
<blockquote>
<pre><code class="language-cpp">/* ... */
    for (int i=0;i&lt;10;i++){
        if (schrift[i]-&gt;getActive()) schrift[i]-&gt;paint(hdc);
    }
</code></pre>
</blockquote>
<p>Du zeichnest die Schrift direkt auf den Frontbuffer. Da ist es kein Wunder, dass es flimmert.<br />
Du brauchst einen Backbuffer, der genauso groß wie der Frontbuffer (hdc) ist. Damit machst du die ganzen Zeichenoperationen. Am Schluss blittest du den Backbuffer in einem Rutsch in den Frontbuffer.</p>
<p>[1] <a href="http://schornboeck.net/artikel/cobject.htm" rel="nofollow">http://schornboeck.net/artikel/cobject.htm</a><br />
[2] <a href="http://www.c-plusplus.net/forum/viewtopic.php?t=41464" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic.php?t=41464</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/578249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578249</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Mon, 09 Aug 2004 10:34:13 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Mon, 09 Aug 2004 11:36:01 GMT]]></title><description><![CDATA[<p>Hm, danke für deine Antwort. Diese beiden Links von dir habe ich shcon in einem anderen Beitrag gefunden, irgendwie werde ich daraus aber nicht ganz schlau. Wenn du mir vieleicht einfach ganz kurz anhand meines Quellcodes sagen könntest wie ichs besser machen kann mit einem Quellcode als Antwort? Irgendwie kriege ich es auch nicht gebacken, wenn ich einen Backbuffer nehme (ich habe einfach mal stupide die Klasse aus deinem einen Link gecopy/pasted), ich den dann wieder in den eigentlichen frontbuffer zu kopieren? Bzw. es flackerte nach meinen Modifikationen nur noch schlimmer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/578292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578292</guid><dc:creator><![CDATA[Belial]]></dc:creator><pubDate>Mon, 09 Aug 2004 11:36:01 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Mon, 09 Aug 2004 11:43:37 GMT]]></title><description><![CDATA[<p>Lies bitte meinen Beitrag nochmal genau durch. <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>cd9000 schrieb:</p>
<blockquote>
<p>Note: C als Prefix ist schlecht (s. [1],[2]).</p>
<p>[...]</p>
<p>[1] <a href="http://schornboeck.net/artikel/cobject.htm" rel="nofollow">http://schornboeck.net/artikel/cobject.htm</a><br />
[2] <a href="http://www.c-plusplus.net/forum/viewtopic.php?t=41464" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic.php?t=41464</a></p>
</blockquote>
<p>Die beiden Links beziehen sich auf dein C-Prefix, nicht auf Double-Buffering.</p>
<p>Zu Double-Buffering liefert die <a href="http://www.c-plusplus.net/forum/search.php" rel="nofollow">Suchfunktion</a> einige Ergebnisse, u.a. auch fertigen Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/578300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578300</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Mon, 09 Aug 2004 11:43:37 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Mon, 09 Aug 2004 13:35:44 GMT]]></title><description><![CDATA[<p>Hehe, alles klar <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="😉"
    /> Ich habe auch viele Beispiele gefunden über Backbuffering und auch mal eins umgesetzt. Trotzdem flimmert es fast mehr als vorher. Wenn du es dir mal angucken könntest, irgendein dummer Fehler muss drin sein aber ich verstehe nicht ganz wo der sein soll:</p>
<pre><code>void CIntro::paint(HWND hwnd,HBITMAP g_hbmBall){    
    PAINTSTRUCT ps;
    BITMAP bm;
    RECT rcBuffer;
    GetClientRect( hwnd, &amp;rcBuffer);

    HDC hdc = BeginPaint(hwnd,&amp;ps);
    HDC hdc2 = CreateCompatibleDC(hdc);
    HBITMAP hBM = CreateCompatibleBitmap(hdc, rcBuffer.right - rcBuffer.left, rcBuffer.bottom - rcBuffer.top);
    SelectObject(hdc2, hBM); 

    HDC hdcMem = CreateCompatibleDC(hdc);    
    HBITMAP hbmOld = (HBITMAP) SelectObject(hdcMem, g_hbmBall);
    GetObject(g_hbmBall, sizeof(bm), &amp;bm);        
    for (int i=0;i&lt;=ysize;i+=bm.bmHeight){
         for (int j=0;j&lt;=xsize;j+=bm.bmWidth){            
            	BitBlt(hdc2, j, i, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
         }
    }
    SelectObject(hdcMem, hbmOld);        
    DeleteObject(hbmOld);
    DeleteDC(hdcMem);   

    SetBkMode(hdc2,TRANSPARENT);
    SetTextColor(hdc2,RGB(200,200,50));
    for (int i=0;i&lt;10;i++){
        	if (schrift[i]-&gt;getActive()) schrift[i]-&gt;paint(hdc2);
    }

    BitBlt(hdc, 0, 0, rcBuffer.right - rcBuffer.left, rcBuffer.bottom - rcBuffer.top, hdc2, 0, 0, SRCCOPY);
    DeleteObject(hBM);
    DeleteDC(hdc2);
    EndPaint(hwnd,&amp;ps);	
}
</code></pre>
<p>PS: Sowie ich Zeit hab nenne ich mal die Präfixe um, aber erstmal muss diese &quot;doofe&quot; Animation hinhauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/578365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578365</guid><dc:creator><![CDATA[Belial]]></dc:creator><pubDate>Mon, 09 Aug 2004 13:35:44 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Mon, 09 Aug 2004 18:10:56 GMT]]></title><description><![CDATA[<p>Rufst du irgendwo anders in deinem Code InvalidateRect auf? Wenn ja, ist der letzte Parameter auf FALSE gesetzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/578539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578539</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Mon, 09 Aug 2004 18:10:56 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Mon, 09 Aug 2004 18:24:14 GMT]]></title><description><![CDATA[<p>Wenn ich das richtig gesehen habe ist auch der DeleteObject-Aufruf für hbmOld fehl am Platz -&gt; löschen: <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/578547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578547</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Mon, 09 Aug 2004 18:24:14 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Mon, 09 Aug 2004 19:21:39 GMT]]></title><description><![CDATA[<p>Ja, ich rufe InvalidateRectangle auf und der letzte Parameter ist auf true gesetzt. <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="😉"
    /> Ist das schlimm?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/578578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578578</guid><dc:creator><![CDATA[Belial]]></dc:creator><pubDate>Mon, 09 Aug 2004 19:21:39 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Mon, 09 Aug 2004 19:56:42 GMT]]></title><description><![CDATA[<p>Ja, denn dann wird vorher unnötiger Weise dein Fenster mit dem in der Fensterklasse angegebenen Brush ausgefüllt - was unnötig ist, wenn du eh nachher alles überblittest. Außerdem führt dies eben dazu, dass zwischendurch das Fenster kurz in der Brushfarbe &quot;aufblitzt&quot; <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 einfach den letzten Parameter auf FALSE ändern <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/578587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578587</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Mon, 09 Aug 2004 19:56:42 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Mon, 09 Aug 2004 21:56:04 GMT]]></title><description><![CDATA[<p>Jo, jetzt funzt es super. Grosses Danke, im nachhinein isses auch logisch. Das ganze hin und her hat jetzt eh den Vorteil, dass ich mich noch nen bisl intensiver mit den GDI sachen auseinander gesetzt habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/578673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578673</guid><dc:creator><![CDATA[Belial]]></dc:creator><pubDate>Mon, 09 Aug 2004 21:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Mon, 09 Aug 2004 23:09:25 GMT]]></title><description><![CDATA[<p>Mh, jetzt hab ich plötzlich nen neues fieses Problem. Auf XP funzt das Prog super, unter Win9x frisst das programm immer mehr ressourcen und friert am ende komplett ein. Habe ich da vergessen irgendwelche Handles korrekt zu schliessen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/578698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578698</guid><dc:creator><![CDATA[Belial]]></dc:creator><pubDate>Mon, 09 Aug 2004 23:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Tue, 10 Aug 2004 06:31:46 GMT]]></title><description><![CDATA[<p>Mir ist jetzt spontan nichts aufgefallen - du könntest wenn dann noch die Erzeugung des Backbuffers nach WM_CREATE oder evtl. besser WM_SIZE (dort dann nicht vergessen den ggf. schon angelegten Backbuffer vor dem Neu-Anlegen freizugeben) verschieben (Zerstören dann bei WM_PAINT). Und wenn sich der Inhalt des Backbuffers nur bei Größenänderungen verändert (oder wann auch immer), dann könntest du auch die Befüllung des Backbuffers dorthin verschieben <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/578740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578740</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Tue, 10 Aug 2004 06:31:46 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Tue, 10 Aug 2004 08:36:32 GMT]]></title><description><![CDATA[<p>flenders schrieb:</p>
<blockquote>
<p>du könntest wenn dann noch die Erzeugung des Backbuffers nach WM_CREATE oder evtl. besser WM_SIZE (dort dann nicht vergessen den ggf. schon angelegten Backbuffer vor dem Neu-Anlegen freizugeben) verschieben (Zerstören dann bei WM_PAINT).</p>
</blockquote>
<p>Dann musst du aber noch beachten, dass der Backbuffer gelegentlich neu angelegt werden muss (etwa bei WM_SIZE oder WM_DISPLAYCHANGE).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/578789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578789</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Tue, 10 Aug 2004 08:36:32 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Tue, 10 Aug 2004 09:19:49 GMT]]></title><description><![CDATA[<p>Also es ist bei meinem Programm so, dass ein Thread die Schrift nach oben bewegt und dabei mit einer Taktung von 10 Herz WM_PAINT aufruft. Und unter Windoof 98/ME wird das ganze zunehmend langsamer, bis gar nix mehr geht. Deshalb schätze ich dass das Problem irgendwo in WM_PAINT liegt.Ich werd denn jetzt mal probieren die erzeugung des Backbuffers nach WM_CREATE auszulagern. Vielleicht hilfts. Ich find eh merkwürdig das XP anscheinend alle handles korekt zu schliessen scheint und 9x aus irgendwelchen Gründen mit meinem Code nicht klar kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/578826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578826</guid><dc:creator><![CDATA[Belial]]></dc:creator><pubDate>Tue, 10 Aug 2004 09:19:49 GMT</pubDate></item><item><title><![CDATA[Reply to GDI Flimmern Backbuffering on Tue, 10 Aug 2004 09:22:53 GMT]]></title><description><![CDATA[<p>Achso und ehe ichs vergesse, das Fenster ist so erzeugt dass die Grösse nicht verändert werden kann. Also brauche ich dann jawohl WM_SIZE nicht zu beachten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/578827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/578827</guid><dc:creator><![CDATA[Belial]]></dc:creator><pubDate>Tue, 10 Aug 2004 09:22:53 GMT</pubDate></item></channel></rss>