AlphaBlend
函數功能:該函數用來顯示透明或半透明像素的位圖。
函數原型:
BOOL AlphaBlend( HDC hdcDest, // handle to destination DC int nXOriginDest, // x-coord of upper-left corner int nYOriginDest, // y-coord of upper-left corner int nWidthDest, // destination width int nHeightDest, // destination height HDC hdcSrc, // handle to source DC int nXOriginSrc, // x-coord of upper-left corner int nYOriginSrc, // y-coord of upper-left corner int nWidthSrc, // source width int nHeightSrc, // source height BLENDFUNCTION blendFunction // alpha-blending function);
參數:
hdcDest:指向目標設備環境的句柄。
nXoriginDest:指定目標矩形區域左上角的X軸坐標,按邏輯單位。
nYOriginDest:指定目標矩形區域左上角的Y軸坐標,按邏輯單位。
nWidthDest:指定目標矩形區域的寬度,按邏輯單位。
hHeghtdest:指向目標矩形區域高度的句柄,按邏輯單位。
hdcSrc:指向源設備環境的句柄。
nXOriginSrc:指定源矩形區域左上角的X軸坐標,按邏輯單位。
nYOriginSrc:指定源矩形區域左上角的Y軸坐標,按邏輯單位。
nWidthSrc:指定源矩形區域的寬度,按邏輯單位。
nHeightSrc:指定源矩形區域的高度,按邏輯單位。
blendFunction:指定用於源位圖和目標位圖使用的alpha混合功能,用於整個源位圖的全局alpha值和格式信息。源和目標混合功能當前只限為AC_SRC_OVER。
BLENDFUNCTION是AlphaBlend用控制透明效果的重要參數.定義如下:
typedef struct _BLENDFUNCTION { BYTE BlendOp; BYTE BlendFlags; BYTE SourceConstantAlpha; BYTE AlphaFormat; }BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
BlendOp: 這個參數必須也只能為AC_SRC_OVER(0x00),意思就是把源圖片覆蓋到目標之上. BlendFlags: 必須為0 SourceConstantAlpha: 簡寫為SCA,指定源圖片的透明度,這個值是會和源圖片的Alpha通道值合並計算的. //設置透明度,0為完全透明,255為完全不透明 AlphaFormat: 可以填兩種,一種是0x00,一種是AC_SRC_ALPHA(0x01).填0的話,AlphaBlend據說就和BitBlt一樣了,我沒有試驗過~填1的話,源DC必須是32位的DC不然的話,AlphaBlend會返回參數錯誤. 計算公式(當SCA不是0xFF時): 輸出像素(R,G,B,A) = 源像素(R,G,B,A) * SCA / 0xFF + 目標像素(R,G,B,A) * (1.0 - SCA / 0xFF) 當SCA是0xFF時,計算公式 輸出像素(R,G,B,A) = 源像素(R,G,B,A) + 目標像素(R,G,B,A) * (1.0 - 源像素(A) / 0xFF) 混合計算公式 輸出像素(R,G,B) = 源像素(R,G,B) * SCA / 0xFF + 目標像素(R,G,B) * (1.0 - 源像素(A) / 0xFF * SCA / 0xFF)
AlphaBlend返回值:如果函數執行成功,那么返回值為TRUE;如果函數執行失敗,那么返回值為FALSE。
Windows NT:若想獲取更多錯誤信息,請調用GetLastError函數。
備注:如果源矩形區域與目標矩形區域大小不一樣,那么將縮放源位圖與目標矩形區域匹配。如果使用SetStretchBltMode函數,那么iStretchMode的值是BLACKONWHITE和WHITEONBLACK,在本函數中,iStretchMode的值自動轉換成COLORONCOLOR。目標坐標使用為目標設備環境當前指定的轉換方式進行轉換。源坐標則使用為源設備環境指定的當前轉換方式進行轉換。如果源設備環境標識為增強型圖元文件設備環境,那么會出錯(並且該函數返回FALSE)。如果目標和源位圖的色彩格式不同,那么AlphaBlend將源位圖轉換以匹配目標位圖。
AlphaBlend不支持鏡像。如果源或目標區域的寬度或高度為負數,那么調用將失敗。
下面是一個例子:
#include <windows.h> #include <atldbcli.h> #pragma comment(lib,"Msimg32.lib") HINSTANCE g_hIns; HWND g_hWnd; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); TCHAR szText[] = TEXT("win32 AlphaBlend"); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow) { g_hIns=hInstance; static TCHAR szAppName[]=TEXT("HelloWin"); HWND hWnd; MSG msg; WNDCLASS wndClass; wndClass.style=CS_HREDRAW|CS_VREDRAW; wndClass.lpfnWndProc=WndProc; wndClass.cbClsExtra=0; wndClass.cbWndExtra=0; wndClass.hInstance=hInstance; wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); wndClass.hCursor=LoadCursor(NULL,IDC_ARROW); wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName=NULL; wndClass.lpszClassName=szAppName; if(!RegisterClass(&wndClass)) { MessageBox(NULL,TEXT("error"),szAppName,MB_ICONERROR|MB_OK); return 0; } hWnd=CreateWindow(szAppName,TEXT("The hello program"),WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); //也可以放在此 ShowWindow(hWnd,iCmdShow); UpdateWindow(hWnd); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { static HDC hdc; static HDC hBitmapDC; static HBITMAP hBitmap; static int w=200; static int h=100; static BLENDFUNCTION bf = {0}; PAINTSTRUCT ps; switch (message) { case WM_PAINT : { hdc=BeginPaint(hWnd,&ps); hBitmapDC = CreateCompatibleDC(hdc); hBitmap = CreateCompatibleBitmap(hdc,w,h); SelectObject(hBitmapDC,hBitmap); SetTextColor(hBitmapDC,RGB(255,0,0)); TextOut(hBitmapDC,20,20,szText,strlenT(szText)); bf.BlendOp = AC_SRC_OVER; bf.BlendFlags = 0; bf.AlphaFormat = 0; bf.SourceConstantAlpha = 75; AlphaBlend(hdc,0,0,w,h,hBitmapDC,0,0,w,h,bf); DeleteObject(hBitmap); DeleteDC( hBitmapDC ); EndPaint (hWnd, &ps) ; } break; case WM_DESTROY : PostQuitMessage(0); break ; } return DefWindowProc (hWnd, message, wParam, lParam) ; }