<?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[Transparente Bitmap ohne Flankern (Microsoft Q79212)]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>Meine Frage ist wie man mit dem Ansatz von MS mit einen Backpuffer benutzen kann. Um das Flackern zu verhindern.</p>
<pre><code>void DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, int xStart, int yStart, COLORREF cTransparentColor)
{
    BITMAP      bm;
    COLORREF    cColor;
    HBITMAP     hBitAndBack, hBitAndObject, hBitAndMem, hBitSave,
                hBitBackOld, hBitObjectOld, hBitMemOld, hBitSaveOld;
    HDC         hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave;
    POINT       ptSize;

    hdcTemp = CreateCompatibleDC(hdc);
    SelectObject(hdcTemp, hBitmap);

    GetObject(hBitmap, sizeof(BITMAP), &amp;bm);
    ptSize.x = bm.bmWidth;
    ptSize.y = bm.bmHeight;
    DPtoLP(hdcTemp, &amp;ptSize, 1);

    hdcBack     = CreateCompatibleDC(hdc);
    hdcObject   = CreateCompatibleDC(hdc);
    hdcMem      = CreateCompatibleDC(hdc);
    hdcSave     = CreateCompatibleDC(hdc);

    hBitAndBack     = CreateBitmap(ptSize.x, ptSize.y, 1, 1, 0);
    hBitAndObject   = CreateBitmap(ptSize.x, ptSize.y, 1, 1, 0);

    hBitAndMem  = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
    hBitSave    = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);

    hBitBackOld     = (HBITMAP)SelectObject(hdcBack, hBitAndBack);
    hBitObjectOld   = (HBITMAP)SelectObject(hdcObject, hBitAndObject);
    hBitMemOld      = (HBITMAP)SelectObject(hdcMem, hBitAndMem);
    hBitSaveOld     = (HBITMAP)SelectObject(hdcSave, hBitSave);

    SetMapMode(hdcTemp, GetMapMode(hdc));
    BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);
    cColor = SetBkColor(hdcTemp, cTransparentColor);
    BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);
    SetBkColor(hdcTemp, cColor);
    BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY);
    BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY);
    BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);
    BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);
    BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp ,0, 0, SRCPAINT);
    BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY);
    BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);

    DeleteObject(SelectObject(hdcBack, hBitBackOld));
    DeleteObject(SelectObject(hdcObject, hBitObjectOld));
    DeleteObject(SelectObject(hdcMem, hBitMemOld));
    DeleteObject(SelectObject(hdcSave, hBitSaveOld));

    DeleteDC(hdcMem);
    DeleteDC(hdcBack);
    DeleteDC(hdcObject);
    DeleteDC(hdcSave);
    DeleteDC(hdcTemp);
}
</code></pre>
<p>HDC übergebe ich windowDC siehe unten. Dabei wird direkt gezeichnet.</p>
<pre><code>CClientDC windowDC (this);
</code></pre>
<p>Meine Idee war es das ich mit DrawTransparentBitmap alle meine Bilder in einen backpuffer speichere und am ende mit StretchBlt es dem windowDC übergebe. Diesen Ansatz klappt leider nicht.</p>
<pre><code>CDC backBufferDC;
windowDC.StretchBlt (0, 0, rect.Width (), rect.Height (), &amp;backBufferDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
</code></pre>
<p>Ich hoffe jemand kann mir helfen.</p>
<p>Muller</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203741/transparente-bitmap-ohne-flankern-microsoft-q79212</link><generator>RSS for Node</generator><lastBuildDate>Sun, 05 Apr 2026 10:52:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203741.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Jan 2008 21:40:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Transparente Bitmap ohne Flankern (Microsoft Q79212) on Fri, 25 Jan 2008 21:40:30 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>Meine Frage ist wie man mit dem Ansatz von MS mit einen Backpuffer benutzen kann. Um das Flackern zu verhindern.</p>
<pre><code>void DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, int xStart, int yStart, COLORREF cTransparentColor)
{
    BITMAP      bm;
    COLORREF    cColor;
    HBITMAP     hBitAndBack, hBitAndObject, hBitAndMem, hBitSave,
                hBitBackOld, hBitObjectOld, hBitMemOld, hBitSaveOld;
    HDC         hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave;
    POINT       ptSize;

    hdcTemp = CreateCompatibleDC(hdc);
    SelectObject(hdcTemp, hBitmap);

    GetObject(hBitmap, sizeof(BITMAP), &amp;bm);
    ptSize.x = bm.bmWidth;
    ptSize.y = bm.bmHeight;
    DPtoLP(hdcTemp, &amp;ptSize, 1);

    hdcBack     = CreateCompatibleDC(hdc);
    hdcObject   = CreateCompatibleDC(hdc);
    hdcMem      = CreateCompatibleDC(hdc);
    hdcSave     = CreateCompatibleDC(hdc);

    hBitAndBack     = CreateBitmap(ptSize.x, ptSize.y, 1, 1, 0);
    hBitAndObject   = CreateBitmap(ptSize.x, ptSize.y, 1, 1, 0);

    hBitAndMem  = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
    hBitSave    = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);

    hBitBackOld     = (HBITMAP)SelectObject(hdcBack, hBitAndBack);
    hBitObjectOld   = (HBITMAP)SelectObject(hdcObject, hBitAndObject);
    hBitMemOld      = (HBITMAP)SelectObject(hdcMem, hBitAndMem);
    hBitSaveOld     = (HBITMAP)SelectObject(hdcSave, hBitSave);

    SetMapMode(hdcTemp, GetMapMode(hdc));
    BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);
    cColor = SetBkColor(hdcTemp, cTransparentColor);
    BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);
    SetBkColor(hdcTemp, cColor);
    BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY);
    BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY);
    BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);
    BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);
    BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp ,0, 0, SRCPAINT);
    BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY);
    BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);

    DeleteObject(SelectObject(hdcBack, hBitBackOld));
    DeleteObject(SelectObject(hdcObject, hBitObjectOld));
    DeleteObject(SelectObject(hdcMem, hBitMemOld));
    DeleteObject(SelectObject(hdcSave, hBitSaveOld));

    DeleteDC(hdcMem);
    DeleteDC(hdcBack);
    DeleteDC(hdcObject);
    DeleteDC(hdcSave);
    DeleteDC(hdcTemp);
}
</code></pre>
<p>HDC übergebe ich windowDC siehe unten. Dabei wird direkt gezeichnet.</p>
<pre><code>CClientDC windowDC (this);
</code></pre>
<p>Meine Idee war es das ich mit DrawTransparentBitmap alle meine Bilder in einen backpuffer speichere und am ende mit StretchBlt es dem windowDC übergebe. Diesen Ansatz klappt leider nicht.</p>
<pre><code>CDC backBufferDC;
windowDC.StretchBlt (0, 0, rect.Width (), rect.Height (), &amp;backBufferDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
</code></pre>
<p>Ich hoffe jemand kann mir helfen.</p>
<p>Muller</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443755</guid><dc:creator><![CDATA[Muller79]]></dc:creator><pubDate>Fri, 25 Jan 2008 21:40:30 GMT</pubDate></item><item><title><![CDATA[Reply to Transparente Bitmap ohne Flankern (Microsoft Q79212) on Sat, 26 Jan 2008 09:50:15 GMT]]></title><description><![CDATA[<p>Das sollte Dir helfen:</p>
<p><a href="http://www.codeproject.com/KB/GDI/flickerfree.aspx" rel="nofollow">http://www.codeproject.com/KB/GDI/flickerfree.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443886</guid><dc:creator><![CDATA[sri]]></dc:creator><pubDate>Sat, 26 Jan 2008 09:50:15 GMT</pubDate></item></channel></rss>