De compositingmodus gebruiken om alpha blending te beheren
Het kan voorkomen dat u een bitmap buiten het scherm wilt maken met de volgende kenmerken:
- Kleuren hebben alfawaarden die kleiner zijn dan 255.
- Kleuren worden niet met elkaar gemengd terwijl u de bitmap maakt.
- Wanneer u de voltooide bitmap weergeeft, worden de kleuren in de bitmap alpha geblend met de achtergrondkleuren op het weergaveapparaat.
Als u een dergelijke bitmap wilt maken, maakt u een leeg Bitmap object en maakt u vervolgens een Graphics object op basis van die bitmap. Stel de compositingmodus van het Graphics-object in op CompositingModeSourceCopy.
In het volgende voorbeeld wordt een Graphics-object gemaakt op basis van een Bitmap-object. De code maakt gebruik van het Graphics-object, samen met twee semitransparante borstels (alfa = 160) om op de bitmap te schilderen. De code vult een rode en een groene ellips met behulp van de semitransparante penselen. Het groene beletselteken overlapt het rode beletselteken, maar het groen wordt niet gemengd met het rood omdat de compositingmodus van het object Graphics is ingesteld op CompositingModeSourceCopy.
Vervolgens wordt de code voorbereid om op het scherm te tekenen door BeginPaint- aan te roepen en een Graphics-object te maken op basis van een apparaatcontext. De code tekent de bitmap twee keer op het scherm: eenmaal op een witte achtergrond en eenmaal op een achtergrond met meerdere kleuren. De pixels in de bitmap die deel uitmaken van de twee beletseltekens hebben een alfa-component van 160, zodat het beletselteken wordt gecombineerd met de achtergrondkleuren op het scherm.
// 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);
In de volgende afbeelding ziet u de uitvoer van de voorgaande code. Houd er rekening mee dat de ellipsen samensmelten met de achtergrond, maar ze smelten niet samen met elkaar.
Het voorgaande codevoorbeeld heeft de volgende instructie:
bitmapGraphics.SetCompositingMode(CompositingModeSourceCopy);
Als u wilt dat de ellipsen met elkaar en met de achtergrond worden vermengd, wijzigt u deze verklaring in het volgende:
bitmapGraphics.SetCompositingMode(CompositingModeSourceOver);
In de volgende afbeelding ziet u de uitvoer van de herziene code.