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.
 |
SRCCOPY
|
DSTINVERT
|
MERGECOPY
|
MERGEPAINT
|
 |
NOTSRCCOPY
|
NOTSRCERASE
|
PATCOPY
|
PATINVERT
|
 |
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);
} |
|
|