位圖的透明效果——AlphaBlend函數的用法

本文由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,今天兒就到此爲止了

源代碼及相關資源下載
發佈了39 篇原創文章 · 獲贊 29 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章