|
| |
| Главная | |
Delphi | WinAPIИспользование функции AlphaBlend в DelphiAlphaBlending используется, чтобы отобразить точечный рисунок с прозрачными или полупрозрачными пикселами. Alpha-канал обычно содержит столько же бит, сколько и каналы цвета. Например, 8-bit alpha-канал может представлять 256 уровней прозрачности, от 0 (непрозрачный) до 255 (точечный рисунок полностью прозрачен). Функция AlphaBlend отображает точечные рисунки, которые имеют прозрачные или полупрозрачные пикселы. Это не поддерживается на всех версиях от Windows 95 до Windows 2000. Следующий пример делит окно на три горизонтальные полосы. Затем рисуется точечный рисунок с разным уровнем прозрачности в каждой области окна. const
AC_SRC_ALPHA = $1;
procedure DrawAlphaBlend (hWnd : HWND; hdcwnd : HDC);
var
Ahdc : HDC; // дескриптор DC, который мы создадим
bf : BLENDFUNCTION; // структура для alphablending
Ahbitmap : HBITMAP; // дескриптор точечного рисунка
bmi : BITMAPINFO; // заголовок точечного рисунка
pvBits : pointer; // указатель на секцию DIB
ulWindowWidth,
ulWindowHeight : ULONG; // размеры окна
ulBitmapWidth,
ulBitmapHeight : ULONG; // размеры точечного рисунка
rt : TRect; // используется для измерений окна
begin
// получаем размеры окна
GetClientRect(hWnd, rt);
// вычисляем ширину/высоту окна
ulWindowWidth := rt.right - rt.left;
ulWindowHeight := rt.bottom - rt.top;
// удостоверимся, что есть какой-то размер
if ((ulWindowWidth = 0 ) and (ulWindowHeight = 0)) then
exit;
// Делим окно на три горизонтальных области
ulWindowHeight := trunc(ulWindowHeight / 3);
// создаем DC для нашего точечного рисунка -- источник DC для AlphaBlend
Ahdc := CreateCompatibleDC(hdcwnd);
// обнулим память для информации точечного рисунка
ZeroMemory(@bmi, sizeof(BITMAPINFO));
// устанавливаем информацию точечного рисунка
bmi.bmiHeader.biSize := sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth := trunc(ulWindowWidth - (ulWindowWidth/5)*2);
ulBitmapWidth := trunc(ulWindowWidth - (ulWindowWidth/5)*2);
bmi.bmiHeader.biHeight := trunc(ulWindowHeight - (ulWindowHeight/5)*2);
ulBitmapHeight := trunc(ulWindowHeight - (ulWindowHeight/5)*2);
bmi.bmiHeader.biPlanes := 1;
bmi.bmiHeader.biBitCount := 32; // четыре 8-битных компонента
bmi.bmiHeader.biCompression := BI_RGB;
bmi.bmiHeader.biSizeImage := ulBitmapWidth * ulBitmapHeight * 4;
// создаем нашу секцию DIB и выбираем точечный рисунок в dc
Ahbitmap := CreateDIBSection(Ahdc, bmi, DIB_RGB_COLORS, pvBits, 0, 0);
SelectObject(Ahdc, Ahbitmap);
bf.BlendOp := AC_SRC_OVER;
bf.BlendFlags := 0;
bf.SourceConstantAlpha := $7f; // половина от 0xff = 50% прозрачности
bf.AlphaFormat := 0; // игнорируем исходный альфа канал
AlphaBlend(hdcwnd, trunc(ulWindowWidth/5), trunc(ulWindowHeight/5),
ulBitmapWidth, ulBitmapHeight,
Ahdc, 0, 0, ulBitmapWidth, ulBitmapHeight, bf);
bf.BlendOp := AC_SRC_OVER;
bf.BlendFlags := 0;
bf.AlphaFormat := AC_SRC_ALPHA; // используем источник alpha
bf.SourceConstantAlpha := $ff; // непрозрачен (отключаем)
AlphaBlend(hdcwnd, trunc(ulWindowWidth/5),
trunc(ulWindowHeight/5+ulWindowHeight), ulBitmapWidth, ulBitmapHeight,
Ahdc, 0, 0, ulBitmapWidth, ulBitmapHeight, bf);
bf.BlendOp := AC_SRC_OVER;
bf.BlendFlags := 0;
bf.AlphaFormat := 0;
bf.SourceConstantAlpha := $3A;
AlphaBlend(hdcwnd, trunc(ulWindowWidth/5),
trunc(ulWindowHeight/5+2*ulWindowHeight), ulBitmapWidth,
ulBitmapHeight, Ahdc, 0, 0, ulBitmapWidth,
ulBitmapHeight, bf);
// очищаем
DeleteObject(Ahbitmap);
DeleteDC(Ahdc);
end;
Источник: www.delphi3000.com |
| Copyright (c) Авраменко С. Н. 2008. |