Letzte Korrekturen
Nach oben zu Grafische Komponenten erzeugen - Index
Die Standardkomponente TShape hat der Beispielkomponente nur noch eines voraus: Sie kann neben Rechtecken und Ellipsen auch Quadrate und Kreise zeichnen. Um dies zu realisieren, benötigen Sie einen Code, der die kürzesten Seitenlinien ermittelt und das Bild zentriert.
Hier eine verbesserte Version der Methode Paint, die auch Quadrate und Kreise zeichnet:
procedure TSampleShape.Paint;
var
X, Y, W, H, S: Integer;
begin with Canvas do
begin
Pen := FPen; { Stift der Komponente kopieren }
Brush := FBrush; { Pinsel der Komponente kopieren }
W := Width; { Breite der Komponente verwenden }
H := Height; { Höhe der Komponente verwenden }
if W < H then S := W else S := H; { Kleinste Werte speichern }
case FShape of { Höhe, Breite und Position anpassen }
sstRectangle, sstRoundRect, sstEllipse:
begin
X := 0; { Ursprung für diese Figuren oben links }
Y := 0;
end;
sstSquare, sstRoundSquare, sstCircle:
begin
X := (W - S) div 2; { Diese Figuren horizontal ... }
Y := (H - S) div 2; { ... und vertikal zentrieren }
W := S; { Kleinste Werte für Breite ... }
H := S; { ... und Höhe verwenden }
end;
end;
case FShape of
sstRectangle, sstSquare:
Rectangle(X, Y, X + W, Y + H); { Rechtecke und Quadrate zeichnen }
sstRoundRect, sstRoundSquare:
RoundRect(X, Y, X + W, Y + H, S div 4, S div 4); { Figuren mit abgerundeten Ecken }
sstCircle, sstEllipse:
Ellipse(X, Y, X + W, Y + H); { Runde Figuren }
end;
end;
end;
void __fastcall TSampleShape::Paint(void)
{
int X,Y,W,H,S;
Canvas->Pen = FPen; // Stift der Komponente kopieren
Canvas->Brush = FBrush; // Pinsel der Komponente kopieren
W=Width; // Breite der Komponente verwenden
H=Height; // Höhe der Komponente verwenden
X=Y=0; // Kleinsten Wert für Kreise/Quadrate speichernsquares
if( W<H )
S=W;
else
S=H;
switch(FShape) // Höhe, Breite und Position anpassen
{
case sstRectangle:
case sstRoundRect:
case sstEllipse:
Y=X=0; // Für diese Formen liegt der Ursprung oben links
break;
case sstSquare:
case sstRoundSquare:
case sstCircle:
X= (W-S)/2; // Horizontal zentrieren
Y= (H-S)/2; // und vertikal zentrieren
break;
default:
break;
}
switch(FShape)
{
case sstSquare: // Rechtecke und Quadrate zeichnen
W=H=S; // Kleinstes Maß für Breite und Höhe verwenden
case sstRectangle:
Canvas->Rectangle(X,Y,X+W,Y+H);
break;
case sstRoundSquare: // Abgerundete Rechtecke und Quadrate zeichnen
W=H=S;
case sstRoundRect:
Canvas->RoundRect(X,Y,X+W,Y+H,S/4,S/4);
break;
case sstCircle: // Kreise und Ellipsen zeichnen
W=H=S;
case sstEllipse:
Canvas->Ellipse(X,Y,X+W,Y+H);
break;
default:
break;
}
}