關於WS_EX_LAYERED的思考


 

 要實現這種,拖動窗口時,一個顯示原窗口內容的窗口跟隨鼠標移動。下面的內容與實現有關,記錄一下

 

 

轉載:https://blog.csdn.net/tyhjtw/article/details/38107577

帶有WS_EX_LAYERED風格的窗口也就是我們說的分層窗口,主要是為了了實現異形窗口和窗口整體透明。

若果要實現異形窗口則必須要設置這個風格,然后使用UpdateLayeredWindow函數來繪制,這樣才能將控件的透明色和窗口后面的圖像進行融合,從而繪制出帶有透明效果的窗口

而要實現窗口的整體透明,則需要首先設置WS_EX_LAYERED風格,然后調用SetLayeredWindowAttribute函數設置透明度

 

以上所說的要想搞和透明相關的東西則必須設置這個分層風格,注意:

1、一旦調用UpdateLayeredWindow函數,WM_PAINT消息將失效,如果界面需要更新,則需要自己調用UpdateLayeredWindow函數

2、子窗口無法應用WS_EX_LAYERED風格,如果應用這個風格,將無法實現透明效果。也就是說這個窗口必須是非WS_CHILD;

 

那么要求子窗口是異形的或者整體透明的,那么只能去掉WS_CHILD風格,然后MOVE到一定位置,在父窗口移動的時候跟隨移動。

首先在創建窗口的時候不能指定CHILD屬性,但必須指定父窗口句柄到createwindowEx函數,否則會出現創建的窗口屬於桌面,那樣的話你點擊主程序窗口,這個子窗口會躲到后面去,也相對於桌面上兩個互不相干的窗口一樣,那樣就失去意義了,所以代碼如下:

if(!m_pLSideBtn->Create(m_hWnd/*主程序窗口句柄*/, NULL,  WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_TOOLWINDOW | WS_EX_LAYERED))
{
delete m_pLSideBtn;
m_pLSideBtn = NULL;
return false;
}

然后再主窗口的MOVE里面:

::SetWindowPos(m_hWnd, 
HWND_TOP, 
pt.x, 
pt.y, 
0, 
0,
SWP_SHOWWINDOW | SWP_NOSIZE);

注意這邊是相對於桌面的移動,創建的窗口用SPY看,父窗口就是主程序窗口,擁有者也是主程序窗口,樣式的話沒有CHILD,這樣就讓子窗口支持透明和異形,試運行后效果不錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM