براى نمايش يك alpha Bitmap كه Bitmapي است كه پيكسل هاي transparent (شفاف) يا semi-transparent (نيمه شفاف) دارد استفاده مي شود.
به اضافه كانالهاي رنگ قرمز، سبز و آبي، هر پيكسلي در يك alpha Bitmap يك موله شفافيت دارد كه از آن به عنوان كانال آلفا ياد مي شود. كانال آلفا حاوي همان تعداد بيت هايي است كه در كانال رنگ وجود دارد. به عنوان مثال يك كانال آلفاي 8 بيت مي تواند 256 مرحله يا Level از شفافيت را به نمايش بگذاريد. از 0 (تمام تصوير شفاف است) تا 256 (تمام تصوير مات است). مكانيسم AlphaBlending (يا تركيب كردن آلفا) بوسيله صدا كردن تابع AlphaBlend احضار مي شود. تابع AlphaBlend بيتمتهايي را كه پيكسل هاي شفاف يا نيمه شفاف دارند نمايش مي دهد. اين تابع در ويندوز 95 و حتي در ويندوزهاي NT قبل از ويندوز 2000 پشتيباني نمي شد.
كد زير يك پنجره را به سه قسمت افقي تقسيم مي كند. آنگاه يك Bitmap به صورت alpha-blend شده (تركيب آلفا شده) در هر يك از قسمتهاي پنجره نمايش مي دهد.
کد:
const
AC_SRC_ALPHA = $1;
procedure DrawAlphaBlend (hWnd : HWND; hdcwnd : HDC);
var
Ahdc : HDC; // handle of the DC we will create
bf : BLENDFUNCTION; // structure for alpha blending
Ahbitmap : HBITMAP; // bitmap handle
bmi : BITMAPINFO; // bitmap header
pvBits : pointer; // pointer to DIB section
ulWindowWidth,
ulWindowHeight : ULONG; // window width/height
ulBitmapWidth,
ulBitmapHeight : ULONG; // bitmap width/height
rt : TRect; // used for getting window dimensions
begin
// get window dimensions
GetClientRect(hWnd, rt);
// calculate window width/height
ulWindowWidth := rt.right - rt.left;
ulWindowHeight := rt.bottom - rt.top;
// make sure we have at least some window size
if ((ulWindowWidth = 0 ) and (ulWindowHeight=0)) then
exit;
// divide the window into 3 horizontal areas
ulWindowHeight := trunc(ulWindowHeight / 3);
// create a DC for our bitmap -- the source DC for AlphaBlend
Ahdc := CreateCompatibleDC(hdcwnd);
// zero the memory for the bitmap info
ZeroMemory(@bmi, sizeof(BITMAPINFO));
// setup bitmap info
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; // four 8-bit components
bmi.bmiHeader.biCompression := BI_RGB;
bmi.bmiHeader.biSizeImage := ulBitmapWidth * ulBitmapHeight * 4;
// create our DIB section and select the bitmap into the 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; // half of 0xff = 50% transparency
bf.AlphaFormat := 0; // ignore source alpha channel
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; // use source alpha
bf.SourceConstantAlpha := $ff; // opaque (disable constant alpha)
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);
// do cleanup
DeleteObject(Ahbitmap);
DeleteDC(Ahdc);