Использование режима создания элементов для управления альфа-смешения
Иногда может потребоваться создать точечный рисунок вне экрана со следующими характеристиками:
- Цвета имеют альфа-фактор менее 255.
- Цвета не смешиваются с альфа-смешением при создании точечного рисунка.
- При отображении готового точечного рисунка цвета в нем смешиваются с цветами фона на устройстве вывода.
Чтобы создать такое растровое изображение, создайте пустой объект Bitmap , а затем создайте объект Graphics на основе этого растрового рисунка. Установите режим создания объекта Graphics в значение CompositingModeSourceCopy.
В следующем примере создается объект Graphics на основе объекта Bitmap . Код использует объект Graphics вместе с двумя полупрозрачными кисть (альфа = 160) для рисования на растровом рисунке. Код заполняет красный эллипс и зеленый эллипс с помощью полупрозрачных кистей. Зеленый эллипс перекрывает красный эллипс, но зеленый не смешивается с красным, так как режим композитирования объекта Graphics имеет значение CompositingModeSourceCopy.
Затем код готовится к рисованию на экране путем вызова BeginPaint и создания объекта Graphics на основе контекста устройства. Код рисует точечный рисунок на экране дважды: один раз на белом фоне и еще раз на многоцветном. Пиксели точечного рисунка, являющиеся частью двух эллипсов, имеют альфа-компонент 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);
На рисунке ниже показан результат выполнения переработанного кода.