Serializare CLineTracker

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Serializare CLineTracker

Post by mesajflaviu » 10 Jul 2010, 09:47

Am adaptat o clasa CLineTracker gasita pe net , pe care am inclus-o in proiectul atasat . Problema e ca nu o pot serializa : iata definitia metodelor din clasa :

Code: Select all

class CLineTracker
{
public:
	void Draw(CDC* pDC) const;
	BOOL TrackRubberBand(CWnd* pWnd, CPoint point);
	BOOL Track(CWnd* pWnd, CPoint point);
	BOOL SetCursor(CWnd* pWnd, UINT nHitTest) const;
	int HitTest(CPoint point) const;
	CRect GetValidRect() const;
	int GetVicinitySize() const;
	COLORREF GetHandleColor() const;
	CSize GetHandleSize() const;
	COLORREF GetLineColor() const;
	int GetLineWidth() const;
	void SetValidRect(CRect const& Rect);
	void SetVicinitySize(int nSize);
	void SetHandleColor(COLORREF cColor);
	void SetHandleSize(CSize const& Size);
	void SetHandleSize(int nSize);
	void SetLineColor(COLORREF cColor);
	void SetLineWidth(int nWidth);
	void SetPos(POINT const& Begin, POINT const& End);
	void GetPos(POINT* Begin, POINT* End) const;
	BOOL IsValidPos();
	CLineTracker(POINT const& Begin, POINT const& End);
	CLineTracker();
	virtual ~CLineTracker();

	enum
	{
		// values are compatible with corresponding CRectTracker values
		hitNothing = -1,
		hitBegin   = 0,
		hitEnd     = 2,
		hitMiddle  = 8
	};

private:
	int      m_nLineWidth;
    COLORREF m_cLineColor;
    CSize    m_SizeHandle;
    COLORREF m_cHandleColor;
    int      m_nVicinitySize;
    CRect    m_RectValid;

	struct CLinePos
	{
		CPoint Begin;
		CPoint End;
	};

	CLinePos CurPos;

	enum CHandleType
	{
		handleBegin,handleEnd
	};

	BOOL IsValidPos(CLinePos const& Pos);
	BOOL TrackHandle(CWnd* pWnd, CPoint point, int nHitTest);
	CRect GetHandleRect(CHandleType HandleType) const;
	void SetDefaults();
};
bun , acuma am facut membrul CurPos public sa il serializez , dar nu merge :

Code: Select all

error C2678: binary '<<' : no operator defined which takes a left-hand operand of type 'class CArchive' (or there is no acceptable conversion)
am atasat si proiectelul pentru mai multe informatii ... imi puteti spune cum pot salva pozitia liniei pe CView ?
Attachments
TestLineTracker2.rar
(79.4 KiB) Downloaded 275 times



User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Serializare CLineTracker

Post by cristianamarie » 10 Jul 2010, 10:04

Nuclear launch detected

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Serializare CLineTracker

Post by mesajflaviu » 10 Jul 2010, 11:21

CRectTracker nu este derivata din CObject , iar serializarea am facut-o in felul urmator :

Code: Select all

void CTestTrackerDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
		ar << m_Tracker.m_rect;
	}
	else
	{
		// TODO: add loading code here
		ar >> m_Tracker.m_rect;
	}
}
ma gandeam ca e suficient sa serializez structura CLinePos , similar cu 'm_rect' al CRectTracker ...
Attachments
TestTracker.rar
(78.31 KiB) Downloaded 256 times
Last edited by mesajflaviu on 11 Jul 2010, 05:58, edited 1 time in total.

Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: Serializare CLineTracker

Post by Viorel » 10 Jul 2010, 11:29

Mai poţi încerca adăugarea următoarei funcţii în CLineTracker:

Code: Select all

public:
	void Serialize(CArchive& ar)
	{
		if( ar.IsStoring())
		{
			ar << CurPos.Begin << CurPos.End; // etc. 
		}
		else
		{
			ar >> CurPos.Begin >> CurPos.End;
		}
	}
Iar în clasa document se va scrie:

Code: Select all

m_Tracker.Serialize(ar);
S-ar putea defini şi operatorii ‚<<’şi ‚>>’ pentru CLineTracker şi CLinePos. Derivarea din CObject şi utilizarea macrodefiniţiilor specale ca DECLARE_DYNAMIC cred că va fi necesară în cazul serializării unor pointeri sau colecţii de pointeri.

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Serializare CLineTracker

Post by mesajflaviu » 10 Jul 2010, 21:24

S-ar putea defini şi operatorii ‚<<’şi ‚>>’ pentru CLineTracker şi CLinePos.
Nu e o intrebare de care imi este cinste , dar cum se definesc acesti operatori , pentru CLinePos de exemplu ?

Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: Serializare CLineTracker

Post by Viorel » 10 Jul 2010, 23:07

Se vor adăuga următoarele linii în clasa CLineTracker:

Code: Select all

friend CArchive & operator << ( CArchive &, const CLineTracker & );
friend CArchive & operator >> ( CArchive &, CLineTracker & );
friend CArchive & operator << ( CArchive &, const CLinePos & );
friend CArchive & operator >> ( CArchive &, CLinePos & );
şi se vor implementa în exteriorul clasei:

Code: Select all

inline CArchive & operator << ( CArchive & ar, const CLineTracker::CLinePos & lp)
{
	return ar << lp.Begin << lp.End;
}

inline CArchive & operator >> ( CArchive & ar, CLineTracker::CLinePos & lp)
{
	return ar >> lp.Begin >> lp.End;
}

inline CArchive & operator << ( CArchive & ar, const CLineTracker & lt)
{
	return ar << lt.CurPos;
}

inline CArchive & operator >> ( CArchive & ar, CLineTracker & lt)
{
	return ar >> lt.CurPos;
}
Exemple asemănătoare se pot găsi în surse MFC.

Post Reply