合成モードを使用してアルファ ブレンドを制御する
次の特性を持つ画面外ビットマップを作成する必要がある場合があります。
- 色のアルファ値が 255 未満。
- ビットマップを作成する際、色がアルファ ブレンドされない。
- 完成したビットマップを表示すると、ビットマップ内の色が、ディスプレイ デバイスの背景色とアルファ ブレンドされる。
このようなビットマップを作成するには、空の Bitmap オブジェクトを作成し、そのビットマップに基づいて Graphics オブジェクトを構築します。 Graphics オブジェクトの合成モードを CompositingModeSourceCopy に設定します。
次の例では、Bitmap オブジェクトに基づいて Graphics オブジェクトを作成します。 このコードでは、 グラフィックス オブジェクトと 2 つの半透明ブラシ (アルファ = 160) を使用してビットマップに描画します。 このコードを実行すると、赤の楕円と緑の楕円が半透明のブラシで塗りつぶされます。 緑の楕円は赤の楕円と重なりますが、 Graphics オブジェクトの合成モードが CompositingModeSourceCopy に設定されているため、緑は赤とブレンドされません。
次に、 BeginPaint を呼び出し、デバイス コンテキストに基づいて Graphics オブジェクトを作成することで、画面に描画する準備をします。 このコードでは、画面上にビットマップが 2 回描画されます。1 回は白の背景に対して、もう 1 回はマルチカラーの背景に対してです。 2 つの楕円の一部になっているビットマップのピクセルについては、アルファ成分が 160 であるため、楕円が画面の背景色とブレンドされます。
// 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);
次の図は、上記のコードの出力を示しています。 楕円が背景とブレンドされていますが、互いにブレンドされてはいないことに注意してください。
上記のコード例には、次のステートメントがあります。
bitmapGraphics.SetCompositingMode(CompositingModeSourceCopy);
楕円を背景とブレンドするだけでなく、相互にもブレンドしたい場合は、ステートメントを次のように変更します。
bitmapGraphics.SetCompositingMode(CompositingModeSourceOver);
次の図は、変更後のコードの出力を示したものです。