Usar el modo de composición para controlar la combinación alfa
Es posible que haya ocasiones en las que quiera crear un mapa de bits fuera de la pantalla que tenga las siguientes características:
- Colores que tengan valores alfa inferiores a 255.
- Colores que no se combinen entre sí al crear el mapa de bits.
- Cuando se muestra el mapa de bits terminado, los colores del mapa de bits son valores alfa combinados con los colores de fondo del dispositivo de presentación.
Para crear este tipo de mapa de bits, construya un objeto Bitmap en blanco y, a continuación, construya un objeto Graphics basado en ese mapa de bits. Establezca el modo de redacción del objeto Graphics en CompositingModeSourceCopy.
En el ejemplo siguiente se crea un objeto Graphics basado en un objeto Bitmap . El código usa el objeto Graphics junto con dos pinceles semitransparentes (alfa = 160) para pintar en el mapa de bits. El código rellena una elipse roja y una verde con los pinceles semitransparentes. La elipse verde se superpone a la elipse roja, pero el verde no se combina con el rojo porque el modo de composición del objeto Graphics se establece en CompositingModeSourceCopy.
A continuación, el código se prepara para dibujar en la pantalla llamando a BeginPaint y creando un objeto Graphics basado en un contexto de dispositivo. El código dibuja el mapa de bits en la pantalla dos veces: la primera en un fondo blanco y la segunda en un fondo multicolor. Los píxeles del mapa de bits que forman parte de las dos elipses tienen un componente alfa de 160, por lo que las elipses se combinan con los colores de fondo de la pantalla.
// 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);
En la ilustración siguiente se muestra la salida del código anterior. Tenga en cuenta que las elipses se combinan con el fondo, pero no entre sí.
El ejemplo de código anterior tiene la siguiente instrucción:
bitmapGraphics.SetCompositingMode(CompositingModeSourceCopy);
Si quiere que las elipses se combinen entre sí, así como con el fondo, cambie esa instrucción por lo siguiente:
bitmapGraphics.SetCompositingMode(CompositingModeSourceOver);
En la siguiente imagen se muestra el resultado del código revisado.