<?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[Zwei fragen zum Thema GDI]]></title><description><![CDATA[<p>Hi!<br />
Ich möchte ein kleines Jump n Run programmieren um meine GDI kenntnisse etwas zu erweitern. Dazu habe ich zwei Fragen.</p>
<p>Frage 1:<br />
Wie kann man bestimmte bereiche in einem Bitmap Transparent machen? In vielen alten Voxel Spielen sieht man, dass dort bereiche die später mal durchsichtig sein sollen einfach mit Lila oder Blau markiert sind. Muss ich jetzt bei jeder Bewegung des Bitmaps mit einer Schleife jeden Pixel neu setzen, oder gibts da ne Funktion für? (Ich meine NICHT Alpha blending, sondern ein komplettes Entfernen des Bereiches!)</p>
<p>Frage 2:<br />
Wie kann ich einen bestimmten bereich aus einem Bitmap laden? Ich arbeite mit simplen animationen und sehe bei anderen Spielen oft, dass sie in einer Bitmap angeordnet sind. Ich möchte es möglichst - der übersicht wegen - vermeiden, für jede Animation ein eigenes Bitmap laden zu müssen.</p>
<p>Hier ist mal ein Beispielbild, wie ich es am Ende haben möchte:<br />
<a href="http://img236.imageshack.us/img236/2299/mario0zh.jpg" rel="nofollow">http://img236.imageshack.us/img236/2299/mario0zh.jpg</a></p>
<p>Das Ganze wird am Ende mit BitBlt geblittet. Hier etwas code als Beispiel:</p>
<pre><code class="language-cpp">void HintergrundZeichnen(HDC hdc)
{
	hdcPalmeBitmap = CreateCompatibleDC(hdc);
	hPalmeBitmap = LoadImage(NULL, &quot;D:\\Programme\\Microsoft Visual Studio\\MyProjects\\GFX\\Welt_Voxel\\Insel.bmp&quot;, IMAGE_BITMAP, 368, 66, LR_LOADFROMFILE);

	if(!hPalmeBitmap)
		MessageBox(0, &quot;Fehler beim Laden von Palme!&quot;, 0, 0);

	SelectObject(hdcPalmeBitmap, hPalmeBitmap);
	BitBlt(hdc, 0, 0, rCRect.right, rCRect.bottom, hdcPalmeBitmap, 0, 0, SRCCOPY);

	DeleteDC(hdcPalmeBitmap);
	DeleteObject(hPalmeBitmap);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/129995/zwei-fragen-zum-thema-gdi</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Jul 2026 13:16:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/129995.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 18 Dec 2005 18:41:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zwei fragen zum Thema GDI on Sun, 18 Dec 2005 18:41:30 GMT]]></title><description><![CDATA[<p>Hi!<br />
Ich möchte ein kleines Jump n Run programmieren um meine GDI kenntnisse etwas zu erweitern. Dazu habe ich zwei Fragen.</p>
<p>Frage 1:<br />
Wie kann man bestimmte bereiche in einem Bitmap Transparent machen? In vielen alten Voxel Spielen sieht man, dass dort bereiche die später mal durchsichtig sein sollen einfach mit Lila oder Blau markiert sind. Muss ich jetzt bei jeder Bewegung des Bitmaps mit einer Schleife jeden Pixel neu setzen, oder gibts da ne Funktion für? (Ich meine NICHT Alpha blending, sondern ein komplettes Entfernen des Bereiches!)</p>
<p>Frage 2:<br />
Wie kann ich einen bestimmten bereich aus einem Bitmap laden? Ich arbeite mit simplen animationen und sehe bei anderen Spielen oft, dass sie in einer Bitmap angeordnet sind. Ich möchte es möglichst - der übersicht wegen - vermeiden, für jede Animation ein eigenes Bitmap laden zu müssen.</p>
<p>Hier ist mal ein Beispielbild, wie ich es am Ende haben möchte:<br />
<a href="http://img236.imageshack.us/img236/2299/mario0zh.jpg" rel="nofollow">http://img236.imageshack.us/img236/2299/mario0zh.jpg</a></p>
<p>Das Ganze wird am Ende mit BitBlt geblittet. Hier etwas code als Beispiel:</p>
<pre><code class="language-cpp">void HintergrundZeichnen(HDC hdc)
{
	hdcPalmeBitmap = CreateCompatibleDC(hdc);
	hPalmeBitmap = LoadImage(NULL, &quot;D:\\Programme\\Microsoft Visual Studio\\MyProjects\\GFX\\Welt_Voxel\\Insel.bmp&quot;, IMAGE_BITMAP, 368, 66, LR_LOADFROMFILE);

	if(!hPalmeBitmap)
		MessageBox(0, &quot;Fehler beim Laden von Palme!&quot;, 0, 0);

	SelectObject(hdcPalmeBitmap, hPalmeBitmap);
	BitBlt(hdc, 0, 0, rCRect.right, rCRect.bottom, hdcPalmeBitmap, 0, 0, SRCCOPY);

	DeleteDC(hdcPalmeBitmap);
	DeleteObject(hPalmeBitmap);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/945048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/945048</guid><dc:creator><![CDATA[Perner]]></dc:creator><pubDate>Sun, 18 Dec 2005 18:41:30 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei fragen zum Thema GDI on Sun, 18 Dec 2005 18:54:37 GMT]]></title><description><![CDATA[<ol>
<li>Du suchst vermutlich <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_2y9g.asp" rel="nofollow">TransparentBlt</a></li>
<li>Du kannst bei BitBlt und TransparentBlt doch angeben welchen Bereich du an welche Position blitten willst ?</li>
</ol>
<p>Bei deinem Beispiel-Mario z.B.:</p>
<pre><code class="language-cpp">TransparentBlt(destDC,HierHinX,HierHinY,BreiteVonEinemMario,Höhe,marioDC,Frame*BreiteVonEinemMario,0,BreiteVonEinemMario,Höhe,FarbeDieTransparentSeinSoll);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/945058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/945058</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sun, 18 Dec 2005 18:54:37 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei fragen zum Thema GDI on Sun, 18 Dec 2005 18:54:20 GMT]]></title><description><![CDATA[<p>Anscheinend nicht. Ich habe es schon versucht, allerdings wird dann das komplette bitmap im Bereich wo meine Spielfigur normalerweise ist gestaucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/945063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/945063</guid><dc:creator><![CDATA[Perner]]></dc:creator><pubDate>Sun, 18 Dec 2005 18:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei fragen zum Thema GDI on Sun, 18 Dec 2005 19:01:17 GMT]]></title><description><![CDATA[<p>Ich vermute mal du machst pro Frame:<br />
Jedesmal Hintergrund zeichnen und dann die Figuren etc. zeichnen ?<br />
Wenn du die Hintergrund-Bitmap in HintergrundZeichnen() jedesmal neu lädst, zieht das nicht enorm Performance ?</p>
<p>Wäre is nicht sinnvoller die Zeilen:</p>
<pre><code class="language-cpp">hdcPalmeBitmap = CreateCompatibleDC(hdc);
    hPalmeBitmap = LoadImage(NULL, &quot;D:\\Programme\\Microsoft Visual Studio\\MyProjects\\GFX\\Welt_Voxel\\Insel.bmp&quot;, IMAGE_BITMAP, 368, 66, LR_LOADFROMFILE);
</code></pre>
<p>in eine GameInit() oder so zu packen ?</p>
<p>und</p>
<pre><code class="language-cpp">DeleteDC(hdcPalmeBitmap);
    DeleteObject(hPalmeBitmap);
</code></pre>
<p>in eine GameCleanup() oder so ?</p>
<p>Das Bitmap laden dauert doch oft einiges länger als BitBlt() ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/945066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/945066</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sun, 18 Dec 2005 19:01:17 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei fragen zum Thema GDI on Sun, 18 Dec 2005 19:19:03 GMT]]></title><description><![CDATA[<p>Hmm mag sein. Es sind meine ersten Gehversuche mit der GDI. Thx für die Tipps, hätt ich eigentlich selber drauf kommen müssen mit dem Init. ^^<br />
Den Hintergrund zeichne ich in WM_PAINT immer neu. Mache ich das nicht, gibt es Schlieren und der Hintergrund ist weg, wenn ich ein anderes fenster über das Spiel geschoben habe. TransparentBlt funktioniert wunderbar, thx. <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>
<p>Bloß mit dem Bereich aus Bitmap laden bin ich noch am basteln, hmm...<br />
So siehts im moment aus:<br />
<a href="http://img414.imageshack.us/img414/1096/cp12pf.jpg" rel="nofollow">http://img414.imageshack.us/img414/1096/cp12pf.jpg</a><br />
o_O</p>
<p>Und so soll es aussehen:<br />
<a href="http://img414.imageshack.us/img414/6398/cp21jp.jpg" rel="nofollow">http://img414.imageshack.us/img414/6398/cp21jp.jpg</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/945083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/945083</guid><dc:creator><![CDATA[Perner]]></dc:creator><pubDate>Sun, 18 Dec 2005 19:19:03 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei fragen zum Thema GDI on Sun, 18 Dec 2005 19:23:33 GMT]]></title><description><![CDATA[<p>Hat sich erledigt, ich hab den Fehler gefunden. Ich hatte die Bitmap mit falschen abmessungen geladen.</p>
<pre><code>hDrawBitmap = LoadImage(NULL, &quot;D:\\Programme\\Microsoft Visual Studio\\MyProjects\\GFX\\Mario_Voxel\\Mario.bmp&quot;, IMAGE_BITMAP, 90, 44, LR_LOADFROMFILE);
	SelectObject(hdcMarioBitmap, hDrawBitmap);
	TransparentBlt(hdc, 120, 162, 28, 38, hdcMarioBitmap, 28, 0, 29, 39, RGB(255, 0, 255));
</code></pre>
<p>Ich habe die Gesamtbitmap, welche 90x44 groß ist, ausversehen mit 28x38 geladen. Sie wurde deshalb wohl gestaucht. Funktioniert jetzt alles wunderbar. <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>Ach ich liebe dieses Forum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/945089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/945089</guid><dc:creator><![CDATA[Perner]]></dc:creator><pubDate>Sun, 18 Dec 2005 19:23:33 GMT</pubDate></item></channel></rss>