Verwenden des Compositing-Modus zum Steuern von Alphablending
Es kann vorkommen, dass Sie eine Off-Screen-Bitmap mit den folgenden Merkmalen erstellen möchten:
- Farben weisen Alphawerte auf, die kleiner als 255 sind.
- Farben werden beim Erstellen der Bitmap nicht miteinander kombiniert.
- Wenn Sie die fertige Bitmap anzeigen, werden die Farben in der Bitmap mit den Hintergrundfarben auf dem Anzeigegerät kombiniert.
Um eine solche Bitmap zu erstellen, erstellen Sie ein leeres Bitmap-Objekt, und erstellen Sie dann ein Grafikobjekt basierend auf dieser Bitmap. Legen Sie den Compositingmodus des Graphics-Objekts auf CompositingModeSourceCopy fest.
Im folgenden Beispiel wird ein Graphics-Objekt basierend auf einem Bitmap-Objekt erstellt. Der Code verwendet das Graphics-Objekt zusammen mit zwei semitransparenten Pinseln (alpha = 160), um auf der Bitmap zu zeichnen. Der Code füllt eine rote Ellipse und eine grüne Ellipse mithilfe der semitransparenten Pinsel aus. Die grüne Ellipse überlappt die rote Ellipse, aber das Grün wird nicht mit dem Rot kombiniert, da der Compositingmodus des Graphics-Objekts auf CompositingModeSourceCopy festgelegt ist.
Als Nächstes bereitet der Code das Zeichnen auf dem Bildschirm vor, indem BeginPaint aufgerufen und ein Grafikobjekt basierend auf einem Gerätekontext erstellt wird. Der Code zeichnet die Bitmap zweimal auf dem Bildschirm: einmal auf einem weißen Hintergrund und einmal auf einem mehrfarbigen Hintergrund. Die Pixel in der Bitmap, die Teil der beiden Ellipsen sind, haben eine Alphakomponente von 160, sodass die Ellipsen mit den Hintergrundfarben auf dem Bildschirm kombiniert werden.
// Create a blank bitmap.
Bitmap bitmap(180, 100);
// Create a Graphics object that can be used to draw on the bitmap.
Graphics bitmapGraphics(&bitmap);
// Create a red brush and a green brush, each with an alpha value of 160.
SolidBrush redBrush(Color(210, 255, 0, 0));
SolidBrush greenBrush(Color(210, 0, 255, 0));
// Set the compositing mode so that when overlapping ellipses are drawn,
// the colors of the ellipses are not blended.
bitmapGraphics.SetCompositingMode(CompositingModeSourceCopy);
// Fill an ellipse using a red brush that has an alpha value of 160.
bitmapGraphics.FillEllipse(&redBrush, 0, 0, 150, 70);
// Fill a second ellipse using green brush that has an alpha value of 160.
// The green ellipse overlaps the red ellipse, but the green is not
// blended with the red.
bitmapGraphics.FillEllipse(&greenBrush, 30, 30, 150, 70);
// Prepare to draw on the screen.
hdc = BeginPaint(hWnd, &ps);
Graphics* pGraphics = new Graphics(hdc);
pGraphics->SetCompositingQuality(CompositingQualityGammaCorrected);
// Draw a multicolored background.
SolidBrush brush(Color((ARGB)Color::Aqua));
pGraphics->FillRectangle(&brush, 200, 0, 60, 100);
brush.SetColor(Color((ARGB)Color::Yellow));
pGraphics->FillRectangle(&brush, 260, 0, 60, 100);
brush.SetColor(Color((ARGB)Color::Fuchsia));
pGraphics->FillRectangle(&brush, 320, 0, 60, 100);
// Display the bitmap on a white background.
pGraphics->DrawImage(&bitmap, 0, 0);
// Display the bitmap on a multicolored background.
pGraphics->DrawImage(&bitmap, 200, 0);
delete pGraphics;
EndPaint(hWnd, &ps);
Die folgende Abbildung zeigt die Ausgabe des vorangehenden Codes. Beachten Sie, dass die Ellipsen mit dem Hintergrund kombiniert sind, aber nicht miteinander kombiniert werden.

Das vorangehende Codebeispiel enthält die folgende -Anweisung:
bitmapGraphics.SetCompositingMode(CompositingModeSourceCopy);
Wenn die Ellipsen sowohl miteinander als auch mit dem Hintergrund kombiniert werden sollen, ändern Sie diese Anweisung wie folgt:
bitmapGraphics.SetCompositingMode(CompositingModeSourceOver);
Die folgende Abbildung zeigt die Ausgabe des überarbeiteten Codes.
