Die Windows 32 API enthält einige nette Funktionen für den Umgang mit Rechtecken, die das entwickeln doch vereinfachen können.Die Windows-API erwartet immer einen Zeifer auf eine RECT Struktur (LPRECT ). Dabei wird in der Struktur left, top, right, bottom angegeben. Damit sind die absoluten Koordinaten des Rechteckes gemeint. Das setzen eines Rechteckes mit SetRect(LPRECT rec,100,100,120,120); ergibt also ein Rechteck welches an der Position 100,100 beginnt und an der Position 120,120 endet und somit 20 Pixel groß ist.
Setzt die Werte für ein Rechteck
SetRect(LPRECT rec,left,top,right,bottom);
Setzt alle Werte eines Rechtecks auf 0
SetRectEmpty(LPRECT rec);
Kopiert ein Rechteck
CopyRect(LPRECT dest,LPRECT source);
Prüft, ob zwei Rechtecke gleich sind
EqualRect(LPRECT rec1,LPRECT rec2);
Prüft, ob ein Rechteck leer ist, also Höhe UND Breite sind 0
IsRectEmpty(LPRECT rec);
Prüft, ob ein Punkt innerhalb eines Rechtecks liegt oder nicht. pt ist eine POINT Struktur.
PtInRect(LPRECT rec,pt);
Verschiebt ein Rechteck um die angegebenen Werte, wobei negative Werte nach links bzw. nach oben verschieben
OffsetRect(LPRECT rec,x,y);
Dehnt oder staucht ein Rechteck um die angegebenen Werte, wobei negative Werte ein Stauchen bewirken
InflateRect(LPRECT rec,x,y);
Prüft, ob sich zwei Rechtecke überlappen und gibt die Schnittmenge zurück
InflateRect(LPRECT dest,LPRECT rec1, LPRECT rec2);
Gibt die größtmögliche Fläche zweier Rechtecke zurück. Führt also beide Rechtecke zusammen
InflateRect(LPRECT dest,LPRECT rec1, LPRECT rec2);
Der C++Builder kennt zusätzlich zu der WIN 32 API Struktur RECT den Typ TRect. Dieser wird für die Funktionen (bsp. Canvas->FillRect) des C++Builders benutzt. Die Initialisierung kann direkt mit
TRect re(100,100,150,150); oder TRect re(TPoint,TPoint);
erfolgen (Es gibt auch Funktionen, die das machen, sind aber m.E. durch die obigen Möglichkeiten obsolet. Das obige Beispiel hat ein Rechteck von der Position 100,100 bis zur Position 150,150 also in einer Größe von 50 Pixel erzeugt. Mit den Methoden Width und Height kann die Weite und Höhe des Rechtecks ermittelt werden. In diesem Beispiel 50. Die TRect Struktur ist mit der RECT Struktur der WIN 32 API kompatibel. Das heisst, ein Aufruf einer der WIN 32 API Funktionen kann direkt mit der TRect Struktur erfolgen.
bool test=IsRectEmpty(re);
Hier noch zwei Templates für die Prüfung, ob ein Punkt innerhalb eines Rechteckes liegt oder ob sich zwei Rechtecke überlappen.
//---------------------------------------------------------------------------
// Funktion prüft ob der übergebenen Punkt innerhalb des Rechtecks liegt
// -> ein Punkt liegt innerhalb des Rechtecks, wenn er sich auf der
// oberen bzw. linken Seite oder innerhalb aller 4 Seiten befindet
// -> ein Punkt auf der rechten oder unteren Seite liegt ausserhalb!
//---------------------------------------------------------------------------
template <typename T>
inline bool Rect<T>::Contains(const T &x, const T &y) const
{
return ((x >= Left) && (x < Right) && (y >= Top) && (y < Bottom));
}
//--------------------------------------------------------------------------
// Funktion prüft ob sich die beiden Rechtecke überschneiden
//--------------------------------------------------------------------------
template <typename T>
inline const bool Rect<T>::Intersection(const Rect<T> &rhs) const {
return ((Bottom > rhs.Top) && (Top < rhs.Bottom) &&
(Right > rhs.Left) && (Left < rhs.Right));
}
Die beiden Routinen wurden von Rico Sonntag aus dem C++Forum entwickelt.