Альфа-наложение
Альфа-наложением (alpha blending) называется методика графического вывода, в которой пиксель вычисляется в виде взвешенной суммы двух пикселов (источника и приемника). Весовой коэффицент источника обычно называется альфа-коэффицентом(a). Нулевой альфа-коэффицент соответствует абсолютно прозрачным пикселам источника, а единичным – полностью непрозрачным пикселам. Т.е. представьте ситуацию: вы нарисовали два прямоугольника и один из них перекрыл другой. Теперь в том месте, где эти прямоугольники пересеклись, будет виден только тот, который был выведен последним. С помощью альфа-наложения можно было бы вывести эти прямоугольники полупрозрачными, чтобы их оба было видно. Вот об этом мы сейчас и поговорим.
Альфа-наложение относится к числу новых возможностей, появившихся в Windows 98 и Windows 2000. Вся поддержка состоит из одной структуры и одной функции.
typedef struct _BLENDFUNCTION {
BYTE BlendOp;
BYTE BlendFlags;
BYTE SouyrceConstantAlpha;
BYTE AlphaFormat;
} BLENDFUNCTION;
BOOL AlphaBlend(HDC hdcDesk, int nXOriginDest,int nYOriginDesk,
int nWidthDest, int nHeightDest,
HDC hdcSrc, int nXOriginSrc int nYOriginSrc,
int nWidthSrc, int nHeightSrc,
BLENDFUNCTION blendFDunction);
Как вы сами уже, наверное, поняли, это их API – прототип. Потом я покажу, как это при помощи MFC написать. А теперь разберемся с параметрами. Для начала возьмем структуру. Поле BlendOp должно быть AC_SRC_OVER. Поле BlendFlags – 0. Поле SouyrceConstantAlpha может быть от 0 до 255, в зависимости от прозрачности. Поле AlphaFormat может быть 0, при постоянном альфа-коэффиценте, а может быть AC_SRC_ALPHA. Но мы рассмотрим только первый вариант. Теперь время пришло и для самой функции. Первые 5 параметров определяют контекст устройства и прямоугольник приемной поверхности. Прошу обратить внимание: 3 и 4 параметры это не координата, а расстояние от первой точки, которая задается 2 и 3 параметрами. Следующие 5 параметров определяют контекст устройства источника и прямоугольник. Прошу опять-таки обратить внимание на 9 и 10 параметры. И последний параметр – структура BLENDFUNCTION.
А теперь пример:
CclientDC dc(this);
CBrush b(RGB(0,255,255));
dc.SelectObject(b);
dc.Rectangle(0,0,100,100);
BLENDFUNCTION blend={AC_SRC_OVER,0,255/2,0};
dc.AlphaBlend(100,100,100,100,&dc,0,0,100,100,blend);
Этот пример написан с использованием MFC. Он просто рисует квадрат (0,0,100,100), а потом этот же квадрат рисуется от 100,100 до 200,200, но уже полупрозрачным. Я думаю, смысл вам понятен. Можно было бы нарисовать еще один квадрат и потом с помощью альфа-наложения изобразить их, чтобы один из них перекрывал другого. Тогда будут видны оба прямоугольника. Но в этом не главная прелесть альфа-наложения. Если выводить в одно и тоже место какую-то фигуру, допустим с коэффициентом a равным 50, то через 5-6 выводов будет полностью непрозрачная фигура. Так можно реализовать эффект постепенного появления, что выглядит довольно эффектно. Но я думаю, вы сами с этим разберетесь, ведь это не такая сложная тема (всего же 1 функция).