www.demi-s.narod.ru

Delphi
Статьи:

· Интерфейс

· WinAPI

· Компоненты

· Базы данных

· ShellAPI



WinAPI


Использование функции AlphaBlend в Delphi

AlphaBlending используется, чтобы отобразить точечный рисунок с прозрачными или полупрозрачными пикселами.

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


Hosted by uCoz