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

  • 相关阅读:
    StringTable
    TCP网络协议
    也说JVM内存区域
    JVM类加载
    java中的引用:强、软、弱、虚
    AQS
    vscode支持unicode编码
    设计模式简记-快速改善代码质量的编程规范
    擅事利器
    设计模式简记-通过重构增强代码可测试性实战
  • 原文地址:https://www.cnblogs.com/Toya/p/15737774.html
Copyright © 2020-2023  润新知