zoukankan      html  css  js  c++  java
  • 透明窗口(窗口上面文字图片等内容不透明)的实现(使用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

  • 相关阅读:
    vim how to set nu with 0-index instead of 1-index
    @property的介绍与使用
    X[:,0]和X[:,1]
    the best guide for git
    sorted(列表)
    Java的匿名函数
    成员变量和局部变量的区别
    Java数组合并
    Java中random的使用
    Git常见错误---git branch不显示本地分支的问题
  • 原文地址:https://www.cnblogs.com/findumars/p/5625176.html
Copyright © 2011-2022 走看看