Windows核心程式設計_異型視窗
阿新 • • 發佈:2019-01-25
異型視窗是Windows200在視窗中引入的WS_EX_LAYERED風格,並搭配:SetLayeredWindowAttributes API實現的,這裡所說的異型視窗不是指橢圓型的視窗或三角型之類的視窗:
這一類的視窗在早期的Windows裡就已經規定了的,只需要在建立視窗時修改stsy風格就可以了,這裡所說的異型視窗是不規則口,比如一些遊戲介面:
類似這種在Windows並沒有顯示指定的風格介面
WS_EX_LAYERED風格是使窗體支援層次關係並支援透明,而SetLayeredWindowAttributes是設定視窗指定畫素點透明!
大致思路就是,在視窗上放置UI圖片並讓其支援WS_EX_LAYERED
這裡我已經建立好一個視窗:
此視窗背景為黑色,影象為紅色,為什麼使用黑色?
答: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引數失效,則讓視窗全部區域透明化,而不以層次關係區分!