带有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,这样就让子窗口支持透明和异形,试运行后效果不错。