日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

半透明AlphaBlend

發(fā)布時(shí)間:2025/3/12 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 半透明AlphaBlend 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
AlphaBlend

??? 函數(shù)功能:該函數(shù)用來顯示透明或半透明像素的位圖。

函數(shù)原型:

BOOL AlphaBlend( HDC hdcDest, // handle to destination DCint nXOriginDest, // x-coord of upper-left cornerint nYOriginDest, // y-coord of upper-left cornerint nWidthDest, // destination widthint nHeightDest, // destination heightHDC hdcSrc, // handle to source DCint nXOriginSrc, // x-coord of upper-left cornerint nYOriginSrc, // y-coord of upper-left cornerint nWidthSrc, // source widthint nHeightSrc, // source heightBLENDFUNCTION blendFunction // alpha-blending function);

參數(shù):

hdcDest:指向目標(biāo)設(shè)備環(huán)境的句柄。nXoriginDest:指定目標(biāo)矩形區(qū)域左上角的X軸坐標(biāo),按邏輯單位。nYOriginDest:指定目標(biāo)矩形區(qū)域左上角的Y軸坐標(biāo),按邏輯單位。nWidthDest:指定目標(biāo)矩形區(qū)域的寬度,按邏輯單位。hHeghtdest:指向目標(biāo)矩形區(qū)域高度的句柄,按邏輯單位。hdcSrc:指向源設(shè)備環(huán)境的句柄。nXOriginSrc:指定源矩形區(qū)域左上角的X軸坐標(biāo),按邏輯單位。nYOriginSrc:指定源矩形區(qū)域左上角的Y軸坐標(biāo),按邏輯單位。nWidthSrc:指定源矩形區(qū)域的寬度,按邏輯單位。nHeightSrc:指定源矩形區(qū)域的高度,按邏輯單位。blendFunction:指定用于源位圖和目標(biāo)位圖使用的alpha混合功能,用于整個(gè)源位圖的全局alpha值和格式信息。源和目標(biāo)混合功能當(dāng)前只限為AC_SRC_OVER。

?

BLENDFUNCTION是AlphaBlend用控制透明效果的重要參數(shù).定義如下: typedef struct _BLENDFUNCTION {BYTE BlendOp;BYTE BlendFlags;BYTE SourceConstantAlpha;BYTE AlphaFormat; }BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION; BlendOp: 這個(gè)參數(shù)必須也只能為AC_SRC_OVER(0x00),意思就是把源圖片覆蓋到目標(biāo)之上.BlendFlags: 必須為0SourceConstantAlpha: 簡(jiǎn)寫為SCA,指定源圖片的透明度,這個(gè)值是會(huì)和源圖片的Alpha通道值合并計(jì)算的. //設(shè)置透明度,0為完全透明,255為完全不透明 AlphaFormat: 可以填兩種,一種是0x00,一種是AC_SRC_ALPHA(0x01).填0的話,AlphaBlend據(jù)說就和BitBlt一樣了,我沒有試驗(yàn)過~填1的話,源DC必須是32位的DC不然的話,AlphaBlend會(huì)返回參數(shù)錯(cuò)誤.計(jì)算公式(當(dāng)SCA不是0xFF時(shí)):輸出像素(R,G,B,A) = 源像素(R,G,B,A) * SCA / 0xFF + 目標(biāo)像素(R,G,B,A) * (1.0 - SCA / 0xFF)當(dāng)SCA是0xFF時(shí),計(jì)算公式輸出像素(R,G,B,A) = 源像素(R,G,B,A) + 目標(biāo)像素(R,G,B,A) * (1.0 - 源像素(A) / 0xFF)混合計(jì)算公式輸出像素(R,G,B) = 源像素(R,G,B) * SCA / 0xFF + 目標(biāo)像素(R,G,B) * (1.0 - 源像素(A) / 0xFF * SCA / 0xFF)

?

??? AlphaBlend返回值:如果函數(shù)執(zhí)行成功,那么返回值為TRUE;如果函數(shù)執(zhí)行失敗,那么返回值為FALSE。
??
??? Windows NT:若想獲取更多錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
??? 備注:如果源矩形區(qū)域與目標(biāo)矩形區(qū)域大小不一樣,那么將縮放源位圖與目標(biāo)矩形區(qū)域匹配。如果使用SetStretchBltMode函數(shù),那么iStretchMode的值是BLACKONWHITE和WHITEONBLACK,在本函數(shù)中,iStretchMode的值自動(dòng)轉(zhuǎn)換成COLORONCOLOR。目標(biāo)坐標(biāo)使用為目標(biāo)設(shè)備環(huán)境當(dāng)前指定的轉(zhuǎn)換方式進(jìn)行轉(zhuǎn)換。源坐標(biāo)則使用為源設(shè)備環(huán)境指定的當(dāng)前轉(zhuǎn)換方式進(jìn)行轉(zhuǎn)換。如果源設(shè)備環(huán)境標(biāo)識(shí)為增強(qiáng)型圖元文件設(shè)備環(huán)境,那么會(huì)出錯(cuò)(并且該函數(shù)返回FALSE)。如果目標(biāo)和源位圖的色彩格式不同,那么AlphaBlend將源位圖轉(zhuǎn)換以匹配目標(biāo)位圖。
??? AlphaBlend不支持鏡像。如果源或目標(biāo)區(qū)域的寬度或高度為負(fù)數(shù),那么調(diào)用將失敗。

下面是一個(gè)例子:
??

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

?

總結(jié)

以上是生活随笔為你收集整理的半透明AlphaBlend的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。