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

  • 相关阅读:
    spring boot.定时任务问题记录(TaskScheduler/ScheduledExecutorService异常)
    网站配置https(腾讯云域名操作)
    Java web如何定位工程路径
    centos7安装nginx
    个人博客搭建----基于solo
    velocity学习总结
    第四篇:用IntelliJ IDEA 搭建基于jersey的RESTful api
    Python 包批量升级
    Linux 常用命令更新汇总
    ubuntu 18.04 +firefox + selenium + python
  • 原文地址:https://www.cnblogs.com/Toya/p/15737774.html
Copyright © 2011-2022 走看看