// Shape.h: interface for the CShape class and derived classes.
//
//////////////////////////////////////////////////////////////////////
#ifndef _SHAPE_H
#define _SHAPE_H
#define _MAX_STRING 255	// Festlegen der maximal moeglichen string-Laenge (CText, CTextBox)


/////////////////////////////////////////////////////////////////////////////
// Die Klasse CShape ist die Basisklasse aller Grafikklassen. 
// ALLE Grafikklassen haben diese als "Vorfahren".
//
// Allen Klassen ist gemeinsam, dass mit der Funktion
// Draw() gezeichnet und mit der Funktion Zoom() gezoomt werden kann.
// Diese beiden Funktionen sind aus diesem Grunde auch in der Basisklasse
// CShape mit dem Keywort "virtual" versehen.
class CShape
{
// Member-Variablen
protected:
	short	 m_x,
			 m_y;
	COLORREF m_crColor;

public:
	CShape(short x, short y, COLORREF crColor = 0);
	virtual ~CShape() {};	
	virtual void Draw(CDC* pDC) = 0;		// virtuelle Klasse zum zeichnen des Objektes

};


/////////////////////////////////////////////////////////////////////////////
// Diese Klasse dient dazu im Zeichenbereich einen einzelnen Bildpunkt
// mit einer gewuenschten Farbe zu setzen.
class CPixel : public CShape
{
public:
	CPixel(short x, short y, COLORREF crColor) : CShape(x, y, crColor) {};
	virtual ~CPixel() {};
	void Draw(CDC* pDC) { pDC->SetPixel(m_x, m_y, m_crColor); };

};


/////////////////////////////////////////////////////////////////////////////
// Diese Klasse dient zum Fuellen des Bereiches des Grafikfensters,
// der den Punkt (x, y) enthaelt und durch die Farbe crBorderColor begrenzt ist, 
// mit der Fullfarbe crFillClor1
class CFill : public CShape
{
protected:
	COLORREF m_crFillColor;

public:
	CFill(short x, short y, COLORREF crFillColor, COLORREF crBorderColor);
	virtual ~CFill() {};
	void Draw(CDC* pDC);
};


/////////////////////////////////////////////////////////////////////////////
// Klasse zum Positionieren des Cursors auf einem bestimmten Bildschirmpunkt.
// Diese Klasse muss im Zusammenhang mit der Klasse "LineTo" verwendet werden.
class CMoveTo : public CShape
{
public:
	CMoveTo(short x, short y) : CShape(x, y) {};
	virtual ~CMoveTo() {};
	void Draw(CDC* pDC)	{ pDC->MoveTo(m_x, m_y); };

};


/////////////////////////////////////////////////////////////////////////////
// Klasse zum ziehen einer Linie mit bestimmter Farbe zu einem Zielpunkt.
// Als Ausgangskoordinate dient der Cursor, der mit der Klasse "MoveTo" frei
// bewegt werden kann.
class CLineTo : public CShape
{
public:
	CLineTo(short x, short y, COLORREF crColor) : CShape(x, y, crColor) {};
	virtual ~CLineTo() {};
	void Draw(CDC* pDC);

};


/////////////////////////////////////////////////////////////////////////////
// Dient zum Zeichnen einer Linie vom Startpunkt (m_x, m_y) aus 
// zum Zielpunk (m_point) mit der gewuenschten Farbe crColor.
class CLine : public CLineTo
{
protected:
	POINT m_point;

public:
	CLine(short x1, short y1, short x2, short y2, UINT crColor);
	virtual ~CLine() {};
	void Draw(CDC* pDC);

};


/////////////////////////////////////////////////////////////////////////////
// Zeichnen eines Rechteckes oder nur eines Rechteckrahmens (crFill = -1)
// mit einer gewuenschten Rahmenfarbe bzw. Fullfarbe.
class CRectangle : public CShape
{
protected:
	RECT	 m_rect;
	COLORREF m_crFill;

public:
	CRectangle(RECT rect, COLORREF crFrame, COLORREF crFill = -1);
	virtual ~CRectangle() {};
	void Draw(CDC* pDC);

};


/////////////////////////////////////////////////////////////////////////////
// Zeichnen einer durchsichtigen oder undurchsichtigen (crFill = -1) Ellipse
// mit einer gewuenschten Rahmenfarbe bzw. Fullfarbe.
class CEllipse : public CShape
{
protected:
	RECT	 m_rect;
	RECT	 m_zoomrect;
	COLORREF m_crFill;

public:
	CEllipse(RECT rect, COLORREF crFrame, COLORREF crFill = -1);
	virtual ~CEllipse() {};
	void Draw(CDC* pDC);

};


/////////////////////////////////////////////////////////////////////////////
class CTextA : public CShape
{
protected:
	BYTE  m_nBkMode;
	WORD  m_nSize;
	short m_nAngle;
	UINT  m_nCount,
		  m_nFlags;
	char* m_string;
	COLORREF m_crBkground;

public:
	CTextA(short x1, short y1, WORD nSize, COLORREF crTextColor, COLORREF crBkground, short nAngle, UINT nFlags, char* format, va_list argptr);
	virtual ~CTextA() { free(m_string); };
	void Draw(CDC* pDC);

};


/////////////////////////////////////////////////////////////////////////////
class CText : public CTextA
{
public:
	CText(short x1, short y1, WORD nSize, COLORREF crTextColor, char* format, va_list argptr)
		: CTextA(x1, y1, nSize, crTextColor, NULL, NULL, NULL, format, argptr) {m_nBkMode = TRANSPARENT;};
	CText(short x1, short y1, WORD nSize, COLORREF crTextColor, COLORREF crBkground, char* format, va_list argptr)
		: CTextA(x1, y1, nSize, crTextColor, crBkground, NULL, NULL, format, argptr) {};
	CText(short x1, short y1, WORD nSize, COLORREF crTextColor, short nAngle, UINT nFlags, char* format, va_list argptr)
		: CTextA(x1, y1, nSize, crTextColor, NULL, nAngle, nFlags, format, argptr) {m_nBkMode = TRANSPARENT;};
	CText(short x1, short y1, WORD nSize, COLORREF crTextColor, COLORREF crBkground, short nAngle, UINT nFlags, char* format, va_list argptr)
		: CTextA(x1, y1, nSize, crTextColor, crBkground, nAngle, nFlags, format, argptr) {};

};


/////////////////////////////////////////////////////////////////////////////
class CTextBox : public CShape
{
protected:
	CRect m_rect;
	WORD  m_nSize;
	BYTE  m_nFormat;
	RECT  m_nRect;
	COLORREF m_crFrame,
			 m_crFill;
	WORD  m_nCount;
	char* m_string;

public:
	CTextBox(RECT rect, WORD nSize, COLORREF crText, COLORREF crFrame, 
			 COLORREF crFill, UINT nFormat, char* format, va_list argptr);
	virtual ~CTextBox() { free(m_string); };
	void Draw(CDC* pDC);

};
#endif