Programmieren mit C++

Code-Beispiele & Lösungen

Allgemeine visuelle Objektklassen

Erweitertes Panel

Die Klasse TTransBitmap ist von TCustomControl abgeleitet und kann sich sowohl wie ein Panel als auch wie Button verhalten, wobei jeweils mächtige neue Eigenschaften zur Verfügung gestellt werden.

Der Control können bis zu drei Bitmaps zugewiesen werden, die für die Zustände oben, deaktiviert und unten verwendet werden, wobei die Anzeige der Bitmap in neun Formaten gestreckt oder im Originalformat erfolgt.

Die Beschriftung des Panels, gesteuert über Caption, kann wahlweise an der Bitmap ausgerichtet werden und darf sich über mehrere Zeilen erstrecken, d.h. es findet ein automatischer Wortumbruch statt!

Properties der Klasse TTransBitmap

bool HasFocus 

HasFocus kann nur zur Laufzeit gelesen werden und gibt darüber Auskunft, ob die Control den Fokus besitzt (TRUE) oder nicht (FALSE).

Property HasFocus

bool AllowDown 

Das Property AllowDown legt fest, ob das Panel per Mausklick niedergedrückt werden kann (TRUE) oder nicht (FALSE). Diese Eigenschaft macht normalerweise bei einem Panel keinen Sinn, kann aber im Zusammenspiel mit der Bitmapanzeige verwendet werden, da die Komponente in der Lage ist, abhängig vom Anzeigezustand unterschiedliche Bitmaps anzuzeigen. Defaultwert ist FALSE.

Property AllowDown

bool AllowFocus

Ist das Property AllowFocus auf TRUE gesetzt, kann die Control den Fokus erhalten, ansonsten nicht. Default ist FALSE.

Property AllowFocus

bool AutoRefresh

AutoRefresh steuert das automatische Neuzeichnen der Control nach Änderungen. Default ist TRUE.

Property AutoRefresh

bool AllowSubAndSuperChars 

Mit AllowSubAndSuperChars wird die Sonderdarstellung von hoch- bzw. tiefgestelltem Text aktiviert (TRUE) oder deaktiviert (FALSE).

Das exakte Verhalten bezüglich der Anzeige des modifizierten Textes wird über spezielle Properties gesteuert. Per Default ist diese Funktionalität ausgeschaltet.

Property AllowSubAnd-SuperChars

bool AutoSize

Das Property AutoSize steuert, ob sich die Control automatisch bezüglich des Caption-Textes anpassen soll. Per Default ist dieses Property auf FALSE gesetzt. Die Art der automatischen Anpassung regelt das Property AutoSizeParams.

Property AutoSize

TTransBitmapAutoSize AutoSizeParams

Über dieses Property wird festgelegt, nach welchem Kriterium die automatische Größenanpassung der Control erfolgt. Mögliche Werte sind:

Konstante

Bedeutung

asWidthOnly

Anpassung nur abhängig von Textbreite

asHeightOnly

Anpassung nur abhängig von Texthöhe

asBoth

Anpassung unter Berücksichtigung von Höhe und Breite

Als Default ist asBoth vorgegeben.

Property AutoSizeParams

Graphics::TBitmap *Bitmap

Unabhängig vom Betriebsmodus ist die Komponente in der Lage, eine Bitmap anzuzeigen. Diese kann bereits zur Designzeit vorgegeben oder zur Laufzeit spezifiziert werden.

Property Bitmap

TTransBitmapBitmapDisplay BitmapDisplay

Die Anzeige der Bitmap kann bezüglich der Ränder der Control vorgegeben werden. Als Default ist die Zentrierung bezüglich der Control gesetzt. Mögliche Werte sind:

Konstante

Ausrichtung

bdTopLeft

an linke obere Ecke

bdTopCenter

mittig am oberen Rand

bdTopRight

an rechter oberer Ecke

bdMiddleLeft

am linken Rand mittig bzgl. Höhe

bdMiddleCenter

mittig bzgl. der Control

bdMiddleRight

am rechten Rand mittig bzgl. Höhe

bdBottomLeft

am linken unteren Rand

bdBottomCenter

am unteren Rand mittig bzgl. Breite

bdBottomRight

am rechten unteren Rand

Property BitmapDisplay

TTransBitmapBitmapNumber BitmapNumber

Über das Property BitmapNumber steuert die Komponente, welche der von bn1..bn4 durchnumerierten Bitmaps angezeigt werden soll. Per Default wird die erste Bitmap angezeigt.

Da die Komponente nur ein Bitmap-Property besitzt, müssen mehrere Bitmaps zu einer Bitmap zusammengefaßt und nebeneinander angeordnet werden, wie es analog auch bei den Bitmaps für Buttons der Fall ist.

Bei der Anzeige spielt es dann eine große Rolle, welcher Anzeigemodus über BitmapDisplay eingestellt ist. Die vielfältigen Kombinationsmöglichkeiten kann man am besten durch Ausprobieren ausloten.

Property BitmapNumber

TBorderWidth BorderWidth 

BorderWidth legt die Breite des Fensterrahmens fest. Per Default ist dieses Property auf 0 gesetzt, also keine Rahmenanzeige.

Property BorderWidth

TTransBitmapCaptionDisplay CaptionDisplay

Der Caption-Text der Komponente wird in Abhängigkeit von der Lage der Bitmap oder den Rändern angezeigt. Mögliche Ausrichtungen sind:

Konstante

Ausrichtung

cdBitmapLeft

Bitmap ist links vom Text

cdBitmapRight

Bitmap ist rechts vom Text

cdBitmapTop

Bitmap ist oberhalb des Textes

cdBitmapBottom

Bitmap ist unterhalb des Textes

cdTopLeft

Text linksbündig am oberen Rand

cdTopCenter

Text oben zentriert

cdTopRight

Text rechtsbündig am oberen Rand

cdMiddleLeft

Text linksbündig und mittig bzgl. Höhe der Control

cdMiddleCenter

Text zentriert bzgl. der Control

cdMiddleRight

Text rechtsbündig und mittig bzgl. der Höhe der Control

cdBottomLeft

Text linksbündig am unteren Rand

cdBottomCenter

Text an unteren Rand zentriert

cdBottomRight

Text rechtsbündig am unteren Rand

Als Default ist cdBitmapTop gesetzt.

Property CaptionDisplay

int CaptionNbLines 

Das Property CaptionNbLines legt fest, über wieviele Zeilen sich der Captiontext erstrecken soll bzw. darf. Paßt der Text in eine Zeile, wird auch nur eine Zeile verwendet. Paßt der Text nicht in eine Zeile, so wird der überzählige Text nicht abgeschnitten, sondern umgebrochen und auf die nächste Zeile gezogen, sofern CaptionNbLines dies erlaubt. Per Default sind bis zu 3 Zeilen zulässig.

Wird die Komponente als Button betrieben, dann erlaubt die Komponente das Anzeigen eines mehrzeiligen Textes in einer Schaltfläche, ohne daß es zusätzlicher Programmierung bedarf!

Property CaptionNbLines

String EscapeChar 

Das Escape-Zeichen wird benötigt, wenn die Steuerzeichen für Hoch- bzw. Tiefstellung selbst im darzustellenden Text vorkommen. In diesem Fall zeigt EscapeChar an, daß das nachfolgende Zeichen dargestellt werden soll. Per Default ist „\“ als EscapeChar definiert. Dieses Zeichen sollte normalerweise mit den Captiontexten harmonieren.

Property EscapeChar

TColor FocusColor

Mit FocusColor wird die Farbe des Fokusrahmens spezifiziert. Defaultfarbe ist clHighlight.

Property FocusColor

int FocusWidth

FocusWidth legt die Breite des Fokusrahmens fest. Vorgegeben ist der Wert 2.

Property FocusWidth

TTransBitmapLook Look

Das Property Look bestimmt die Art der Control. Per Default verhält sich die Komponente wie ein Button. Mögliche Einstellungen sind:

Konstante

Bedeutung

loButton

Button-Darstellung

loPanel

Panel-Darstellung

loClickablePanel

Anklickbares Panel

Property Look

TTransBitmapState State 

Die Komponente kennt drei mögliche Stati:

Konstante

Status

stUp

erhöhte Darstellung des Clientbereichs

stDown

abgesenkter Clientbereich

stDisabled

deaktiviert

Als Vorgabe ist stUp gesetzt.

Property State

bool Stretch

Das Property Strech legt fest, ob die Bitmap auf die Größe der Komponente skaliert werden soll (TRUE) oder nicht (FALSE).

Property Stretch

String SubChar 

SubChar definiert das Zeichen, das als Anfang und gegebenenfalls Ende der Zeichenfolge interpretiert wird, die tiefgestellt angezeigt werden soll. Gibt es kein zweites Vorkommen des Zeichens als Endemarkierung, so werden ab dem Auftreten des Zeichens alle nachfolgenden Zeichen tiefgestellt. Das Steuerzeichen selbst wird nicht angezeigt. Per Default wird „_“ als SubChar verwendet.

Property SubChar

int SubCharDist

Der Abstand zwischen dem normalen Text und dem tiefgestellten Text definiert das Property SubCharDist. Als Default ist hier der Wert 3 angegeben.

Property SubCharDist

int SubFontSizeDiff

Das Property SubFontSizeDiff spezifiziert den relativen Größenunterschied zum Standardfont für tiefgestellten Text. Als Default ist 3 vorgegeben.

Property SubFontSizeDiff

String SuperChar

SuperChar definiert das Zeichen, das als Anfang und gegebenenfalls Ende der Zeichenfolge interpretiert wird, die hochgestellt angezeigt werden soll. Gibt es kein zweites Vorkommen des Zeichens als Endemarkierung, so werden ab dem Auftreten des Zeichens alle nachfolgenden Zeichen hochgestellt angezeigt. Das Steuerzeichen selbst wird nicht angezeigt. Per Default wird „^“ als SuperChar eingesetzt.

Property SuperChar

int SuperCharDist

Der Abstand zwischen dem normalen Text und dem hochgestellten Text definiert das Property SuperCharDist. Als Default ist hier der Wert 0 angegeben.

Property SuperCharDist

int SuperFontSizeDiff

Das Property SuperFontSizeDiff spezifiziert den relativen Größenunterschied zum Standardfont für hochgestellten Text. Als Default ist 3 vorgegeben.

Methoden der Klasse TTransBitmap

Property SuperFontSizeDiff

virtual __fastcall TTransBitmap(
       TComponent *aOwner);
__fastcall TTransBitmap(
       TComponent *aOwner, 
       const bool &aDynamic);

Die Klasse TTransBitmap besitzt neben dem Defaultkonstruktor einen weiteren speziellen Konstruktor, der über den Parameter aDynamic festlegt, ob die Anfangsgröße der Komponente nach dem Erzeugen der Instanz dynamisch anhand der Properties skaliert wird (TRUE) oder die fest vorgegebene Größe von 123 Pixel Breite und Höhe angenommen wird (FALSE), die auch der Defaultkonstruktor automatisch setzt.

Konstruktor

int __fastcall SimulateNewWidth(
   const int &aNewWidth);
int __fastcall SimulateNewHeight(
   const int &aNewHeight);

Die beiden Simulationsfunktionen erlauben das Berechnen der Breite bzw. Höhe der Komponente, wenn diese anhand der aktuellen Propertywerte neu dynamisch bestimmt würde (AutoSize), ohne daß diese neuen Größenwerte sofort gesetzt werden. Dadurch wird es der Komponente möglich, die automatisch bestimmten Werte zunächst zu kontrollieren und notfalls zu korrigieren, indem die Properties Width und Height direkt gesetzt oder die Properties, die die AutoSize-Funktion beeinflussen, entsprechend angepaßt werden.

Member SimulateNewWidth, SimulateNewHeight

void __fastcall ForceRefresh();

Die Methode ForceRefresh() erzwingt ein Neuzeichnen der Komponente.

Implementation

Die Klasse TTransBitmap setzt intern auf TCustomControl auf und erbt deren elementare Fähigkeiten. Die wesentlichen Neuerungen, die von TTransBitmap hinzugefügt werden, ist die flexible Anzeige von Text und Bitmap. Die zentrale Funktion ist daher die Methode Paint(), die intern auf mehrere Service-Funktionen zur Bestimmung von Größe und Plazierung des Caption-Textes und der Bitmap zurückgreift.

void __fastcall TTransBitmap::Paint()
{
  if (FAutoRefresh)
  {
    TRect Region;   // Region innerhalb derer wir zeichnen dürfen
    TRect TmpBmpRect, BmpRect;  // für Bitmappositionierung
    TColor TopColor, BottomColor;   // Farben für 3D Effekt
    Graphics::TBitmap *TmpBitmap;   // Bitmap 
    TRect StretchRegion;  // Region für Stretching der Bitmap
    TPoint BmpPt, TxtPt;  // Position der Bitmap und 1. Caption
    int CrtCaptionLine;   // zur Anzeige der verschiednen Zeilen,
    int CaptionLineTop;   // die den Captiontext bilden

Als erstes prüft die Methode die Größe der Control, was insbesondere für das erstmalige Anzeigen von Interesse ist:

    CheckSize();

Anschließend muß festgestellt werden, ob sich die Maus über der Control befindet oder nicht und abhängig vom Resultat, ob der Wert von FHasFocus geändert werden muß. Dieser Abschnitt löst insbesondere das von Popup geschaffene Problem, daß dann, wenn ein Popup-Menü der Control zugewiesen ist und der Anwender einen Menüpunkt aus diesem Popup-Menü wählt, der Fokus entfernt wird. Als Reaktion darauf versendet Windows eine WM_PAINT-Nachricht, die zum Aufruf der Methode Paint() führt. Hier wird geprüft, ob die Control den Fokus besitzt oder nicht.

    TPoint CursorPos;
 
    if (GetCursorPos(&CursorPos))   {
      CursorPos = ScreenToClient(CursorPos);
      if (FHasFocus && !OverControl(CursorPos))  {
        SetCaptureControl(NULL);
        FHasFocus = false;
      }
    }

Erst jetzt kann das eigentliche Zeichnen in Angriff genommen werden. Dazu wird als erstes erforderlich, den Client-Bereich und die tatsächliche Region zu bestimmen, innerhalb derer der Platz für die Control bereitgestellt wird:

      Region = GetClientRect();
      GetWorkableRegion(Region);

Die Bitmap selbst wird über eine temporäre Kopie mit einem transparenten Hintergrund angezeigt, wobei zunächst der Hintergrund erzeugt wird. Dessen Farbe hängt vom Typ der Control ab. Handelt es sich um loButton, berücksichtigt die Methode den Status der Control sowie die Tatsache, ob die Control aktuell Mausklicks abfängt oder nicht:

      TmpBitmap = new Graphics::TBitmap;
      try
      {
        if (FLook != loButton)
          Canvas->Brush->Color = FBackgroundColor;
         else if (((FState == stDown) && !MouseCatched) ||
                  ((OrigState == stDown) && MouseCatched))
            Canvas->Brush->Color = clBtnHighlight;
         else
            Canvas->Brush->Color = clBtnFace;
 
         Canvas->FillRect(Region);   // Hintergrund anzeigen
 
         TmpBitmap->Width  = BitmapWidth;
         TmpBitmap->Height = FBitmap->Height;

Zur Anzeige wird die rechte Bitmap ausgewählt, abhängig von der Anzahl der Bitmaps sowie dem aktuellen Status der Control. Der Defaultwert zeigt die gesamte Bitmap:

         TmpBmpRect = Rect(0, 0, TmpBitmap->Width, 
                           TmpBitmap->Height);
         BmpRect = Rect(0, 0, BitmapWidth, FBitmap->Height);
 
         switch (FState)
         {
            case stDisabled:
               if (FBitmapNumber >= bn2)
                  BmpRect = Rect(BitmapWidth, 0, 2 * BitmapWidth, 
                                 FBitmap->Height);
               break;
            case stDown:
               if (FBitmapNumber >= bn3)
                  BmpRect = Rect(2* BitmapWidth, 0, 
                                 3* BitmapWidth, FBitmap->Height);
               break;
         }

Spezialfall: Es gibt eine vierte Bitmap für den Fokuszustand und die Control hat den Fokus und darf ihn bekommen:

         if (FAllowFocus && FHasFocus && (FBitmapNumber == bn4))
            BmpRect = Rect(3 * BitmapWidth, 0, 4 * BitmapWidth, 
                           FBitmap->Height);

Nun kann die richtige Bitmap kopiert werden:

         TmpBitmap->Canvas->CopyRect(TmpBmpRect, FBitmap->Canvas, 
                                     BmpRect);

Existiert eine transparente Farbe in der Bitmap, so wird die Bitmap transparent gemacht:

        TmpBitmap->Canvas->Brush->Color = Canvas->Brush->Color;
        TmpBitmap->Canvas->BrushCopy(Rect(0, 0, TmpBitmap->Width, 
                                     TmpBitmap->Height),  
                                     TmpBitmap,
                                     Rect(0, 0, TmpBitmap->Width, 
                                          TmpBitmap->Height), 
                                     TmpBitmap->TransparentColor);

Zur Anzeige der Bitmap selbst stehen zwei Modi zur Auswahl:

  • normale Größe
  • gestreckte Größe

Soll die Bitmap gestreckt angezeigt werden, so hängt der verfügbare Bereich davon ab, ob der Captiontext relativ zur Bitmap angezeigt werden soll oder nicht.

         if (FStretch)
         {
            StretchRegion = Region;
 
            switch (FCaptionDisplay)
            {
               case cdBitmapLeft:
                  StretchRegion.Right -= CaptionWidth; 
                  break;
               case cdBitmapRight:
                  StretchRegion.Left += CaptionWidth; 
                  break;
               case cdBitmapTop:
                  StretchRegion.Bottom -= CaptionHeight; 
                  break;
               case cdBitmapBottom:
                  StretchRegion.Top += CaptionHeight; 
                  break;
            }
 
            Canvas->StretchDraw(StretchRegion, TmpBitmap);
         }
         else
         {

Für die normale Größe hängt die Plazierung sowohl von dem Property FBitmapDisplay als auch FCaptionDisplay ab:

            GetBitmapPos(Region, BmpPt);
 
            Canvas->Draw(BmpPt.x, BmpPt.y, TmpBitmap);
         }
      } catch(...) {}
 
      delete TmpBitmap;

Nachdem die Bitmap angezeigt ist, kann man daran gehen, den Captiontext auszugeben. Die Anzeige erfolgt ebenfalls mit transparentem Hintergrund und muß gegebenenfalls mehrfach durchgeführt werden, wenn die Zeile zu lang ist und mehrere Zeilen erlaubt sind. Ferner ist zu ermitteln, ob hoch- oder tiefgestellter Text zu berücksichtigen ist.

Zunächst wird die Ausgabeposition der ersten Zeile bestimmt:

      if (CaptionList->Count)
      {
         Canvas->Brush->Style = bsClear;  
                                         
         GetCaptionPos(Region, TxtPt); 
 
         CaptionLineTop = TxtPt.y;

Die Anzeige der Textzeilen erfolgt über die Methode CanvasTextOut(), die sämtliche interne Berechnungen vornimmt:

       for (CrtCaptionLine = 0; CrtCaptionLineCount; 
            CrtCaptionLine++)  {
         CanvasTextOut(TxtPt.x + (CaptionWidth - CanvasTextWidth(
                    CaptionList->Strings[CrtCaptionLine])) / 2,       
                    CaptionLineTop, 
                    CaptionList->Strings[CrtCaptionLine]);
 
         CaptionLineTop += CanvasTextHeight(
                            CaptionList->Strings[CrtCaptionLine]);
         }
      }

Als letztes verbleibt noch, das Aussehen der Control festzulegen und sichtbar zu machen, da das Verhalten der Control - egal, ob Button oder Panel – komplett über die Komponente und deren Methoden gesteuert wird.

Zunächst wird die Ausgaberegion bestimmt und im Falle eines Fokuses ein 3D-Rahmen gezeichnet:

      Region = GetClientRect();
 
      if (FAllowFocus && FFocusWidth) 
      {
        if (FHasFocus)
          Frame3D(Canvas, Region, FFocusColor, FFocusColor, 
                  FFocusWidth);
        else
          Frame3D(Canvas, Region, clBtnFace, clBtnFace, 
                  FFocusWidth);
      }

Handelt es sich um einen Button, so besitzt dieser zwei Rahmen mit unterschiedlichen Farben und Funktionalitäten abhängig vom Property FState:

      if (FLook == loButton)
         switch (FState)
         {
            case stUp:
            case stDisabled:
               Frame3D(Canvas,Region, clBtnHighlight, clBlack, 1);
               Canvas->Pen->Color = clBtnShadow;
               Canvas->MoveTo(Region.Left, Region.Bottom - 1);
               Canvas->LineTo(Region.Right - 1,Region.Bottom - 1);
               Canvas->LineTo(Region.Right - 1, Region.Top - 1);
               break;
            case stDown:
               Frame3D(Canvas,Region, clBlack, clBtnHighlight, 1);
               Canvas->Pen->Color = clBtnShadow;
               Canvas->MoveTo(Region.Left, Region.Bottom - 1);
               Canvas->LineTo(Region.Left, Region.Top);
               Canvas->LineTo(Region.Right, Region.Top);
               break;
         }
      else
      {

Ein Panel wird in drei Schritten angezeigt:

  • Außenrand
  • Rand
  • Innenbereich

Ist FBevelOuter ungleich bvNone, wird eine entsprechende Reaktion notwendig:

         if (FBevelOuter != bvNone)   {
           if ((FLook == loClickablePanel) && (FState == stDown))
              AdjustColors(FBevelOuter, BottomColor, TopColor);
           else
              AdjustColors(FBevelOuter, TopColor, BottomColor);
 
            Frame3D(Canvas, Region, TopColor, BottomColor, 
                    BevelWidth);
         }
 
         Frame3D(Canvas, Region, FBackgroundColor, 
                 FBackgroundColor, BorderWidth);

Ansonsten wird der innere Rand gezeichnet, wenn FBevel- Inner ungleich bvNone ist:

         if (FBevelInner != bvNone)   {
           if ((FLook == loClickablePanel) && (FState == stDown))
              AdjustColors(FBevelInner, BottomColor, TopColor);
           else
              AdjustColors(FBevelInner, TopColor, BottomColor);
 
           Frame3D(Canvas, Region, TopColor, BottomColor, 
                   BevelWidth);
         }
      }
   }
}

Nach diesen Arbeiten ist die Control komplett angzeigt.

Als wichtigste Support-Routine fehlt noch die Methode CanvasTextOut() zur Anzeige des Captiontextes.

int __fastcall TTransBitmap::CanvasTextWidth(const String &aText)
{
   int Result = Canvas->TextWidth(aText);
 
   if (FAllowSubAndSuperChars)  {
      String CharToTest;
      int FontShift;
      int CrtMode = 0;   // 0 = normal, 1 = sub, 2 = super
      int aTextLength = aText.Length();
      int DefFontSize = Canvas->Font->Size;;
 
      Result = 0;

Für jeden einzelnen Buchstaben muß geprüft werden, ob es sich um ein Escape-Zeichen handelt oder ob eine Umschaltung zwischen normaler Darstellung und hoch- bzw. tiefgestelltem Text handelt:

      for (int I = 1; I < aTextLength; I++)    {
         CharToTest = aText.SubString(I, 1);
         if (CharToTest == FEscapeChar)     {
           CharToTest = aText.SubString(I + 1, 1);
           I ++;
         }
         else if (CharToTest == FSubChar)     {
            CrtMode = (CrtMode == 1)?0:1;
            CharToTest = "";
         }
         else if (CharToTest == FSuperChar)   {
            CrtMode = (CrtMode == 2)?0:2;
            CharToTest = "";
         }
 
         switch (CrtMode)   {
            case 0:   // Normal
               FontShift = 0; break;
            case 1:   // Sub
               FontShift = -FSubFontSizeDiff; break;
            case 2:   // Super
               FontShift = -FSuperFontSizeDiff; break;
         }
         Canvas->Font->Size = DefFontSize + FontShift;
         Result += Canvas->TextWidth(CharToTest);
      }

Letztes Zeichen:

      CharToTest = aText.SubString(aTextLength, 1);
      if ((CharToTest != FEscapeChar) &&
          (CharToTest != FSubChar) &&
          (CharToTest != FSuperChar))
         Result += Canvas->TextWidth(CharToTest);
 
      Canvas->Font->Size = DefFontSize;
   }
   return Result;
}

Member ForceRefresh





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-20 02:01:34 von textarchiv.alojado.de