<?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[[vc6] Linie&#x2F;Polygon zeichnen ohne GDI+]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Ich muss eine Linie, bzw. später ein Polygon, zeichnen einzig mit C++ u. MFC. Fragt bitte nicht warum, is einfach so.</p>
<p>Folgendes hab ich bisher:</p>
<pre><code>void CView::OnLButtonDown(UINT nFlags, CPoint point)
{
  m_down = point;			
  SetCapture();
}
</code></pre>
<pre><code>void CView::OnMouseMove(UINT nFlags, CPoint point)
{
  ClientDC dc(this);
  CRect rect ( m_down.x, m_down.y, m_last.x, m_last.y );
  dcMoveTo ( rect.TopLeft() );
  dc.LineTo ( rect.BottomRight() );
  m_last = point;
}
</code></pre>
<pre><code>void CView::OnLButtonUp(UINT nFlags, CPoint point)
{
  ::ReleaseCapture();
}
</code></pre>
<p>Is natürlich nur das wensentliche. Die m_-Komponenten sind vom Typ CPoint.</p>
<p>Folgendes tritt auf:<br />
Mit jeder Mausbewegung wird eine neue Linie gezeichnet. Soll heissen, dass der gesamte Bildschirm bei ausgiebigen Kreisen mit der Maus voll gezeichnet wird.</p>
<p>Leider bin ich in Sachen MFC nicht unbedingt der Belesenste...Kann wer unter die Arme greifen?</p>
<p>m.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203704/vc6-linie-polygon-zeichnen-ohne-gdi</link><generator>RSS for Node</generator><lastBuildDate>Sun, 05 Apr 2026 20:41:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203704.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Jan 2008 14:02:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [vc6] Linie&#x2F;Polygon zeichnen ohne GDI+ on Fri, 25 Jan 2008 14:02:52 GMT]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Ich muss eine Linie, bzw. später ein Polygon, zeichnen einzig mit C++ u. MFC. Fragt bitte nicht warum, is einfach so.</p>
<p>Folgendes hab ich bisher:</p>
<pre><code>void CView::OnLButtonDown(UINT nFlags, CPoint point)
{
  m_down = point;			
  SetCapture();
}
</code></pre>
<pre><code>void CView::OnMouseMove(UINT nFlags, CPoint point)
{
  ClientDC dc(this);
  CRect rect ( m_down.x, m_down.y, m_last.x, m_last.y );
  dcMoveTo ( rect.TopLeft() );
  dc.LineTo ( rect.BottomRight() );
  m_last = point;
}
</code></pre>
<pre><code>void CView::OnLButtonUp(UINT nFlags, CPoint point)
{
  ::ReleaseCapture();
}
</code></pre>
<p>Is natürlich nur das wensentliche. Die m_-Komponenten sind vom Typ CPoint.</p>
<p>Folgendes tritt auf:<br />
Mit jeder Mausbewegung wird eine neue Linie gezeichnet. Soll heissen, dass der gesamte Bildschirm bei ausgiebigen Kreisen mit der Maus voll gezeichnet wird.</p>
<p>Leider bin ich in Sachen MFC nicht unbedingt der Belesenste...Kann wer unter die Arme greifen?</p>
<p>m.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443465</guid><dc:creator><![CDATA[m.trix]]></dc:creator><pubDate>Fri, 25 Jan 2008 14:02:52 GMT</pubDate></item><item><title><![CDATA[Reply to [vc6] Linie&#x2F;Polygon zeichnen ohne GDI+ on Fri, 25 Jan 2008 14:19:11 GMT]]></title><description><![CDATA[<p>m.trix schrieb:</p>
<blockquote>
<p>Folgendes tritt auf:<br />
Mit jeder Mausbewegung wird eine neue Linie gezeichnet. Soll heissen, dass der gesamte Bildschirm bei ausgiebigen Kreisen mit der Maus voll gezeichnet wird.</p>
<p>Leider bin ich in Sachen MFC nicht unbedingt der Belesenste...Kann wer unter die Arme greifen?</p>
<p>m.</p>
</blockquote>
<p>Jo klar, genau das hast du oben ja auch programmiert. <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="🙂"
    /><br />
Wenn du die Linie nur dann malen willst, wenn die Maustaste losgelassen wird, dann wüde ich alles aus OnMouseMove in OnLButtonUp verlagern.</p>
<p>PS: Das wohl genialste Tutorial zum Zeichnen mit MFC: <a href="http://msdn2.microsoft.com/en-us/library/aa716528.aspx" rel="nofollow">Scribble</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443476</guid><dc:creator><![CDATA[estartu]]></dc:creator><pubDate>Fri, 25 Jan 2008 14:19:11 GMT</pubDate></item><item><title><![CDATA[Reply to [vc6] Linie&#x2F;Polygon zeichnen ohne GDI+ on Fri, 25 Jan 2008 14:25:46 GMT]]></title><description><![CDATA[<p>Hallo estartu!</p>
<p>Richtig, so seh ich das auch. Was du vorschlägst hat aber den Nachteil, dass die Linie während die Maus bewegt wird nicht sichtbar ist. Soll sozusagen 'online' passieren. Wie bei Paint etc. wenn man Linien zeichnet.</p>
<p>Scribble hab ich mir auch schon angeschaut, geb dir recht das es wirklich gut ist. Mein Problem wird allerdings nicht behoben. Es gibt auch noch DRAWCLI aber da komm ich nicht völlig dahinter wie es da gemacht wird. Und wenn ich was nicht versteh kopier ichs nicht einfach.</p>
<p>m.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443489</guid><dc:creator><![CDATA[m.trix]]></dc:creator><pubDate>Fri, 25 Jan 2008 14:25:46 GMT</pubDate></item><item><title><![CDATA[Reply to [vc6] Linie&#x2F;Polygon zeichnen ohne GDI+ on Fri, 25 Jan 2008 14:47:35 GMT]]></title><description><![CDATA[<p>m.trix schrieb:</p>
<blockquote>
<p>Hallo estartu!</p>
<p>Richtig, so seh ich das auch. Was du vorschlägst hat aber den Nachteil, dass die Linie während die Maus bewegt wird nicht sichtbar ist. Soll sozusagen 'online' passieren. Wie bei Paint etc. wenn man Linien zeichnet.</p>
</blockquote>
<p>Da musst du dir glaubich die Position der letzten Linie merken und bevor du die neue malst, malst du die alte aber mit der Hintergrundfarbe. <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="🙂"
    /><br />
Wird nur dann kompliziert, wenn der Hintergrund nicht mehr nur eine leere Fläche ist sondern da z.B. schon eine Linie ist. Dann musst du dir wohl alle Linien merken und immer neu malen... das fängt dann aber wieder an zu flackern. Da gibts dann aber auch wieder Möglichkeiten das zu verhindern, ich glaube das Stichwort ist MemDC. <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="😕"
    /></p>
<p>Okay, und da hören meine Kenntnisse dann endgültig auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443507</guid><dc:creator><![CDATA[estartu]]></dc:creator><pubDate>Fri, 25 Jan 2008 14:47:35 GMT</pubDate></item><item><title><![CDATA[Reply to [vc6] Linie&#x2F;Polygon zeichnen ohne GDI+ on Fri, 25 Jan 2008 16:19:14 GMT]]></title><description><![CDATA[<p>m.trix schrieb:</p>
<blockquote>
<p>Richtig, so seh ich das auch. Was du vorschlägst hat aber den Nachteil, dass die Linie während die Maus bewegt wird nicht sichtbar ist. Soll sozusagen 'online' passieren. Wie bei Paint etc. wenn man Linien zeichnet.</p>
</blockquote>
<p>Zeig doch mal Code! Auch wenn ich in der OnMouseMove was auf mein Fenster zeichne, ist es sofort da. Klingt eher als würdest du was falsch machen.<br />
Dein nächstes Problem: wenn das Fenster minimiert wird und dann wieder geöffnet wird, ist alles weg. Du musst dir die Linien merken.<br />
Entweder machst dir ne kleine Klasse und fügst ein vector zu der zeichnenden KLasse hinzu. Oder du merkst dir das Bild in einem MemDC und blittest diesen dann immer auf das Fenster.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4897">@estartu</a>: Solch ein Rubberband bekommt man gan zeasy mit dem CClientDC::SetROP2 hin. In diesem Zeichenmodus werden die Pixel der Linie aus einer xor-Logik mit den bestehden Farbpunkten berechnet. Zeichne ich die Linie an derselben Stelle ein zweites mal in genau diesem Modus, dann ist der alte Inhalt wieder da, als hätte ich nie eine Linie gezeichnet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443542</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Fri, 25 Jan 2008 16:19:14 GMT</pubDate></item><item><title><![CDATA[Reply to [vc6] Linie&#x2F;Polygon zeichnen ohne GDI+ on Mon, 28 Jan 2008 07:39:40 GMT]]></title><description><![CDATA[<p>Der Code ist wie oben beschrieben. Klar wird in der ::OnMouseMove(...) eine Line gezeichnet. Aber zu jeder Bewegung eine Linie. Was estartu vorgeschlagen hat (das Zeichnen in die ::OnLButtonUp(...) hat den Nachteil, dass eine Linie wirklich erst gezeichnet wird wenn die Maustaste losgelassen wird. So soll es aber nicht sein.</p>
<p>Besteht denn die Möglichkeit, das 'alte' CRect in das die vorherige Linie gezeichnet wurde derart ungültig zu machen, dass die Linie nicht mehr sichtbar ist? Hierzu is vllt gut zu wissen, dass ich verschiedene Hintergrundfarben hab. Daher wird das übermalen wohl schnell zum Flackern anfangen. Wie ist denn das bei Paint gelöst? Weis das jemand?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1444832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1444832</guid><dc:creator><![CDATA[m.trix]]></dc:creator><pubDate>Mon, 28 Jan 2008 07:39:40 GMT</pubDate></item><item><title><![CDATA[Reply to [vc6] Linie&#x2F;Polygon zeichnen ohne GDI+ on Mon, 28 Jan 2008 07:50:35 GMT]]></title><description><![CDATA[<p>Pellaeon schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4897">@estartu</a>: Solch ein Rubberband bekommt man gan zeasy mit dem CClientDC::SetROP2 hin. In diesem Zeichenmodus werden die Pixel der Linie aus einer xor-Logik mit den bestehden Farbpunkten berechnet. Zeichne ich die Linie an derselben Stelle ein zweites mal in genau diesem Modus, dann ist der alte Inhalt wieder da, als hätte ich nie eine Linie gezeichnet.</p>
</blockquote>
<p>Ah cool, das muss ich mir mal merken. <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/1444842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1444842</guid><dc:creator><![CDATA[estartu]]></dc:creator><pubDate>Mon, 28 Jan 2008 07:50:35 GMT</pubDate></item><item><title><![CDATA[Reply to [vc6] Linie&#x2F;Polygon zeichnen ohne GDI+ on Mon, 28 Jan 2008 09:41:00 GMT]]></title><description><![CDATA[<p>Im Drawcli-Beispiel werden die jeweiligen Linien erst in der ::Draw(...) des jeweiligen Objekts (Viereck, Polygon etc.) gezeichnet und nicht direkt in der View. Die ::Draw(...) wird aus der ::OnDraw(...) aufgerufen. Hier komm ich allerdings nie vorbei. Kann des was damit zusammenhängen, dass mit jeder Mausbewegung und neuem Punkt bei mir (::OnMouseMove(...)) immer wieder neue Linie gepinselt werden?</p>
<p>Bin echt am wahnsinnig werden. Kann doch gar ned so schwer sein, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1444872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1444872</guid><dc:creator><![CDATA[m.trix]]></dc:creator><pubDate>Mon, 28 Jan 2008 09:41:00 GMT</pubDate></item><item><title><![CDATA[Reply to [vc6] Linie&#x2F;Polygon zeichnen ohne GDI+ on Mon, 28 Jan 2008 12:10:40 GMT]]></title><description><![CDATA[<p>So, hier die Lösung:</p>
<pre><code>void CView::OnMouseMove ( UINT nFlags, CPoint point )
{
  ClientDC dc ( this );

  // löschen und 'zeichnen' altes rechteck
  dc.SetROP2 ( R2_NOT ); // R2_NOT: pixel invers von pencil
  CRect rect ( m_down.x, m_down.y, m_last.x, m_last.y );
  dc.MoveTo ( rect.TopLeft() );
  dc.LineTo ( rect.BottomRight() ); 

  // setzen und zeichnen neues rechteck
  rect.SetRect ( m_down.x, m_down.y, point.x, point.y );
  dc.MoveTo ( rect.TopLeft() );
  dc.LineTo ( rect.BottomRight() );

  ReleaseDC ( &amp;dc ); // freigeben
  m_last = point; // neue position merken
}
</code></pre>
<p>Wie gesagt, ist längst nicht der komplette Code (speichern d. Punkte f. Polyline etc.) und alles andere ist wie im ersten Post unverändert. Mit Verschiedenen Hintergründen klappts auch wunderbar.</p>
<p>Merce!</p>
<p>m.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445008</guid><dc:creator><![CDATA[m.trix]]></dc:creator><pubDate>Mon, 28 Jan 2008 12:10:40 GMT</pubDate></item></channel></rss>