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.
|