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

posted @ 2021-12-27 20:37  _KikyoBK  Views(1073)  Comments(0Edit  收藏  举报