Graphics::TBitmap * Bitmap
Das Property Bitmap speichert ein Handle auf die anzuzeigende Bitmap. Die Zuweisung kann zur Designzeit im Objektinspektor erfolgen.
Implementation
Die Funktionalität der Klasse TWallPaper wird im wesentlichen durch die Methode Paint() bereitgestellt, die alle Zeichenaktionen veranlaßt.
Voraussetzung ist jedoch zunächst einmal, daß im Konstruktor der Stil csOpaque gesetzt wird:
ControlStyle = TControlStyle() << csAcceptsControls
<< csCaptureMouse << csDoubleClicks
<< csReplicatable << csOpaque;
Ferner wird im Konstruktur ein – zunächst leeres – Bitmap-Objekt erzeugt:
FBitmap = new Graphics::TBitmap;
Die übrigen Zuweisungen der Properties sind trivial. Lediglich die Methode Paint() soll nachfolgend noch etwas genauer betrachtet werden.
Zur Unterdrückung eines möglichen Flickerns, wird der Hintergrund zunächst in einen Puffer geschrieben, bevor er mit einem Aufruf über das Canvas-Objekt angezeigt wird.
Die Größe der temporären Bitmap wird auf Width und Height minus Bevelbreite gesetzt:
void __fastcall TWallPaper::Paint()
{
if (FBitmap->Width && FBitmap->Height)
{
int Delta = (FBevel != bvNone) ? FBevelWidth : 0;
Graphics::TBitmap *Buffer = new Graphics::TBitmap;
Buffer->Width = Width - 2 * Delta;
Buffer->Height = Height - 2 * Delta;
Ist die Bitmap gekachelt anzuzeigen, wird sie vertikal und horizontal solange neben- bzw. untereinander kopiert, bis das gesamte Formular bedeckt ist:
if (FDisplay == diTile)
for (int i = 0; i < Width; i += FBitmap->Width)
for (int j = 0; j < Height; j += FBitmap->Height)
Buffer->Canvas->Draw(i, j, FBitmap);
Ansonsten wird die Bitmap bezüglich des Formulars zentriert:
else
{
Buffer->Canvas->Brush->Color = Color;
Buffer->Canvas->Pen->Color = Color;
Buffer->Canvas->Rectangle(0, 0, Buffer->Width,
Buffer->Height);
Buffer->Canvas->Draw((Buffer->Width - FBitmap->Width) /2,
(Buffer->Height - FBitmap->Height)/2,
FBitmap);
}
Die eigentliche Anzeige erfolgt über die Canvas-Methode CopyRect(), die einen rechteckigen Bereich von einem Canvas zum anderen kopiert:
Canvas->CopyRect(Rect(Delta, Delta,
Width - Delta, Height - Delta),
Buffer->Canvas,
Rect(0, 0, Buffer->Width, Buffer->Height));
Abschließend muß die temporäre Bitmap wieder gelöscht werden:
delete Buffer;
}
Als letzte Arbeit verbleibt das Zeichnen des Bevel, der als 3D-Rahmen auf den Clientbereich gesetzt wird:
if (FBevel != bvNone)
Frame3D(Canvas,
GetClientRect(),
(FBevel == bvLowered)?clBtnShadow:clBtnHighlight,
(FBevel == bvLowered)?clBtnHighlight:clBtnShadow,
FBevelWidth);
}
Erweiterungen
Anstelle der Kachelung könnten gegebenenfalls auch mehrere unterschiedliche Grafiken angezeigt werden. Am grundsätzlichen Vorgehen würde sich nichts ändern. Lediglich die Ausgangsbitmap in FBitmap wäre nicht eine Bitmap, sondern ein Array aus Bitmaps.
|