1. 程式人生 > >Windows核心程式設計_異型視窗

Windows核心程式設計_異型視窗

異型視窗是Windows200在視窗中引入的WS_EX_LAYERED風格,並搭配:SetLayeredWindowAttributes API實現的,這裡所說的異型視窗不是指橢圓型的視窗或三角型之類的視窗:


這一類的視窗在早期的Windows裡就已經規定了的,只需要在建立視窗時修改stsy風格就可以了,這裡所說的異型視窗是不規則口,比如一些遊戲介面:


類似這種在Windows並沒有顯示指定的風格介面

WS_EX_LAYERED風格是使窗體支援層次關係並支援透明,而SetLayeredWindowAttributes是設定視窗指定畫素點透明!

大致思路就是,在視窗上放置UI圖片並讓其支援WS_EX_LAYERED

風格,然後設定視窗背景色為黑色,在使用SetLayeredWindowAttributes設定視窗黑色畫素點為透明色,即可達到這種效果!

這裡我已經建立好一個視窗:


此視窗背景為黑色,影象為紅色,為什麼使用黑色?

答:SetLayeredWindowAttributes使畫素透明時一旦不在畫素範圍內的就不會使其透明化,那怕畫素值差1都不行,所以影象輪廓區域會留下一些痕跡鋸齒,剔除不明顯,所以黑色較暗,不明顯!

程式碼:

//獲取視窗控制代碼
	HWND hwnd = FindWindow(NULL, "1");
	//設定風格
	LONG t = GetWindowLong(hwnd, GWL_EXSTYLE);
	t |= WS_EX_LAYERED;
	SetWindowLong(hwnd, GWL_EXSTYLE, t);
	//設定透明
	SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);

執行效果:


這裡邊框我保留了下來方便移動,如果覺得礙眼可以增加:WS_POPUP風格去除:


被透明化的顏色會被滑鼠穿透,但是沒有被透明化的還是支援滑鼠訊息的!

最後對SetLayeredWindowAttributes函式介紹:

BOOL SetLayeredWindowAttributes(
HWND hwnd, // 指定分層視窗控制代碼
COLORREF crKey, // 指定需要透明的背景顏色值,可用RGB()巨集
BYTE bAlpha, // 設定透明度,0表示完全透明,255表示不透明
DWORD dwFlags // 透明方式
);
其中,dwFlags引數可取以下值:
LWA_ALPHA時:crKey引數無效,bAlpha引數有效;
LWA_COLORKEY:窗體中的所有顏色為crKey的地方將變為透明,bAlpha引數無效。其常量值為1。
LWA_ALPHA | LWA_COLORKEY:crKey的地方將變為全透明,而其它地方根據bAlpha引數確定透明度。
如果想讓視窗層次全部透明只需要使用:
LWA_ALPHA
風格即可,讓crkey引數失效,則讓視窗全部區域透明化,而不以層次關係區分!