NB6_Hazards/GDE_3_hazard/Graphics/Shape.cpp
gaeltp3 7a52e186d9 Verbindung von GDE mit unserem Projekt Hazard
im Ordner GDE_3_Hazard. Ab nun koennen wir weiter in diesem Ordner
programmieren.
2013-11-28 16:08:16 +01:00

241 lines
7.5 KiB
C++

// Shape.cpp: implementation of the CShape class and drived classes.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Shape.h"
#include <malloc.h>
#pragma warning( disable : 4996 ) // disable sprintf warning
// Dieses Makro changeflag holt aus der Variable "var"
// das flag "extract" heraus und fuegt dafuer das flag "insert" ein.
#define __changeflag(var, extract, insert) if (var & extract) { \
var ^= extract; \
var |= insert; \
};
//////////////////////////////////////////////////////////////////////
// CShape Class
CShape::CShape(short x, short y, COLORREF crColor)
{
// Initialisieren der Member-Variablen
m_x = x;
m_y = y;
m_crColor = crColor;
}
//////////////////////////////////////////////////////////////////////
// CFill Class
CFill::CFill(short x, short y, COLORREF crFillColor, COLORREF crBorderColor) :
CShape(x, y, crBorderColor)
{
m_crFillColor = crFillColor;
};
void CFill::Draw(CDC* pDC)
{
CBrush brush(m_crFillColor); // Erstellen...
pDC->SelectObject(&brush); // ...und auswaehlen ein GDI brushes
pDC->FloodFill(m_x, m_y, m_crColor);// Fuellen...
brush.DeleteObject(); // und Brush loeschen.
};
//////////////////////////////////////////////////////////////////////
// CLineTo Class
void CLineTo::Draw(CDC* pDC)
{
CPen pen; // Konstruieren, dann Initialisieren
if( pen.CreatePen( PS_SOLID, 1, m_crColor ) )
{
// Auswahl des Objekts im Gerätekontext
// Gleichzeitiges Speichern des alten Stifts
CPen* pOldPen = pDC->SelectObject( &pen );
// Zeichnen mit dem Stift
pDC->LineTo(m_x, m_y); // Ziehen einer Linie...
// Wiederherstellen des alten Stifts im Gerätekontext
pDC->SelectObject( pOldPen );
}
else
{
// Den Benutzer alarmieren, daß die Ressourcen knapp werden
}
/* CPen pen(PS_SOLID, 1, m_crColor); // Generieren eines Zeichenstiftes...
pDC->SelectObject(&pen); // ...und auswaehlen dieses Stiftes.
pDC->LineTo(m_x, m_y); // Ziehen einer Linie...
*/
// pen.DeleteObject(); // ...und anschliessendes Loeschen des ausgewaehlten Siftes.
}
//////////////////////////////////////////////////////////////////////
// CLine Class
CLine::CLine(short x1, short y1, short x2, short y2, UINT crColor) : CLineTo(x1, y1, crColor)
{
m_point = CPoint(x2, y2);
}
void CLine::Draw(CDC* pDC)
{
POINT currentpos;
currentpos = pDC->GetCurrentPosition(); // Ermitteln der aktuellen Cursorposition.
pDC->MoveTo(m_point); // Bewegen des Cursors zum Zielpunkt, ...
CLineTo::Draw(pDC); // ...zeichnen der Linie und...
pDC->MoveTo(currentpos); // ...rueckkehren zum Ausgangspunkt.
}
//////////////////////////////////////////////////////////////////////
// CRectangle Class
CRectangle::CRectangle(RECT rect, COLORREF crFrame, COLORREF crFill) : CShape(NULL, NULL, crFrame)
{
m_rect = rect;
m_crFill = crFill;
}
void CRectangle::Draw(CDC* pDC)
{
if (m_crFill == -1) { // Ein durchsichtiges Rechteck zeichnen.
CBrush brush(m_crColor); // Erstellen eines graphics device interface (GDI) brushes...
pDC->SelectObject(&brush); // ...und auswaehlen des GDI brushes.
pDC->FrameRect(&m_rect, &brush); // Zeichnen...
brush.DeleteObject(); // ..und brush loeschen.
}
else { // Ein ausgefuelltes Rechteck zeichnen.
CPen pen(PS_SOLID, 1, m_crColor); // Zeichenstift fuer den Rand.
pDC->SelectObject(&pen);
CBrush brush(m_crFill); // Brush fuer die ausgefuellte Flaeche.
pDC->SelectObject(&brush);
pDC->Rectangle(&m_rect);
brush.DeleteObject();
pen.DeleteObject();
};
}
//////////////////////////////////////////////////////////////////////
// CEllipse Class
CEllipse::CEllipse(RECT rect, COLORREF crFrame, COLORREF crFill) : CShape(NULL, NULL, crFrame)
{
m_rect = rect;
m_zoomrect = rect;
m_crFill = crFill;
}
void CEllipse::Draw(CDC* pDC)
{
CBrush brush;
CPen pen(PS_SOLID, 1, m_crColor);
pDC->SelectObject(&pen);
if (m_crFill == -1) // Eine transparente Ellipse zeichnen.
brush.CreateStockObject(NULL_BRUSH);
else // Eine ausgefuellte Ellipse zeichnen.
brush.CreateSolidBrush(m_crFill);
pDC->SelectObject(&brush);
pDC->Ellipse(&m_zoomrect);
pen.DeleteObject();
brush.DeleteObject();
}
//////////////////////////////////////////////////////////////////////
// CTextA Class
CTextA::CTextA(short x1, short y1, WORD nSize, COLORREF crTextColor, COLORREF crBkground, short nAngle,
UINT nFlags, char* format, va_list argptr) : CShape(x1, y1, crTextColor)
{
// Die Member-Variablen der Klasse initialisieren.
m_nSize = nSize;
m_crBkground= crBkground;
m_nBkMode = OPAQUE;
m_nAngle = nAngle;
m_nFlags = nFlags;
// Da die Befehle TextOut und DrawText (in CTextBox benutzt)
// teilweise verschiedene numerische Konstanten fuer die Ausrichtung benutzen,
// jedoch global die einundselben verwendet werden sollen, muessen die flags,
// die sich unterscheiden veraendert werden.
__changeflag(m_nFlags, DT_VCENTER, TA_BASELINE);
__changeflag(m_nFlags, DT_CENTER, TA_CENTER);
m_string = (char*) malloc(_MAX_STRING); // Einen ausreichend grossen Speicherblock zuweisen.
m_nCount = vsprintf(m_string, format, argptr); // Aus der Argumentenliste einen string generieren.
m_string = (char*) realloc(m_string, m_nCount+1); // Den Speicherblock auf die benoetigte Groesse verkleinern.
}
void CTextA::Draw(CDC* pDC)
{
// Setzen einer Schriftart mit speziellen Eignenschaften.
CFont font;
LOGFONT logfont = {m_nSize, 0, m_nAngle, 0, FW_DONTCARE, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial"};
font.CreatePointFontIndirect(&logfont, pDC);
pDC->SelectObject(&font);
pDC->SetTextColor(m_crColor); // Textfarbe setzen.
if (m_nBkMode == OPAQUE) // Wenn undurchsichtig, ...
pDC->SetBkColor(m_crBkground); // ...dann Hintergrundfarbe setzen.
pDC->SetBkMode(m_nBkMode); // Festlegen ob durchsichtig oder undurchsichtig.
pDC->SetTextAlign(m_nFlags); // Setzen der Textausrichtung.
pDC->TextOut(m_x, m_y, m_string, m_nCount); // Ausgabe des Textes.
font.DeleteObject(); // Loeschen der Ausgewaehlten Schriftcharakteristik
}
//////////////////////////////////////////////////////////////////////
// CTextBox Class
CTextBox::CTextBox(RECT rect, WORD nSize, COLORREF crText, COLORREF crFrame, COLORREF crFill,
UINT nFormat, char* format, va_list argptr) : CShape(NULL, NULL, crText)
{
m_rect = rect;
m_nSize = nSize;
m_nFormat = nFormat;
m_crFrame = crFrame;
m_crFill = crFill;
m_string = (char*) malloc(_MAX_STRING); // Einen ausreichend grossen Speicherblock zuweisen.
m_nCount = vsprintf(m_string, format, argptr); // Aus der Argumentenliste einen string generieren.
m_string = (char*) realloc(m_string, m_nCount+1); // Den Speicherblock auf die benoetigte Groesse verkleinern.
}
void CTextBox::Draw(CDC* pDC)
{
// Setzen einer Schriftart mit speziellen Eignenschaften.
CFont font;
font.CreatePointFont(m_nSize, "Arial", pDC);
pDC->SelectObject(&font);
pDC->SetTextColor(m_crColor); // Textfarbe setzen.
pDC->SetBkMode(TRANSPARENT); // Festlegen auf durchsichtig.
// Zeichnen eines fuellenden Rechteckes.
CRectangle rectangle(m_rect, m_crFrame, m_crFill);
rectangle.Draw(pDC);
m_rect.DeflateRect(1, 1, 1, 1); // Verkleinern des virtuellen Rechteckes
// um die Linienbreite des Rahmens.
pDC->SetTextAlign(NULL); // Textausrichtung zuruecksetzen.
pDC->DrawText(m_string, m_nCount, &m_rect, m_nFormat); // Text ausgeben.
font.DeleteObject();
}