<?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[Linien über Maus zeichnen]]></title><description><![CDATA[<p>Neues Jahr, neues Problem ....<br />
Ich lese grad ein Buch, in dem Grad das zeichnen von einfachen Linien behandelt wird. Jetzt wollte ich in wenig kreativ sein und den Benutzer durch Mausclicks<br />
solche Linie zeichen lassen. Also bei einem Linksclick soll die Position der Maus beim click gespeichert werden und dann bei jeder Mausbewegung vom Startpunkt bis zur aktuellen Mausposition eine Linie gezeichnet werden. Bei einem Rechtsclick soll dann die Linie sozusagen &quot;losgelassen&quot; werden also nicht weiter bei mousemove bis zur Mausposition gehen. Naja die Erklärung war etwas schwammig, aber ich denke der Code zeigt zumindest grob was ich erreichen möchte:</p>
<pre><code class="language-cpp">HDC hdc;
	PAINTSTRUCT ps;

	static bool FirstClick;
	static POINT StartingPoint;
	static POINT MousePoint;

    switch(message)
    {
	case WM_CREATE:
		{
			FirstClick = true;
			return 0;
		}
		case WM_MOUSEMOVE:
			{
				if(FirstClick = false)
				{
					MousePoint.x = LOWORD(lParam);
					MousePoint.y = HIWORD(lParam);
					PostMessage(hWnd, WM_PAINT, NULL, NULL);
				}
				return 0;
			}
		case WM_RBUTTONUP:
			{
				FirstClick = true;
				return 0;
			}
		case WM_LBUTTONUP:
			{
				if(FirstClick = true)
				{
					FirstClick = false;
				}
				StartingPoint.x = LOWORD(lParam);
				StartingPoint.y = HIWORD(lParam);
				return 0;
			}
		case WM_PAINT:
			{
				hdc = BeginPaint(hWnd, &amp;ps);
				HPEN Pen1 = CreatePen(PS_SOLID, 4, RGB(0,0,0));
				SelectObject(hdc, Pen1);
				MoveToEx(hdc, StartingPoint.x, StartingPoint.y, NULL);
				LineTo(hdc, MousePoint.x, MousePoint.y);
				DeleteObject(Pen1);
				EndPaint(hWnd, &amp;ps);
				return 0;
			}
</code></pre>
<p>Das Problem besteht einfach darin, dass keine Linie zu sehen ist. Ich habe aber leider keine Ahnung wieso, schließlich wird WM_PAINT ja von mousemove gepostet und sollte dann doch auch richtig bearbeitet werden oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Ich hoffe ihr könnt mir da helfen</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/201587/linien-über-maus-zeichnen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 04:20:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201587.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Jan 2008 18:41:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Linien über Maus zeichnen on Tue, 01 Jan 2008 18:41:30 GMT]]></title><description><![CDATA[<p>Neues Jahr, neues Problem ....<br />
Ich lese grad ein Buch, in dem Grad das zeichnen von einfachen Linien behandelt wird. Jetzt wollte ich in wenig kreativ sein und den Benutzer durch Mausclicks<br />
solche Linie zeichen lassen. Also bei einem Linksclick soll die Position der Maus beim click gespeichert werden und dann bei jeder Mausbewegung vom Startpunkt bis zur aktuellen Mausposition eine Linie gezeichnet werden. Bei einem Rechtsclick soll dann die Linie sozusagen &quot;losgelassen&quot; werden also nicht weiter bei mousemove bis zur Mausposition gehen. Naja die Erklärung war etwas schwammig, aber ich denke der Code zeigt zumindest grob was ich erreichen möchte:</p>
<pre><code class="language-cpp">HDC hdc;
	PAINTSTRUCT ps;

	static bool FirstClick;
	static POINT StartingPoint;
	static POINT MousePoint;

    switch(message)
    {
	case WM_CREATE:
		{
			FirstClick = true;
			return 0;
		}
		case WM_MOUSEMOVE:
			{
				if(FirstClick = false)
				{
					MousePoint.x = LOWORD(lParam);
					MousePoint.y = HIWORD(lParam);
					PostMessage(hWnd, WM_PAINT, NULL, NULL);
				}
				return 0;
			}
		case WM_RBUTTONUP:
			{
				FirstClick = true;
				return 0;
			}
		case WM_LBUTTONUP:
			{
				if(FirstClick = true)
				{
					FirstClick = false;
				}
				StartingPoint.x = LOWORD(lParam);
				StartingPoint.y = HIWORD(lParam);
				return 0;
			}
		case WM_PAINT:
			{
				hdc = BeginPaint(hWnd, &amp;ps);
				HPEN Pen1 = CreatePen(PS_SOLID, 4, RGB(0,0,0));
				SelectObject(hdc, Pen1);
				MoveToEx(hdc, StartingPoint.x, StartingPoint.y, NULL);
				LineTo(hdc, MousePoint.x, MousePoint.y);
				DeleteObject(Pen1);
				EndPaint(hWnd, &amp;ps);
				return 0;
			}
</code></pre>
<p>Das Problem besteht einfach darin, dass keine Linie zu sehen ist. Ich habe aber leider keine Ahnung wieso, schließlich wird WM_PAINT ja von mousemove gepostet und sollte dann doch auch richtig bearbeitet werden oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Ich hoffe ihr könnt mir da helfen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428928</guid><dc:creator><![CDATA[Hans_a_Supasta]]></dc:creator><pubDate>Tue, 01 Jan 2008 18:41:30 GMT</pubDate></item><item><title><![CDATA[Reply to Linien über Maus zeichnen on Tue, 01 Jan 2008 22:45:26 GMT]]></title><description><![CDATA[<p>Hm, probier als allererstes mal, alle</p>
<pre><code>if(FirstClick = true)
</code></pre>
<p>durch</p>
<pre><code>if(FirstClick == true)
</code></pre>
<p>oder</p>
<pre><code>if(FirstClick)
</code></pre>
<p>zu ersetzen. Das = bewirkt auch in einer Abfrage eine Zuweisung und hat als Ergebnis true zur Folge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429008</guid><dc:creator><![CDATA[AlexB]]></dc:creator><pubDate>Tue, 01 Jan 2008 22:45:26 GMT</pubDate></item><item><title><![CDATA[Reply to Linien über Maus zeichnen on Tue, 01 Jan 2008 22:54:33 GMT]]></title><description><![CDATA[<p>Shit... dachte sowas würde mir ncithmehr passieren <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="😞"
    /><br />
Aber irgendwie wird immernoch nicht gezeichnet.. da muss noch was sein -.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429009</guid><dc:creator><![CDATA[Hans_a_Supasta]]></dc:creator><pubDate>Tue, 01 Jan 2008 22:54:33 GMT</pubDate></item><item><title><![CDATA[Reply to Linien über Maus zeichnen on Tue, 01 Jan 2008 23:13:27 GMT]]></title><description><![CDATA[<p>Hast du diesen Fehler auch in WM_MOUSEMOVE verbessert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429013</guid><dc:creator><![CDATA[Moadeh]]></dc:creator><pubDate>Tue, 01 Jan 2008 23:13:27 GMT</pubDate></item><item><title><![CDATA[Reply to Linien über Maus zeichnen on Wed, 02 Jan 2008 07:26:02 GMT]]></title><description><![CDATA[<p>Ohne Aufruf von SetCapture wirst Du evtl. die WM_LBUTTONUP Nachricht nicht erhalten, wenn der User die Maus außerhalb des Fensters bewegt.</p>
<p>Bitte ReleaseCapture nicht vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429081</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 02 Jan 2008 07:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to Linien über Maus zeichnen on Wed, 02 Jan 2008 10:19:47 GMT]]></title><description><![CDATA[<p>Also mir ist aufgefallen, dass die Linie erst gezeichnet wird wenn ich zB. die Fenstergröße verändere. Jetzt hab ich gedacht, dass</p>
<pre><code class="language-cpp">PostMessage(hWnd, WM_PAINT, NULL, NULL);
</code></pre>
<p>aus irgend einem Grund nicht funktionieren würde, also Rückgabe Wert geprüft ob er 0 ist und dann per MessageBox eine Meldung ausgegeben. Allerdings scheint die Funktion erfolgreich zusein, obwohl kein WM_PAINT ausgeführt wird. Hat jemand ne Ahnung wodran das liegen könnte?</p>
<p>Ich hab mal eine zweiten Lösungsweg versucht, der direkt in MOUSE_MOVE zeichnet:</p>
<pre><code class="language-cpp">case WM_MOUSEMOVE:
			{
				if(FirstClick == false)
				{
					MousePoint.x = LOWORD(lParam);
					MousePoint.y = HIWORD(lParam);
					hdc = GetDC(hWnd);
					HPEN Pen1 = CreatePen(PS_SOLID, 4, RGB(0,0,0));
					SelectObject(hdc, Pen1);
					MoveToEx(hdc, StartingPoint.x, StartingPoint.y, NULL);
					LineTo(hdc, MousePoint.x, MousePoint.y);
					DeleteObject(Pen1);
					ReleaseDC(hWnd, hdc);
				}
				return 0;
			}
</code></pre>
<p>Da ist jetzt das Problem, dass bei jeder mausbewegnung eine Linie gezeichnet wird. Soweit noch richtig, aber ich möchte ja, dass die alten Linien gelöscht werden. Also hab ich das mit einem</p>
<pre><code class="language-cpp">InvalidateRect(hWnd, 0, true);
</code></pre>
<p>vor dem ganzen zeichnen versucht. Jetzt sehe ich aber garkeine Linien mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>Ich weiß echt nicht wieso das immernoch nicht funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429148</guid><dc:creator><![CDATA[Hans_a_Supasta]]></dc:creator><pubDate>Wed, 02 Jan 2008 10:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to Linien über Maus zeichnen on Wed, 02 Jan 2008 11:52:44 GMT]]></title><description><![CDATA[<p>1. WM_PAINT wird nicht gepostet und sollte niemals gepostet werden:<br />
<a href="http://blog.m-ri.de/index.php/2007/12/24/die-unsitte-windows-interne-nachrichten-zu-versenden/" rel="nofollow">http://blog.m-ri.de/index.php/2007/12/24/die-unsitte-windows-interne-nachrichten-zu-versenden/</a><br />
in Deinem Fall heißt das bitte InvalidateRect zu nutzen, oder RedrawWindow.</p>
<p>2. Du hast noch nicht verstanden wie Windows funktioniert.<br />
Ein Fenster wird nur im WM_PAINT Handler gezeichnet. Und Du musst selbst dafür sorgen, dass die Daten korrekt gezeichnet werden wenn WM_PAINT aufgerufen wird.<br />
So hast Du es auch gemacht. Gut so.<br />
Wenn Du aber selber das Fenster änderrst musst Du auch InvalidateRect aufrufen (d.h. in WM_MOUSEMOVE und WM_LBUTTONUP).</p>
<p>Alter Fensterinhalt wird nicht durch Windows irgendwie zwischengespeichert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429206</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 02 Jan 2008 11:52:44 GMT</pubDate></item><item><title><![CDATA[Reply to Linien über Maus zeichnen on Wed, 02 Jan 2008 12:31:25 GMT]]></title><description><![CDATA[<p>Ok, danke. Das hat geholfen. Funktioniert jetzt im Grunde. Den rest schaffe ich wohl alleine, sonst poste ich nochmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429244</guid><dc:creator><![CDATA[Hans_a_Supasta]]></dc:creator><pubDate>Wed, 02 Jan 2008 12:31:25 GMT</pubDate></item></channel></rss>