BLT-Methoden

Bisher haben Sie nur eine der drei BLT-Methoden kennen gelernt, die CDC-Methoden BitBlt(...). Außer dieser Methode gibt es noch die CDC-Methoden PatBlt(...) und StretchBlt(...). Sehen wir uns alle drei Methoden nun etwas näher an.

Fangen wir mit der einfachsten Methode an, der Methode PatBlt(...). Mit Hilfe dieser Methode können rechteckige Bereiche eines DC mit einem beliebigen Muster ausgefüllt werden. Außer der Angabe der Position und Größe des zu füllenden Bereichs (in logischen Einheiten!) erhält die Methode als Parameter noch das Muster, mit dem der Bereich zu füllen ist. Als Muster sind die in der nachfolgenden Tabelle aufgeführten Konstanten erlaubt:

Konstante

Bedeutung

BLACKNESS Der Bereich wird schwarz ausgefüllt.
WHITENESS Der Bereich wird weiß ausgefüllt.
DSTINVERT Invertiert alle Pixel im Bereich, d.h. aus der Farbe gelb (RGB-Wert: 0xFF, 0xFF, 0x00) wird die Farbe blau (RGB-Wert: 0x00,0x00,0xFF).
PATCOPY Füllt den Bereich mit dem Muster des aktuellen Pinsel aus.
PATINVERT Verknüpft alle Pixel im Bereich durch den logischen XOR-Operator mit dem Muster des aktuellen Pinsel.

Die Wirkungsweise der ersten 4 Konstanten dürfte aus der Beschreibung hervorgehen. Mittels der ROP-Konstanten PATCOPY lässt sich z.B. der Hintergrund eines Fensters mit einem beliebigen Pinsel-Muster wie folgt ausfüllen:

// OnEraseBkgnd(...) wird immer dann aufgerufen,
// wenn der Hintergrund des Fensters neu gezeichnet werden muss

BOOL CBltFuncView::OnEraseBkgnd(CDC* pDC)
{
   
// TODO: Code für die Behandlungsroutine für Nachrichten ....
    CRect CClientRect;
    GetClientRect(&CClientRect);
   
// Pinsel fuer Hintergrund erstellen
    CBrush CHatchBrush(HS_DIAGCROSS,RGB(255,0,0));
   
// Pinsel auswaehlen
    pDC->SelectObject(&CHatchBrush);
   
// und damit Hintergrund ausfuellen
    pDC->PatBlt (0,0,CClientRect.right,CClientRect.bottom,PATCOPY);
    return TRUE;
}

Die Wirkungsweise der Konstanten PATINVERT lässt sich am Besten an Hand eines Beispiels aufzeigen. Sehen Sie sich zunächst das nachfolgende Bild an:

Hier wurde zuerst ein blauer Text (RGB-Wert: 0x00,0x00,0xFF) auf weißem Hintergrund (RGB-Wert: 0xFF,0xFF,0xFF) ausgegeben. Anschließend wurde ein rot/weiß gestreifter Pinsel erstellt und selektiert. Zum Schluss wurde mittels PatBlt(...) und der ROP-Konstanten PATINVERT der Schriftbereich 'übermalt'. Dies hat zur Folge, dass der weiße Fensterhintergrund zum schwarzen Hintergrund wird ( RGB(0xFF,0xFF,0xFF) XOR RGB(0x00,0x00,0x00) = RGB(0xFF,0xFF,0xFF) ). An den Stellen, an denen die roten Linien des Pinsels auftreten, ergibt sich nun eine türkisfarbene Linie (RGB(0xFF,0xFF,0xFF) XOR RGB(0xFF,0x00,0x00) = RGB(0x00,0xFF,0xFF). Entsprechende Farbverschiebungen gibt es selbstverständlich auch bei der ursprünglich blauen Schrift.

'Übermalen' Sie mittels PatBlt(..., PATINVERT) zweimal einen Bereich mit dem gleichen Pinsel, so erhalten Sie wieder den ursprünglichen Zustand!

Als nächstes sehen wir uns die inzwischen bekannte CDC-Methode BitBlt(...) an. Worauf es uns hier nun ankommt ist die Bedeutung des letzten Parameters. Er steuert wie der Quellbereich in den Zielbereich kopiert wird. Hierfür sind eine ganze Reihe von Konstanten definiert die in der nachfolgenden Tabelle aufgeführt sind:

Konstante

Bedeutung

BLACKNESS Füllt den Zielbereich schwarz aus.
DSTINVERT Invertiert alle Pixel im Zielbereich.
MERGECOPY Verundet den Quellbereich mit dem aktuellen Pinsel und kopiert das Ergebnis in den Zielbereich.
MERGEPAINT Verodert den invertierten Quellbereich mit dem Zielbereich.
NOTSRCCOPY Kopiert den invertierten Quellbereich in den Zielbereich.
NOTSRCERASE Kopiert das invertierte Ergebnis der Veroderung des Quellbereichs und des Zielbereichs in den Zielbereich.
PATCOPY Kopiert den aktuellen Pinsel in den Zielbereich.
PATINVERT Verknüpft den Quellbereich mit dem aktuellen Pinsel durch eine XOR-Verknüpfung.
PATPAINT Invertiert den Quellbereich und verodert ihn mit dem aktuellen Pinsel. Das Ergebnis dieser Operation wird mit dem Zielbereich verodert.
SRCAND Verundet den Quell- und Zielbereich und kopiert das Ergebnis in den Zielbereich.
SRCCOPY Kopiert den Quellbereich in den Zielbereich.
SRCERASE Invertiert den Zielbereich und verundet das Ergebnis mit dem Quellbereich.
SRCINVERT Verknüpft den Quell- und Zielbereich durch eine XOR-Verknüpfung.
SRCPAINT Verodert den Quell- und Zielbereich.
WHITENESS Füllt den Zielbereich weiß aus.

Da manche (oder besser gesagt, die meisten) der Operationen nicht sogleich ihre Auswirkungen offenbaren, sollen diese an Hand eines Beispiels veranschaulicht werden. Der Zielbereich besteht hier aus einem Fenster, dessen Hintergrund mit einem rotem HS_DIAGCROSS Pinsel ausgefüllt wurde. Der Quellbereich besteht aus einer kleinen Bitmap (siehe auch erstes Bild bei SRCCOPY). Als aktueller Pinsel wird ein roter HS_HORIZONAL Pinsel verwendet und die aktuelle Hintergrundfarbe ist gelb.

BltModes 1-4

SRCCOPY
DSTINVERT
MERGECOPY
MERGEPAINT

BltModes 5-8

NOTSRCCOPY
NOTSRCERASE
PATCOPY
PATINVERT

BltModes 9-12

PATPAINT
SRCAND
SRCERASE
SRCINVERT

Die letzte BLT-Methode ist die CDC-Methode StretchBlt(...). Diese Methode arbeitet prinzipiell wie die vorherige Methode BitBlt(...), nur mit dem Unterschied, dass die Größen des Quellbereichs und des Zielbereichs unterschiedlich sein können. Hierbei können im zwei Fälle auftreten:

  • Der Zielbereich ist größer als der Quellbereich. Einzelne Zeilen und Spalten werden dupliziert. Ist das Größenverhältnis nicht ein ganzzahliges Vielfaches kann das Ausgangsbild verzerrt werden.
  • Der Zielbereich ist kleiner als der Quellbereich: Einzelne Zeilen und Spalten werden zusammengefasst. Wie diese Zusammenfassung erfolgen soll kann mit der CDC-Methode SetStretchBltMode(...) eingestellt werden.

Die Methode SetStretchBltMode(...) bestimmt die Art der Kompression und kann eine der folgenden Konstanten sein:

Konstante

Bedeutung

BLACKONWHITE Die zusammenzufassenden Bits werden UND-Verknüpft. Das Ergebnis-Bit ist nur dann weiß, wenn alle zusammengefassten Bits ebenfalls weiß sind (schwarz hat Vorrang vor weiß). Dies ist die Default-Einstellung!!
WHITEONBLACK Die zusammenzufassenden Bits werden ODER-Verknüpft. Das Ergebnis-Bit ist nur dann schwarz, wenn alle zusammengefasste Bits ebenfalls schwarz sind.
COLORONCOLOR Die überzähligen Bits werden ignoriert. Dieses Verfahren ist für farbige Bitmaps das beste.
HALFTONE Ermittelt die durchschnittliche Farbe im zu komprimierenden Pixelbereich. Sie müssen nach dem Setzen dieses Stretchmodus unbedingt die API-Funktion UnrealizeObject(...), SetBrushOrgEx(...) und SelectObject(...) aufrufen.

Die Methode StretchBitBlt(...) eignet sich hervorragende zum Vergrößern (oder Verkleinern) von Fensterinhalten.

Kopieren Sie sich einmal das in einer der vorherigen Lektionen erstellte Programm 05GDI\GDIFunc in ihren Arbeitsbereich. Diese Programm stellt eine Messkurve stets fensterfüllend dar. Wenn Sie z.B. der Bereich um den Nullpunkt besonders interessiert, dann können Sie diesen vergrößert darstellen. Dazu ist die OnDraw(...) Methode wie folgt zu erweitern:
void CGDIFuncView::OnDraw(CDC* pDC)
{
    ....
    // Polygon zeichnen
    pDC->Polygon(m_pPts,m_nNoOfPts);

    // Kurven um den Nullpunkt zoomen
    // Hoehe des zu zoomenden Bereichs
    int nHeight = m_nYMax-m_nYMin;
    // Zoombereich
    int nXRange = 20;
    // Zoomfaktor
    int nZoomFactor = 2;
    // Bereich zoomen
    pDC->StretchBlt(-nXRange>>1,m_nYMin, nXRange,nHeight,
                    pDC,
                    (-nXRange>>1)/nZoomFactor,m_nYMin,
                    nXRange/nZoomFactor,nHeight,SRCCOPY);
    // und mit schwarzem Rechteck einrahmen
    pDC->SelectStockObject(BLACK_PEN);
    pDC->SelectStockObject(NULL_BRUSH);
    pDC->Rectangle(-nXRange>>1,m_nYMin,nXRange>>1,m_nYMax);

}

 



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