Kreise, Vierecke, Dreiecke und Textelemente auf dem DC =(
-
class CMyDrawObject : public CObject { // die Basis-Klasse DECLARE_SERIAL( CMyDrawObject ) 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){}; inline CRect& GetPos(){return Pos;}; inline void SetPos(CPoint nPos){ CRect rect(nPos, nPos); rect.InflateRect(20,20); Pos=rect; }; }; class CMyCircleObject : public CMyDrawObject { DECLARE_SERIAL( CMyCircleObject ) public: virtual BOOL IsHit(CPoint &point) { CMyRgn HitRgn; HitRgn.CreateEllipticRgnIndirect(Pos); return HitRgn.PtInRegion(point); }; virtual void Draw(CDC* pDC){ pDC->Ellipse(Pos);}; }; class CMyRectObject : public CMyDrawObject { DECLARE_SERIAL( CMyRectObject ) // für automatische Serialisierung public: // keine extra constructoren und destruktoren definieren virtual BOOL IsHit(CPoint &point) { CMyRgn HitRgn; HitRgn.CreateRectRgnIndirect(Pos); return HitRgn.PtInRegion(point); }; virtual void Draw(CDC* pDC){ pDC->Rectangle(Pos);}; };Soweit alles gut und schön, ich kann sowohl Kreise als auch Vierecke durch klicken auf den DC erzeugen und bei anklicken verschieben.
Nun will ich aber weitere Elemente hinzufügen, Dreiecke und Textelemente.
Später will ich das noch resizeable machen.class CMyTriangleObject : public CMyDrawObject { DECLARE_SERIAL( CMyTriangleObject ) // für automatische Serialisierung public: CMyTriangleObject(){ p[0]=CPoint(1,1); p[1]=CPoint(20,10); p[2]=CPoint(1,10); p[3]=CPoint(1,1); }; virtual BOOL IsHit(CPoint &point) { CMyRgn HitRgn; HitRgn.CreateRectRgnIndirect(Pos); return HitRgn.PtInRegion(point); }; virtual void Draw(CDC* pDC){pDC->Polyline(p,4);}; CPoint p[4] ; };Das Ergebnis ist nun leider das er das Dreieck fest in die obere Linke ecke setzt. Ich kann der Polyline aber keine Position mitgeben. Gibt es da eine Mgl das ich die trotzdem verschoben bekomme?

Gruß
McSnoop
-
Die Position des Polygons steckt in den Eckpunten (also in dem Array
CPoint p[4];), also mußt du die dort stehenden Koordinaten auch entsprechend anpassen (entweder direkt in der SetPos()-Methode oder vor dem Zeichnen).
-
class CMyTriangleObject : public CMyDrawObject { DECLARE_SERIAL( CMyTriangleObject ) // für automatische Serialisierung public: CMyTriangleObject(){ }; virtual BOOL IsHit(CPoint &point) { CMyRgn HitRgn; HitRgn.CreateRectRgnIndirect(Pos); return HitRgn.PtInRegion(point); }; virtual void Draw(CDC* pDC){ pDC->Polyline(p,4); }; inline void SetPos(CPoint nPos){ CRect rect(nPos, nPos); rect.InflateRect(20,20); Pos=rect; // punkte sind erst einmal frei gewählt p[0]=CPoint(nPos.x,nPos.y); p[1]=CPoint(nPos.x,nPos.y+20); p[2]=CPoint(nPos.x+20,nPos.y); p[3]=CPoint(nPos.x+20,nPos.y+20); }; CPoint p[4]; };Meinst du das so?
Leider zeichnet er noch nichts, aber die Rgn setzt er an die Stelle wo ich hinklicke und ich kann diese auch verschieben.

-
virtual void Draw(CDC* pDC){ p[0]=CPoint(Pos.left+((Pos.right-Pos.left)/2),Pos.top); p[1]=CPoint(Pos.left,Pos.bottom); p[2]=CPoint(Pos.right,Pos.bottom); p[3]=CPoint(Pos.left+((Pos.right-Pos.left)/2),Pos.top); pDC->Polyline(p,4); };Jetzt zeichnet er mir auch die Polyline, aber erst wenn ich auf die Polyline nochmals klicke verschwindet die Spur die entsteht wenn ich die Polyline bewege.
http://mcsnoop.mc.funpic.de/MFC/Problem.JPG
Was noch anzumerken ist, das bei dem Kreis und bei dem Viereck das nicht auftritt, obwohl bei den beiden das ebenfalls so gemacht wird wie bei dem Dreieck.
-
hab den fehler gefunden.
Die Rect auf der die Elemente gezeichnet werden bildet die Grenze, sprich wenn diese Bewegt wird dann wird das neu gezeichnet was sich auf der Rect befindet und wenn nun was drauf ist was die Maße ein bisschen überschreitet bleibt das auf dem DC solange bin dieser für ungültig erklärt wird und die bestehenden Rgn Objecte neu gezeichnet werden.
Thread kann geclosed werden.