Rechtecke und Kreise im View verschieben und es will einfach nicht =(



  • Nabend allerseits,

    so richtig will er mir keine Elemente verschieben und ich weiß nicht wo ich suchen soll, denn er bringt ja keine fehler oder warnungen. Hat einer ne Idee wo ich das suchen kann bzw sollte? Bin über jeden Tip dankbar.

    greetz
    Tobi

    void CMy07AufgabeView::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	CMy07AufgabeDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	CMyDrawObject *pDrawObject;
    	// set default TRUE
    	BOOL create_new=TRUE;
    
    	if((m_nDefType!=DRW_RECT)&&(m_nDefType!=DRW_CIRCLE)){
    		m_nDefType=DRW_RECT;	
    	}
    
    	// check if hit an object
    	if( ! pDoc->DrawObjectList.IsEmpty( ))
    	{
    		// list contains draw objects
    		POSITION pos = pDoc->DrawObjectList.GetTailPosition();
    
    		while( pos != NULL )
    		{
    			// search for a hit
    			pDrawObject=pDoc->DrawObjectList.GetAt(pos);
    
    			if( pDrawObject->IsHit(point) )
    			{
    				// hit an object
    				SetCapture();
    				// set new cursor
    				SetCursor( LoadCursor(NULL,IDC_SIZEALL) );
    				// place on top
    				pDoc->DrawObjectList.RemoveAt(pos);
    				create_new = FALSE;
    				break;
    				// .. and insert again
    			}
    			else
    				// seek next; top down
    				pDoc->DrawObjectList.GetPrev(pos);
    		}//while( pos != NULL )
    	}//if( ! pDoc->DrawObjectList.IsEmpty( ))
    
    	if( create_new )
    	{
    		switch( m_nDefType )
    		{
    		case DRW_RECT: pDrawObject= new CMyRectObject();
    			break;
    		case DRW_CIRCLE: pDrawObject= new CMyCircleObject();
    			break;
    		}
    		pDrawObject->Pos= CRect(point, point);
    		pDrawObject->Pos.InflateRect(20,20);
    	}
    	// add to list tail
    	pDoc->DrawObjectList.AddTail( pDrawObject );
    	Invalidate();
    	CView::OnLButtonDown(nFlags, point);
    }
    
    void CMy07AufgabeView::OnMouseMove(UINT nFlags, CPoint point) 
    {
    	if( GetCapture() == this )
    	{
    		// move an object
    		CMy07AufgabeDoc* pDoc = GetDocument();
    		ASSERT_VALID(pDoc);
    		POSITION pos = pDoc->DrawObjectList.GetTailPosition();
    		if( pos != NULL )
    		{
    			// get topmost object
    			CMyDrawObject *pDrawObject =
    				pDoc->DrawObjectList.GetAt(pos);
    			// remember previous position
    			CRect OldPos( pDrawObject->GetPos() );
    			// move it
    			pDrawObject->SetPos( point );
    			// redraw only changed area
    			CRect RedrawRect;
    			RedrawRect.UnionRect( OldPos,
    				pDrawObject->GetPos() );
    			// redraw changed area of the view
    			RedrawWindow( RedrawRect );
    		} // if( pos != NULL )
    	} // if( GetCapture() == this )
    	CView::OnMouseMove(nFlags, point);
    }
    
    void CMy07AufgabeView::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    	if( GetCapture() == this )
    	{
    		ReleaseCapture();
    	}
    	CView::OnLButtonUp(nFlags, point);	
    }
    


  • ich hab zwar kein tipp, aber ich bin grade am selben problem am arbeiten, bzw. noch dabei es zu erstellen.
    Wofür ist das Programm, wenn man fragen darf?



  • Das Programm ist nur zum Test, die eigentliche Aufgabe bestand nur darin elemente darzustellen.

    Aber ich habe noch vor:

    - elemente verschiebbar zu machen
    - Font einzubingen (skalier- und verschiebbar)
    - das gleiche für kleine bilder/ornamente

    rauskommen soll ein kleiner editor zu präsentationszwecken.

    Alle diese Elemente/Bilder werden dann über einem Bild angeordnet und gelockt.
    Danach wird das Bild gesaved. Neben dem Bild ist dann noch ein 2ter View in dem
    man lustig Text hacken kann und wenn man das ganze drucken will is das verwurschtelte bild links und der text rechts auf dem Ausdruck. 🙂

    So die Planung.

    gruß
    Tobi



  • du speicherst nicht zufällig die koordinaten von den elementen in eine datei, oder speicherst du einfach das fertige bild?



  • in der Aufgabe selbst werden die elemente in einerm file hinterlegt so das dies auch wieder rekontruierbar ist, aber für dieses Präsiproject ist das nicht nötig bzw nicht vorgesehen. da soll nur ein bild hinten rauskommen und evtl noch gedruckt werden.



  • sowas änlches wie bei wir (mein Thread: http://www.c-plusplus.net/forum/viewtopic-var-t-is-146144.html), nur das du wesentlich weiter bist.



  • public:
    
    	//Default Constructor und Destructor
    	virtual ~CMyDrawObject();
    	CMyDrawObject(){};
    
    	CRect Pos;
    	int Type;
    
    	virtual void Serialize(CArchive& ar)
    		{ if (ar.IsStoring())
    			ar << Pos;
    			else
    			ar >> Pos;
    		};
    	virtual BOOL IsHit(CPoint &point){ return FALSE;};
    	virtual void Draw(CDC* pDC){};
    
    	// CRect& damit der Rückgabewert halt CRect spezifisch ist ansonsten will return ein int =)
    	inline CRect& GetPos(){return Pos;};
    
    	inline void SetPos(CPoint nPos){
    		CRect rect(nPos, nPos);
    		rect.InflateRect(20,20);
    		Pos=rect;     <------------------ Übeltäter
    	};
    

    Habe den Fehler gefunden. Nach einer gehörigen Debugsession hat sich rausgestellt das die Neue Position einfach nicht an Pos übergeben worden ist.

    *argh*

    Wollte das nur gesagt haben =).

    Thread kann geclosed werden.


Anmelden zum Antworten