共用方式為


使用組合模式控制 Alpha 混合

有時候,您可能會想要建立具有下列特性的螢幕外點陣圖:

  • 色彩具有小於 255 的 Alpha 值。
  • 當您建立點陣圖時,色彩不會彼此混合。
  • 當您顯示完成的點陣圖時,點陣圖中的色彩會與顯示裝置上的背景色彩混合。

若要建立這類點陣圖,請建構空白 點陣圖 物件,然後根據該點陣圖建構 Graphics 物件。 將 Graphics 物件的撰寫模式設定為 CompositingModeSourceCopy。

下列範例會根據Bitmap物件建立Graphics物件。 程式碼會使用 Graphics 物件以及兩個半透明筆刷, (Alpha = 160) 繪製點陣圖。 程式碼會使用半透明筆刷填滿紅色橢圓形和綠色橢圓形。 綠色橢圓形與紅色橢圓形重迭,但綠色不會與紅色混合,因為 Graphics 物件的組合模式設定為 CompositingModeSourceCopy。

接下來,程式碼會呼叫 BeginPaint 並根據裝置內容建立 Graphics 物件,以準備在畫面上繪製。 程式碼會在畫面上繪製點陣圖兩次:一次位於白色背景,一次位於多色背景。 點陣圖中屬於兩個橢圓形的圖元具有 160 的 Alpha 元件,因此省略號會與螢幕上的背景色彩混合。

// 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);

下圖顯示修訂程式碼的輸出。

使用組合模式控制 Alpha 混合圖例