Wasserzeichen

Um den Fensterhintergrund mit einem beliebigen Muster (Wasserzeichen) zu versehen, ist das Muster zunächst in einer BMP-Datei abzulegen. Beachten Sie dabei aber bitte, dass Sie keine zu kräftigen Farben für den Hintergrund verwenden. Diese lenken zum einen vom eigentlichen Fensterinhalt ab und zum anderen sind die Ausgaben innerhalb des Fensters wegen des fehlenden Kontrastes sonst schlecht zu lesen. Versuchen Sie das Muster in hellen Grautönen zu halten. Fast alle Grafikprogramme bieten dazu die Möglichkeit, eine farbige Bitmap in eine Bitmap mit Grautönen zu konvertieren. Diese Bitmap hellen Sie dann noch etwas auf.

Um eine solchermaßen bearbeitete Bitmap als Fensterhintergrund darzustellen sind zwei Schritte erforderlich: das Laden der Bitmap und das Anzeigen der Bitmap. Fangen wir mit dem ersten Schritt an. Wie man eine Bitmap lädt haben Sie ja schon erfahren. In der Regel können Sie dafür die API-Funktion LoadImage(...) einsetzen. Anschließend wird die geladene Bitmap dann einem Speicher-DC zugewiesen. Dieser gesamte Vorgang erfolgt am Besten innerhalb der Methode OnInitialUpdate(...) des Ansichtsobjektes. Nachfolgend ist der komplette Code hierfür wiedergegeben:

void CBackBmpView::OnInitialUpdate()
{
    CView::OnInitialUpdate();
   
   
// TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen

    BITMAP    BitmapParam; // Parameter der HG-Bitmap
   
// DC des Views holen
    CDC *pViewDC = GetDC();
   
// temp. CBitmap-Objekt fuer HG-Bitmap erstellen
    CBitmap *pCBitmap = CBitmap::FromHandle(m_hBackBmp);
   
// HG-Bitmap Parameter auslesen und retten
    pCBitmap->GetBitmap(&BitmapParam);
    m_nBackBmpWidth = BitmapParam.bmWidth;
    m_nBackBmpHeight = BitmapParam.bmHeight;
   
// Memory-DC fuer HG-Bitmap erstellen
    m_pBackMemDC = new CDC;
    BOOL bRetCode = m_pBackMemDC->CreateCompatibleDC(pViewDC);
    ASSERT(bRetCode);
   
// Bitmap in MemDC 'umkopieren'
    m_pBackMemDC->SelectObject(pCBitmap);
   
// DC auch wieder freigeben!
    ReleaseDC(pViewDC);   
}

Im zweiten Schritt erfolgt die Darstellung der im Speicher-DC abgelegten Bitmap. Wie Sie bestimmt noch wissen, wird der Fensterhintergrund in der CWnd-Methode OnEraseBkgnd(...) gezeichnet. Hier haben Sie nun zwei Möglichkeiten: entweder Sie strecken die Größe der Bitmap mittels StretchBltBit(...) auf die Fenstergröße oder aber Sie 'kacheln' den Fensterhintergrund, d.h. Sie wiederholen die Bitmap solange bis das gesamte Fenster ausgefüllt ist. Im nachfolgenden Listing wird die zweite Variante verwendet:

BOOL CBackBmpView::OnEraseBkgnd(CDC* pDC)
{
   
// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
   
    // Groesse der Client-Area auslesen

    CRect CClientRect;
    GetClientRect(&CClientRect);
   
// und Bitmap kacheln
    for (int iX=0; iX<=CClientRect.right; iX+=m_nBackBmpWidth)
        for (int iY=0; iY<=CClientRect.bottom; iY+=m_nBackBmpHeight)
            pDC->BitBlt(iX,iY,m_nBackBmpWidth,m_nBackBmpHeight,m_pBackMemDC,0,0,SRCCOPY);

    return TRUE;
}

Und das war's auch schon. Das fertig Beispiel hierzu finden Sie übrigens unter 05GDI\BackBmp.



Copyright © 2004

Senden Sie Emails mit Fragen oder Kommentaren zu dieser Website an: mailto:info@cpp-tutor.de
 Wolfgang Schröder, Lerchenweg 23, D-72805 Lichtenstein. Tel: +49 7129 6470