本文由BlueCoder編寫 轉載請說明出處:
http://blog.csdn.net/crocodile__/article/details/10156817
我的郵箱:[email protected] 歡迎大家和我交流編程心得
我的微博:BlueCoder_黎小華 歡迎光臨^_^
我們知道位圖中大多都有alpha信息(圖像通道),專用於位圖的透明
今天使用的這個函數AlphaBlend——從名字上看,是"Alpha混合"的意思——那麼既然是Alpha,也就和位圖的透明相關了
OK,我們先來看看msdn中對於這個函數的說明:
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 );
前10個參數,應該不言而喻,我在這裏着重講一下最後一個參數blendFunction,它是BLENDFUNCTION類型的變量——繼續看msdn:
typedef struct _BLENDFUNCTION { BYTE BlendOp; BYTE BlendFlags; BYTE SourceConstantAlpha; BYTE AlphaFormat; }BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
1>參數BlendOp,混合操作,這個目前有且僅有一種方式AC_SRC_OVER,它表示源位圖通過基於alpha信息放到目標位圖上
2>參數BlendFlags,混合標記,只能是0
3>參數SourceConstantAlpha,大致上表示位圖的透明度(0~255)。如果爲0,就是完全透明;如果是255,就不透明
4>參數AlphaFormat,如果設定爲AC_SRC_ALPHA,那麼你的位圖必須是32位的;如果你的位圖不是32位的(一般24位居多,RGB),就不要用它,直接賦0就行了
另外,這個函數包含在msimg32.lib這個庫文件中,使用它時,記得導入這個庫:
//導入msimg32.lib庫
#pragma comment(lib, "msimg32.lib")
…………………………………………………………………………
有了這些基礎知識後,接下來,介紹一下今天程序實現的功能:
通過滾動鼠標中鍵(滾輪),來控制位圖的透明度——向後滾動,越來越透明;反之,越來越不透明
還是先來看看程序運行效果:
下面進入代碼階段:(貼出主要代碼,內含註釋)
1>初始化操作
case WM_CREATE:
//加載位圖信息
hBmp = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,
MAKEINTRESOURCE(IDB_BITMAP1));
{
BITMAP bmp;
GetObject(hBmp, sizeof(BITMAP), &bmp);
sBmp.cx = bmp.bmWidth;
sBmp.cy = bmp.bmHeight;
}
//初始化混合結構體成員
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = bTrans;
bf.AlphaFormat = 0;
return 0 ;
2>繪製透明位圖
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBmp);
AlphaBlend(hdc, 0, 0, sBmp.cx, sBmp.cy,
hdcMem, 0, 0, sBmp.cx, sBmp.cy, bf);//繪製指定透明度的位圖
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
return 0;
3>響應鼠標滾輪消息,來控制透明度
case WM_MOUSEWHEEL:
//修改透明度(0~254)
if(GET_WHEEL_DELTA_WPARAM(wParam) > 0 && bTrans <= 234)
{
bTrans += 20;
bf.SourceConstantAlpha = bTrans;
InvalidateRect(hwnd, NULL, FALSE);//加深 , 就不重繪背景
}
if(GET_WHEEL_DELTA_WPARAM(wParam) < 0 && bTrans >= 20)
{
bTrans -= 20;
bf.SourceConstantAlpha = bTrans;
InvalidateRect(hwnd, NULL, TRUE);//加淺 , 需要重繪背景
}
return 0;
有些朋友可能在處理這個消息時,編譯器可能會提示錯誤,解決方案參見我的博文:
OK,今天兒就到此爲止了
源代碼及相關資源下載