• 透明窗口(窗口上面文字图片等内容不透明)的实现(使用SetLayeredWindowAttributes API函数)


    透明窗口(窗口上面文字图片等内容不透明)的实现

           本文讨论通过SetLayeredWindowAttributes来实现本文的目的。

            SetLayeredWindowAttributes的实现必须将窗口设置为WS_EX_LAYERED的扩展风格。   然而,只有WS_POPUP窗口才能设置WS_EX_LAYERED的扩展风格。这就意味着只能够在POPUP的窗口中实现透明窗口,而在WS_CHILD风格的窗口中是不能够实现的。

    当初我就是试了半天发现不行的。

              SetLayeredWindowAttributes的原型如下:

             

    [cpp] view plaincopy
     
     
    1. BOOL SetLayeredWindowAttributes(          HWND hwnd,  
    2.     COLORREF crKey,  
    3.     BYTE bAlpha,  
    4.     DWORD dwFlags  
    5. );  

              第一个参数就是要设置的窗口的句柄,第二个就是要设置的一个透明色,第三个是要设置的透明度,bAlpha的范围是 0-255,如果是0,那么完全透明,如果是255,是完全不透明。 第四个参数,就是设置是按照透明色来透明,还是按照bAlpha来透明。或者两个都设置。     如果 dwFlags 设置了LWA_COLORKEY,那么crKey就起作用,窗口中所有的crKey颜色区域就会全部透明,如果dwFlags设置了LWA_ALPHA,那么bAlpha就会起作用,整个窗口就会按照bAlpha的值来透明。也可以这两个一起设置来同时实现这两个效果。

              比如下面的代码:

              SetLayeredWindowAttributes(m_hWnd,RGB(255,0,255),

    (BYTE)220,LWA_ALPHA|LWA_COLORKEY);

              将会把窗口的所有的洋红色区域全透,然后剩下的区域半透明。

               切记,不能够分别设置,比如像下面这么设置是达不到要求的:

               SetLayeredWindowAttributes(m_hWnd,

    RGB(255,0,255),0,LWA_COLORKEY);

               SetLayeredWindowAttributes(m_hWnd,0,(BYTE)220,LWA_ALPHA);

               下面我们来实现一个半透明的tip窗口:

      1.        由于我们的窗口是要实现一个tip,这个窗口是个非规则窗口,所有需要贴图来实现边框等,所有需要洋红色全透,其他部分半透的效果。在OnCreat或者OnInitDialog中使用下面的代码就可以实现了:

             

              

              

              SetLayeredWindowAttributes(m_hWnd,RGB(255,0,255),

    (BYTE)220,LWA_ALPHA|LWA_COLORKEY);

    2.         然后,我们需要窗口整体半透,但是上面的文字内容等不能透明,这个问题不能解决,所有只能够在这个窗口上面再套上一个POPUP的upWindow窗口,背景刷上一种纯颜色,比如

     RGB(0,255,0),然后OnCreat或者OnInitDialog用SetLayeredWindowAttributes设置窗口全透明,显示的内容都绘制在这个upWindow,这样就看起来实现了窗口半透明,但是上面的文字不透明的效果。

              代码如下:

              SetLayeredWindowAttributes(m_hWnd,RGB(0,255,0),0,LWA_COLORKEY);

              

              在upWindow的OnPaint中写上如下代码:

              CRect rc;

              GetClientRect(&rc);

              dc.FillSolidRect(rc,RGB(0,255,0);

    这样就实现了我们需要的效果了。

      下图就是我实现的效果:

       

    原文链接:http://blog.csdn.net/tangaowen/article/details/6054123

    http://blog.csdn.net/huasonl88/article/details/8697768

    ---------------------------------------------------------------------------------

    ::SetWindowLong(this->Handle , GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED);
    ::SetLayeredWindowAttributes(this->Handle, 0, 100, LWA_ALPHA);

    mcool就是这效果,已开源
    http://mcool.appinn.me/

    http://bbs.2ccc.com/topic.asp?topicid=307386

  • 相关阅读:
    买房的贷款时间是否是越长越好?https://www.zhihu.com/question/20842791
    asp.net cookie and session
    leelazero and google colab
    download file by python in google colab
    physical processor, core, logical processor
    通过powershell操作eventlog
    openxml in sql server
    get the page name from url
    How to Execute Page_Load() in Page's Base Class?
    Difference between HttpContext.Request and Request
  • 原文地址:https://www.cnblogs.com/findumars/p/5625176.html
Copyright © 2020-2023  润新知