<?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[CreateDIBSection klappt, und nun direkt reinzeichnen - wie?]]></title><description><![CDATA[<p>Moinsen,</p>
<p>also ich habe mir ein DIB folgendermaßen gebaut:</p>
<pre><code class="language-cpp">// DISection
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biWidth = myScreenSize.right;
bmih.biHeight = myScreenSize.bottom;
bmih.biPlanes = 1;
bmih.biBitCount	= 32;
bmih.biCompression = BI_RGB;
bmih.biSizeImage = 0; //((((bmih.biWidth * bmih.biBitCount) + 31) &amp; ~31) &gt;&gt; 3) * bmih.biHeight;
bmih.biXPelsPerMeter = 0;
bmih.biYPelsPerMeter = 0;
bmih.biClrUsed = 0;
bmih.biClrImportant = 0;

myBitmap = CreateDIBSection(NULL, (BITMAPINFO *) &amp;bmih, 0, (void**)&amp;pBits, NULL, 0);
</code></pre>
<p>Funktioniert hervorragend und ich kann mit folgender Funktion rein zeichnen indem ich die DIBSection mit dem Handle &quot;myBackbuffer&quot; verknüpfe (wird später geblittet).</p>
<pre><code class="language-cpp">static void drawpoints(struct state *st) {
    for (int i = 0; i &lt; st-&gt;npoints; i++) {
        SetPixelV(myBackBuffer, st-&gt;pointbuf[i].x, st-&gt;pointbuf[i].y, st-&gt;colours[st-&gt;ccolour]);
    } 
    st-&gt;npoints = 0; // Pointbuffer zurücksetzen 
}
</code></pre>
<p>Allerdings ist mir SetPixel() verständlicherweise zu langsam. Daher versuche ich folgendes:</p>
<pre><code class="language-cpp">static void drawpoints(struct state *st) {
    int h2; // Hilfsvariable

    // Anzahl der Felder für eine Zeile berechnen (mach ich das richtig?)
    int Zeile = ((((bmih.biWidth * bmih.biBitCount) + 31) &amp; ~31) &gt;&gt; 3);

    for (int i = 0; i &lt; st-&gt;npoints; i++) {
        h2        = Zeile * st-&gt;pointbuf[i].y + (st-&gt;pointbuf[i].x * sizeof(COLORREF));
        // das sieht schon gut aus, allerdings noch mit Verschiebungen und Artefakten

        pBits[h2] = RGB(000,255,255); //pBits ist der Pointer auf die Daten der DIBSection
        // obwohl weiß angegeben zeichnet mein Programm alles Blau
	}

	st-&gt;npoints = 0;   // Pointbuffer zurücksetzen
}
</code></pre>
<p>Also ich kann aufgrund der ausgegebene Grafik erkennen, dass ich auf den richtigen Weg bin, aber gezeichnet wird alles in BLAU und mit einigen Artefakten und Verschiebungen.<br />
Hat sich nicht gerade jemand spontan abgelacht über meine Vorgehensweise? Na, dann her mit den guten Ideen <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/topic/162257/createdibsection-klappt-und-nun-direkt-reinzeichnen-wie</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Jul 2026 23:56:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/162257.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Oct 2006 19:53:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to CreateDIBSection klappt, und nun direkt reinzeichnen - wie? on Mon, 16 Oct 2006 19:53:04 GMT]]></title><description><![CDATA[<p>Moinsen,</p>
<p>also ich habe mir ein DIB folgendermaßen gebaut:</p>
<pre><code class="language-cpp">// DISection
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biWidth = myScreenSize.right;
bmih.biHeight = myScreenSize.bottom;
bmih.biPlanes = 1;
bmih.biBitCount	= 32;
bmih.biCompression = BI_RGB;
bmih.biSizeImage = 0; //((((bmih.biWidth * bmih.biBitCount) + 31) &amp; ~31) &gt;&gt; 3) * bmih.biHeight;
bmih.biXPelsPerMeter = 0;
bmih.biYPelsPerMeter = 0;
bmih.biClrUsed = 0;
bmih.biClrImportant = 0;

myBitmap = CreateDIBSection(NULL, (BITMAPINFO *) &amp;bmih, 0, (void**)&amp;pBits, NULL, 0);
</code></pre>
<p>Funktioniert hervorragend und ich kann mit folgender Funktion rein zeichnen indem ich die DIBSection mit dem Handle &quot;myBackbuffer&quot; verknüpfe (wird später geblittet).</p>
<pre><code class="language-cpp">static void drawpoints(struct state *st) {
    for (int i = 0; i &lt; st-&gt;npoints; i++) {
        SetPixelV(myBackBuffer, st-&gt;pointbuf[i].x, st-&gt;pointbuf[i].y, st-&gt;colours[st-&gt;ccolour]);
    } 
    st-&gt;npoints = 0; // Pointbuffer zurücksetzen 
}
</code></pre>
<p>Allerdings ist mir SetPixel() verständlicherweise zu langsam. Daher versuche ich folgendes:</p>
<pre><code class="language-cpp">static void drawpoints(struct state *st) {
    int h2; // Hilfsvariable

    // Anzahl der Felder für eine Zeile berechnen (mach ich das richtig?)
    int Zeile = ((((bmih.biWidth * bmih.biBitCount) + 31) &amp; ~31) &gt;&gt; 3);

    for (int i = 0; i &lt; st-&gt;npoints; i++) {
        h2        = Zeile * st-&gt;pointbuf[i].y + (st-&gt;pointbuf[i].x * sizeof(COLORREF));
        // das sieht schon gut aus, allerdings noch mit Verschiebungen und Artefakten

        pBits[h2] = RGB(000,255,255); //pBits ist der Pointer auf die Daten der DIBSection
        // obwohl weiß angegeben zeichnet mein Programm alles Blau
	}

	st-&gt;npoints = 0;   // Pointbuffer zurücksetzen
}
</code></pre>
<p>Also ich kann aufgrund der ausgegebene Grafik erkennen, dass ich auf den richtigen Weg bin, aber gezeichnet wird alles in BLAU und mit einigen Artefakten und Verschiebungen.<br />
Hat sich nicht gerade jemand spontan abgelacht über meine Vorgehensweise? Na, dann her mit den guten Ideen <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/1155938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1155938</guid><dc:creator><![CDATA[timmix]]></dc:creator><pubDate>Mon, 16 Oct 2006 19:53:04 GMT</pubDate></item><item><title><![CDATA[Reply to CreateDIBSection klappt, und nun direkt reinzeichnen - wie? on Mon, 16 Oct 2006 20:16:02 GMT]]></title><description><![CDATA[<p>S K A N D A L Ö S!<br />
Ein einfaches Minuszeichen beseitigt schonmal die Artefakte und Verschiebungen! Mann, wie kann man eine API anbieten die mal &quot;top/right&quot; mal &quot;bottom/right&quot; mit positiven Werten arbeitet.</p>
<pre><code class="language-cpp">bmih.biHeight = -myScreenSize.bottom;  
//             ^^^
</code></pre>
<p>Bleibt nur noch zu klären, warum ich trotz Übergabe von RGB(255,255,255) alles in blau gezeichnet bekomme!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1155946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1155946</guid><dc:creator><![CDATA[timmix]]></dc:creator><pubDate>Mon, 16 Oct 2006 20:16:02 GMT</pubDate></item><item><title><![CDATA[Reply to CreateDIBSection klappt, und nun direkt reinzeichnen - wie? on Tue, 17 Oct 2006 08:17:00 GMT]]></title><description><![CDATA[<p>timmix schrieb:</p>
<blockquote>
<pre><code class="language-cpp">pBits[h2] = RGB(000,255,255); //pBits ist der Pointer auf die Daten der DIBSection
</code></pre>
</blockquote>
<p>Weil das nicht weiß ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1156069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1156069</guid><dc:creator><![CDATA[nicht du]]></dc:creator><pubDate>Tue, 17 Oct 2006 08:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to CreateDIBSection klappt, und nun direkt reinzeichnen - wie? on Tue, 17 Oct 2006 09:05:24 GMT]]></title><description><![CDATA[<p>nicht du schrieb:</p>
<blockquote>
<p>Weil das nicht weiß ist?</p>
</blockquote>
<p>Da hast du wohl recht, aber blau ist es immer noch nicht sondern Cyan (was nicht das richtige ist!).</p>
<p>So geht es:</p>
<pre><code class="language-cpp">int offset;
   int cxScanLine = ((((bmih.biWidth * bmih.biBitCount) + 31) &amp; ~31) &gt;&gt; 3);
   for (int i = 0; i &lt; st-&gt;npoints; i++) {
   offset =  (cxScanLine * st-&gt;pointbuf[i].y) + (st-&gt;pointbuf[i].x * (sizeof(BYTE)) * 4);

    pBits[offset]   = 0x00;  // 0x00bbggrr (!)
    pBits[offset++] = st-&gt;b[st-&gt;ccolour];
    pBits[offset++] = st-&gt;g[st-&gt;ccolour];
    pBits[offset++] = st-&gt;r[st-&gt;ccolour];
}
</code></pre>
<p>Richtig verstanden habe ich das noch nicht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1156099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1156099</guid><dc:creator><![CDATA[timmix]]></dc:creator><pubDate>Tue, 17 Oct 2006 09:05:24 GMT</pubDate></item></channel></rss>