要實現這種,拖動窗口時,一個顯示原窗口內容的窗口跟隨鼠標移動。下面的內容與實現有關,記錄一下
轉載: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,這樣就讓子窗口支持透明和異形,試運行后效果不錯。