Benutzer mit den meisten Antworten
MFC CView - Rechteck verschieben

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
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- Als Antwort vorgeschlagen Martin RichterModerator Sonntag, 28. November 2010 16:56
- Als Antwort markiert Martin RichterModerator Sonntag, 28. November 2010 16: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- Als Antwort vorgeschlagen Martin RichterModerator Sonntag, 28. November 2010 16:55
- Als Antwort markiert Martin RichterModerator Sonntag, 28. November 2010 16:56
Alle 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- Als Antwort vorgeschlagen Martin RichterModerator Sonntag, 28. November 2010 16:56
- Als Antwort markiert Martin RichterModerator Sonntag, 28. November 2010 16:56
-
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 -
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- Als Antwort vorgeschlagen Martin RichterModerator Sonntag, 28. November 2010 16:55
- Als Antwort markiert Martin RichterModerator Sonntag, 28. November 2010 16:56