<?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[Bitmap bewegen]]></title><description><![CDATA[<p>Ich arbeite zur zeit an einem eigenen Bildschirmschoner. Dieser soll ein Bild über den Bildschirm bewegen. Nun habe ich dabei leider ein Problem:</p>
<p>und zwar bewegt sicher das Bild zwar am anfang ohne Probleme über den Bilschirm, aber irgendwann hört es einfach auf. Ich habe mir auch schon anzeigen lassen ob sich die X und Y pos immer schön erhöht (alle 10millisekunden) und das tuen sie auch. Nur passiert einfach nichts mehr. Hier mal der Auschnitt der die X und Y Position erhöht und das Bitmap anzeigt:</p>
<pre><code class="language-cpp">case WM_TIMER:
        //Bitmap laden und setzen
	hR4a = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_R4a));
	SelectObject (hdc2, hR4a);
	BitBlt (hdc1, pos.X, pos.Y, 327, 240, hdc2, 0, 0, SRCCOPY) ;

	switch(run)
	{
	//nach Rechts bewegen
	case 1:
		if(pos.X &lt; r-327)
		{
			pos.X = pos.X+1;
		} else {
			if(run &lt; 5)
		        {
			        run += 1;
				InvalidateRect(hWnd, NULL, true);
			} else {
				run = 1;
			}
		}
		break;
	//nach unten bewegen
	case 2:
		if(pos.Y &lt; u-240)
		{
			pos.Y = pos.Y+1;
		} else {
			if(run &lt; 5)
			{
				run += 1;
				InvalidateRect(hWnd, NULL, true);
			} else {
				run = 1;
			}
		}
		break;
	//nach links bewegen
	case 3:
		if(pos.X &gt; l)
		{
			pos.X = pos.X-1;
		} else {
			if(run &lt; 5)
			{
				run += 1;
				InvalidateRect(hWnd, NULL, true);
			} else {
				run = 1;
			}
		}
		break;
	//nach oben bewegen
	case 4:
		if(pos.Y &gt; o)
		{
			pos.Y = pos.Y-1;
		} else {
			if(run &lt; 5)
			{
				run += 1;
				InvalidateRect(hWnd, NULL, true);
			} else {
				run = 1;
			}
		}
		break;
	}
	break;
</code></pre>
<p>Kurze erklärung: Es bewgt das Bitmap in einem Rechteck mit einem abstand von 100px vom Bildschirmrand. es fängt bei der Pos x=100 und y=100 an und läuft so lange nach Rechts bis es 100px vom rechten Rand entfernt ist. Dann sollte es sich nach unten bewegen bis es vom unteren rand auch 100px entfernt ist. aber so weit kommt es nicht da es aufhört sich zu bewegen</p>
<p>ich hoffe ihr könnt mir helfen</p>
<p>mfg dimo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/238182/bitmap-bewegen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 06 Apr 2026 22:04:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/238182.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Apr 2009 15:02:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bitmap bewegen on Tue, 07 Apr 2009 15:02:36 GMT]]></title><description><![CDATA[<p>Ich arbeite zur zeit an einem eigenen Bildschirmschoner. Dieser soll ein Bild über den Bildschirm bewegen. Nun habe ich dabei leider ein Problem:</p>
<p>und zwar bewegt sicher das Bild zwar am anfang ohne Probleme über den Bilschirm, aber irgendwann hört es einfach auf. Ich habe mir auch schon anzeigen lassen ob sich die X und Y pos immer schön erhöht (alle 10millisekunden) und das tuen sie auch. Nur passiert einfach nichts mehr. Hier mal der Auschnitt der die X und Y Position erhöht und das Bitmap anzeigt:</p>
<pre><code class="language-cpp">case WM_TIMER:
        //Bitmap laden und setzen
	hR4a = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_R4a));
	SelectObject (hdc2, hR4a);
	BitBlt (hdc1, pos.X, pos.Y, 327, 240, hdc2, 0, 0, SRCCOPY) ;

	switch(run)
	{
	//nach Rechts bewegen
	case 1:
		if(pos.X &lt; r-327)
		{
			pos.X = pos.X+1;
		} else {
			if(run &lt; 5)
		        {
			        run += 1;
				InvalidateRect(hWnd, NULL, true);
			} else {
				run = 1;
			}
		}
		break;
	//nach unten bewegen
	case 2:
		if(pos.Y &lt; u-240)
		{
			pos.Y = pos.Y+1;
		} else {
			if(run &lt; 5)
			{
				run += 1;
				InvalidateRect(hWnd, NULL, true);
			} else {
				run = 1;
			}
		}
		break;
	//nach links bewegen
	case 3:
		if(pos.X &gt; l)
		{
			pos.X = pos.X-1;
		} else {
			if(run &lt; 5)
			{
				run += 1;
				InvalidateRect(hWnd, NULL, true);
			} else {
				run = 1;
			}
		}
		break;
	//nach oben bewegen
	case 4:
		if(pos.Y &gt; o)
		{
			pos.Y = pos.Y-1;
		} else {
			if(run &lt; 5)
			{
				run += 1;
				InvalidateRect(hWnd, NULL, true);
			} else {
				run = 1;
			}
		}
		break;
	}
	break;
</code></pre>
<p>Kurze erklärung: Es bewgt das Bitmap in einem Rechteck mit einem abstand von 100px vom Bildschirmrand. es fängt bei der Pos x=100 und y=100 an und läuft so lange nach Rechts bis es 100px vom rechten Rand entfernt ist. Dann sollte es sich nach unten bewegen bis es vom unteren rand auch 100px entfernt ist. aber so weit kommt es nicht da es aufhört sich zu bewegen</p>
<p>ich hoffe ihr könnt mir helfen</p>
<p>mfg dimo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1692395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1692395</guid><dc:creator><![CDATA[Dimo]]></dc:creator><pubDate>Tue, 07 Apr 2009 15:02:36 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap bewegen on Tue, 07 Apr 2009 17:00:57 GMT]]></title><description><![CDATA[<p>Ist denn die if-Bedingung im unten-case erfüllt? Setze doch mal einen Breakpoint auf diesen case und überprüfe die betreffenden Werte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1692457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1692457</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Tue, 07 Apr 2009 17:00:57 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap bewegen on Tue, 07 Apr 2009 19:59:47 GMT]]></title><description><![CDATA[<p>welchen case meinst du jetzt genau...der Fehler müsste doch wenn dann in diesem liegen:</p>
<pre><code class="language-cpp">//nach unten bewegen
    case 2:
        if(pos.Y &lt; u-240)
        {
            pos.Y = pos.Y+1;
        } else {
            if(run &lt; 5)
            {
                run += 1;
                InvalidateRect(hWnd, NULL, true);
            } else {
                run = 1;
            }
        }
        break;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1692546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1692546</guid><dc:creator><![CDATA[Dimo]]></dc:creator><pubDate>Tue, 07 Apr 2009 19:59:47 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap bewegen on Wed, 08 Apr 2009 06:24:59 GMT]]></title><description><![CDATA[<p>Den mein ich. Setz doch einfach mal einen Breakpoint (Haltepunkt) an diese Stelle, gehe schrittweise (F10, F11) mit dem Debugger durch, und überprüfe Ablauf und Variableninhalte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1692637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1692637</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 08 Apr 2009 06:24:59 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap bewegen on Wed, 08 Apr 2009 08:42:13 GMT]]></title><description><![CDATA[<p>also:<br />
pos.X erhör sich nicht muss es aber ja auch nicht<br />
pos.Y erhöht sich immer schön weiter<br />
run is wie es sein muss 2</p>
<p>Nur das Bitmap bewegt sich nicht mehr. Kann das auch an was anderem liegen? Ich denke eher es liegt irgendwie daran das ich das Bitmap immer wieder neu lade, aber wenn ich das nicht mache wird es nicht angezeigt. Gibt es auch eine andere Methode das Bitmap anzuzeigen?</p>
<p>mfg Dimo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1692694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1692694</guid><dc:creator><![CDATA[Dimo]]></dc:creator><pubDate>Wed, 08 Apr 2009 08:42:13 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap bewegen on Wed, 08 Apr 2009 11:46:40 GMT]]></title><description><![CDATA[<p>Dimo schrieb:</p>
<blockquote>
<p>Ich denke eher es liegt irgendwie daran das ich das Bitmap immer wieder neu lade</p>
</blockquote>
<p>Gibst Du das Bitmap auch nach Gebrauch (und vor allem VOR dem neuen Laden!) wieder frei?</p>
<p>Grundsätzlich: Ich denke mal, daß nur ein einziges mal Laden des Bitmaps zu Beginn (z.B. bei der Initialisierung) nötig ist. Ein ständiges Nachladen ist meiner Meinung nach unnötig.<br />
(Ich gehe davon aus, Du redest von einem Bitmap, das immer gleich bleibt?)</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1692810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1692810</guid><dc:creator><![CDATA[Mmacher]]></dc:creator><pubDate>Wed, 08 Apr 2009 11:46:40 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap bewegen on Wed, 08 Apr 2009 12:23:46 GMT]]></title><description><![CDATA[<p>Mmacher hat Recht, das ständige Bitmap-Laden ist nicht nötig (einmal bei Programmstart reicht). Btw, sieh dir mal die Doku zu SelectObject an. Die Funktion hat auch einen Rückgabewert (altes Objekt speichern, um es später wieder zu setzen...).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1692835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1692835</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 08 Apr 2009 12:23:46 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap bewegen on Wed, 08 Apr 2009 15:32:01 GMT]]></title><description><![CDATA[<p>normalerweise funktioniert des auch mit dem einmal laden und immer wieder neu an zeigen, aber ich mache einen Bildschirmschoner und da funktioniert alles etwas anders. So ist das wohl auch mit dem. Es funktioniert nur wenn ich es jedesmal neu lade.</p>
<p>Jetzt ist noch ein problem: entweder ich finde es nicht oder es steht nicht drin, aber wie gebe ich das BITMAP wieder frei?? Dann könnte ich es mal damit versuchen.</p>
<p>mfg Dimo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1692957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1692957</guid><dc:creator><![CDATA[Dimo]]></dc:creator><pubDate>Wed, 08 Apr 2009 15:32:01 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap bewegen on Wed, 08 Apr 2009 15:50:44 GMT]]></title><description><![CDATA[<p>Dimo schrieb:</p>
<blockquote>
<p>normalerweise funktioniert des auch mit dem einmal laden und immer wieder neu an zeigen, aber ich mache einen Bildschirmschoner und da funktioniert alles etwas anders. So ist das wohl auch mit dem. Es funktioniert nur wenn ich es jedesmal neu lade.</p>
</blockquote>
<p>Glaub ich nicht.</p>
<p>Dimo schrieb:</p>
<blockquote>
<p>Jetzt ist noch ein problem: entweder ich finde es nicht oder es steht nicht drin, aber wie gebe ich das BITMAP wieder frei?? Dann könnte ich es mal damit versuchen.</p>
</blockquote>
<p>Steht wohl drin, zumindest in der Doku zur Funktion. Fragt sich, wo du nachsiehst. <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>Microsoft schrieb:</p>
<blockquote>
<p>The application must call the DeleteObject function to delete each bitmap handle returned by the LoadBitmap function.</p>
</blockquote>
<p>Komplett hier:</p>
<p><a href="http://msdn.microsoft.com/en-us/library/dd145033(VS.85).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/dd145033(VS.85).aspx</a></p>
<p>Sonst kriegst du wahrscheinlich irgendwann ein Problem mit dem Speicher, oder zu vielen GDI-Handles, oder wasweißich...</p>
<p>Und denke daran, dir die Doku zu SelectObject nochmal anzusehen (so mit altem Objekt des Typs speichern und wieder 'reinselektieren und so...).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1692969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1692969</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 08 Apr 2009 15:50:44 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap bewegen on Wed, 08 Apr 2009 19:19:18 GMT]]></title><description><![CDATA[<p>also zu dem ersten...ich kanns auch net glauben aber das ein oder andere will nicht so wies normalerweise funktioniert.</p>
<p>zu DeleteObject: habs schon geafunden..habe es aus irgend einem Grund überlesen...musste aber leider vorher weg und hatte keine Zeit mehr des zu schreiben...werde es noch testen</p>
<p>mfg Dimo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1693083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1693083</guid><dc:creator><![CDATA[Dimo]]></dc:creator><pubDate>Wed, 08 Apr 2009 19:19:18 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap bewegen on Wed, 08 Apr 2009 20:47:54 GMT]]></title><description><![CDATA[<p>Ständing neu Laden ist <strong>schlecht</strong>.</p>
<p>ich versuchs mal aus dem kopf hinzubekommen</p>
<pre><code class="language-cpp">HBITMAP hbitmap;
BITMAP bmpinfo;
int WINAPI WinMain(...)
{
    CreateWindow(...)

    hbitmap = LoadBitmap
    GetObject(hbitmap, sizeof(bitmapinfo), &amp;bitmapinfo);
    SetTimer(...)
    MessageLoop(...)
}
WNDPROC:

WM_TIMER:

const unsigned abstand = 100;
switch (run % 4)
{
case 0:
    ++pos.x;
    run += pos.x + bmpinfo.width / 2 + abstand &gt; width;
    break;
case 1:
    ++pos.y;
    run += pos.y + bmpinfo.height / 2 + abstand &gt; height;
    break;
case 2:
    --pos.x;
    run += pos.x - bmpinfo.width / 2 - anstand &gt; 0;
    break;
case 3:
    --pos.y;
    run += pos.y - bmpinfo.height / 2 - abstand &gt; 0;
    break;
}
InvalidateRect(hWnd, 0, 1);

WM_PAINT

PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &amp;ps);

HDC memdc = CreateCompatibleDC(hdc);
HGDIOBJ old = SelectObject(memdc, hbitmap);

BitBlt(...)

SelectObject(memdc, old);
DeleteDC(memdc);

EndPaint(hWnd, &amp;ps);
</code></pre>
<p>so im groben sollte das funktionieren <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/1693136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1693136</guid><dc:creator><![CDATA[helferlein]]></dc:creator><pubDate>Wed, 08 Apr 2009 20:47:54 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap bewegen on Thu, 09 Apr 2009 11:52:43 GMT]]></title><description><![CDATA[<p>also: ich habs mit DeleteObeject versucht, aber es stoppt immer noch.</p>
<p>des mit dem einmal laden will ja nicht qwarum auch immer. Außerdem ist ein Bildschirmschoner anders aufgebaut wie ein normales Programm</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1693425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1693425</guid><dc:creator><![CDATA[Dimo]]></dc:creator><pubDate>Thu, 09 Apr 2009 11:52:43 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap bewegen on Thu, 09 Apr 2009 14:39:20 GMT]]></title><description><![CDATA[<p>Dimo schrieb:</p>
<blockquote>
<p>des mit dem einmal laden will ja nicht qwarum auch immer. Außerdem ist ein Bildschirmschoner anders aufgebaut wie ein normales Programm</p>
</blockquote>
<p>Ja wie machst du das denn? Zeig mal deinen Versuch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1693552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1693552</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 09 Apr 2009 14:39:20 GMT</pubDate></item></channel></rss>