半透明AlphaBlend


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) ;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM