wie kann ich ein RECT auf dem CDC als Objekt fassen?
-
hallo,
ich habe ein koordinatensystem in welches signale gezeichnet werden. mit einem linksklick setze ich einen cursor an die CPoint.x koordinate. an derselben x-koordinate zeichne ich am ende des cursors ein dreieck (ausserhalb des koordinatensystems). dieses möchte ich jetzt gerne mit einem linksklick und gedrückter maustaste in x-richtung verschieben können.
bislang habe ich die drei systemmessages für lbuttondown, mousemove und lbuttonup wie folgt implementiert. m_rectClient ist dabei ein 20x20 px großer bereich welcher mein dreieck zum schieben bereitstellen soll. InpRect stellt das Koordinatensystem dar.
mein problem findest sich in OnMouseMove() wieder, hier muss ich es irgendwie anstellen die ausgewählte region des dreiecks als objekt zu fassen und zu verschieben, wie mache ich das???
void CWiwoDlg::OnLButtonDown(UINT nFlags, CPoint point) { m_rectClient.left = point.x-10; m_rectClient.right = point.x+10; m_rectClient.bottom = InpRect.top; m_rectClient.top = InpRect.top-20; CRgn rgnRect; CRect r = m_rectClient; VERIFY(rgnRect.CreateRectRgnIndirect(&r)); if(rgnRect.PtInRegion(point)) { TRACE("\nregion for cursor move!"); SetCapture(); m_bCatched = TRUE; ::SetCursor(::LoadCursor(NULL, IDC_HAND)); rgnRect.Detach(); } Invalidate(); CDialog::OnLButtonDown(nFlags, point); }void CWiwoDlg::OnMouseMove(UINT nFlags, CPoint point) { if(m_bCatched) { CClientDC DC(this); DC.SetMapMode(MM_ISOTROPIC); DC.SetWindowExt(InpRect.left, InpRect.right); } CDialog::OnMouseMove(nFlags, point); }void CWiwoDlg::OnLButtonUp(UINT nFlags, CPoint point) { if(m_bCatched) { ReleaseCapture(); m_bCatched = FALSE; } CDialog::OnLButtonUp(nFlags, point); }mfg cappaja
-
oder hat jemand allgemein eine lösung wie man mit den mfc etwas gezeichnetes zum objekt machen kann?
-
Nimm doch ein Fenster. Fürs verschieben einfach WM_LBUTTONDOWN in WM_NCLBUTTONDOWN übersetzen.
-
und wie soll das mit einem fenster funktionieren? da verschiebt sich doch überhaupt nichts!?
-
Du sollst deine Rechtecke oder was auch immer du hast in CStatic-Objekte ( was dann auch nur Fenster sind Packen und die als Client deines hauptfensters machen, da haste dann auch keine Probleme mehr mit dem erkennen, denn das amcht das Window für dich. Du mußt dann halt nur noch die entsprechenden Mausnachrichten behandeln.
-
Static = new CStatic; Static->Create(NULL, WS_CHILD | WS_VISIBLE, cursorWnd, this); Static->SetCursor(::LoadCursor(NULL, IDC_HAND));wie mache ich sie denn zum client des hauptfensters? ich habe sowas noch nie zuvor gemacht und daher leider nicht viel ahnung. ein codebeispiel wäre vielleicht von vorteil, denn so ganz hab ich das prinzip noch nicht wirklich verstanden...