Programmieren mit C++

Code-Beispiele & Lösungen

Allgemeine visuelle Objektklassen

WallPaper-Komponente

Die für den Borland C++ Builder geeignete Komponente TWallPaper dient dazu, auf dem Hintergrund eines Formulars Bitmaps zentriert oder gekachelt analog dem Windows-Hintergrund automatisiert anzuzeigen.

TPanelBevel Bevel

Das Property Bevel steuert die Anzeige des Rands. Zur Verfügung stehen die üblichen Werte:

  • bvNone
  • bvLowered
  • bvRaised

Defaultwert ist bvNone.

Property Bevel

TBevelWidth BevelWidth 

BevelWidth steuert die Breite des Rands, dessen Aussehen über Bevel gesteuert wird. Als Vorgabewert ist 1 gesetzt.

Property BevelWidth

TWallPaperDisplay Display

Die Hintergrundbitmap kann auf zweierlei Arten angezeigt werden:

Konstante

Bedeutung

diTile

Bitmaps gekachelt

diCenter

ein Bild zentriert

Als Vorgabe ist dtTile spezifiziert.

Property Display

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.

Property Bitmap





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-22 08:18:57 von textarchiv.alojado.de