none
MFC CView - Rechteck verschieben RRS feed

  • Frage

  • Also, Ich muss wohl irgendwo einen Denkfehler haben:
    Ich möchte mein, zuvor vom Benutzer gezeichnetes, Rechteck vom Benutzer verschieben lassen.

    Ich dachte mir das so:
              -Ich berechne den Abstand von dem Mausklick und den Rechteckkoordinaten
              -Dann berechne ich die neuen Koordinaten des Vierecks, wenn der Benutzer die Maus bewegt
              -Nun Zeichnet mein Programm das Rechteck erneut mit den neuen Koordinaten.

    Kann mir bitte jemand mal ein Beispiel geben. Oder gibt es noch eine andere möglichkeit?

    Das hier ist mein Anfang:

    void
     Cdrawer4View::OnDraw(CDC* pDC)
    {
    pDC->Rectangle(m_Rechteck);

    Cdrawer4Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if  (!pDoc)
    return ;
    }

    void  Cdrawer4View::OnLButtonDown(UINT nFlags, CPoint point)
    {
    m_PointA = point;
    m_Ziehbar = TRUE;
    CView::OnLButtonDown(nFlags, point);
    }

    void  Cdrawer4View::OnMouseMove(UINT nFlags, CPoint point)
    {
    if (m_Ziehbar == TRUE)
    {
    InvalidateRect(m_Rechteck);
    m_PointB = point;
    m_Rechteck = CRect(m_PointA.x, m_PointA.y, m_PointB.x, m_PointB.y);
    InvalidateRect(m_Rechteck);
    }
    CView::OnMouseMove(nFlags, point);
    }

    void  Cdrawer4View::OnLButtonUp(UINT nFlags, CPoint point)
    {
    m_PointB = point;
    m_Ziehbar = FALSE;
    CView::OnLButtonUp(nFlags, point);
    }

    VisualCPlusPlus
    Donnerstag, 25. November 2010 19:13

Antworten

  • Dann hast Du die Koordinaten des alten CRect.
    Du hast den Startpunkt, an dem der Click ankam.
    Jetzt hast Du bei jede, Move oder MouseUp, den neuen Punkt.
    Jetzt führst Die einfach die Subtraktion des punktNeu-punktAlt durch.
    Mit dem Ergebnis führst Du CRect::OffsetRect aus und erhältst die Koordinaten des neuen CRect.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 26. November 2010 13:50
    Moderator
  • Setzt Du den auch dann wieder m_PointA auf m_PointB?
    Du verarbeitest doch Differenzen!

    Ansonsten solltest Du debuggen lernen um solche Fehler selbst zu finden...

    Wenn Rechtecke falsch gezeichnet werden, dann gibt es wieder Probleme mit dem Invalidate.
    Auch hier hilft Debuggen am besten mit zwei Monitorenoder remote Debugging mit zwei Maschinen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Samstag, 27. November 2010 08:44
    Moderator

Alle Antworten

  • Ich weiß nicht genau was Du willst.

    Willst Du ein bestehenden Rechteck bewegen oder willst Du ein neues Rechteck in Deiner Ansicht aufziehen?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 26. November 2010 10:00
    Moderator
  • Ich möchte ein bestehendes Rechteck verschieben.

    VisualCPlusPlus
    Freitag, 26. November 2010 12:46
  • Dann hast Du die Koordinaten des alten CRect.
    Du hast den Startpunkt, an dem der Click ankam.
    Jetzt hast Du bei jede, Move oder MouseUp, den neuen Punkt.
    Jetzt führst Die einfach die Subtraktion des punktNeu-punktAlt durch.
    Mit dem Ergebnis führst Du CRect::OffsetRect aus und erhältst die Koordinaten des neuen CRect.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 26. November 2010 13:50
    Moderator
  • Ich habe mein Programm jetzt noch in MouseMove und LButtonUp ergänzt um Folgende Zeile:

    m_Rechteck.OffsetRect(m_PointB.x-m_PointA.x, m_PointB.y-m_PointA.y)
     
    Allerdings bewegt sich das Rechteck viel zu schnell und wird manchmal falsch dargestellt(Linien Fehlen).

     


    VisualCPlusPlus
    Freitag, 26. November 2010 17:56
  • Setzt Du den auch dann wieder m_PointA auf m_PointB?
    Du verarbeitest doch Differenzen!

    Ansonsten solltest Du debuggen lernen um solche Fehler selbst zu finden...

    Wenn Rechtecke falsch gezeichnet werden, dann gibt es wieder Probleme mit dem Invalidate.
    Auch hier hilft Debuggen am besten mit zwei Monitorenoder remote Debugging mit zwei Maschinen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Samstag, 27. November 2010 08:44
    Moderator
  • m_PointA auf m_PointB zusetzen habe ich vergessen, das mit dem Falschen Zeichnen muss ich noch etwas suchen. Danke für die Hilfe.
    VisualCPlusPlus
    Samstag, 27. November 2010 21:00