Windows窗口的半透明效果,窗口上边文字图片等内

 

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

介绍:

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

Layered Windows是windows窗口中的一类,提供类似半透明的效果(阿尔法混合)。半透明效果是字面上有能看出来的,但实际上根据MSND,该类型的窗口还能更好的支持非矩形的窗口,使之显示效果更平滑流畅(暗地里猜测是使用了硬件加速而达到的效果)。在win8之前WS_EX_LAYERED只能用于顶层窗口,win8及之后版本子窗口也可以使用。

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

使用:

首先要做的就是在CreateWindowEx()时加入 WS_EX_LAYERED风格。之后调用SetLayeredWindowAttributes()。该函数原型如下:

  

BOOL WINAPI SetLayeredWindowAttributes(
  _In_ HWND     hwnd,      //窗口句柄
  _In_ COLORREF crKey,      //设置色彩通道的相对分量 使用RGB宏
  _In_ BYTE     bAlpha,     //阿尔法值,0-225之间
  _In_ DWORD    dwFlags     //LWA_ALPHA或LWA_COLORKEY,或二者都有
);
/*
*LWA_ALPHA :使用阿尔法值显示透明效果
LWA_COLORKEY:使用RGB通道过滤颜色
*/

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

那么两种Flag有什么区别呢,或者说它们分别是什么效果呢?不多说上图就明白了。

LWA_COLORKEY有效时参数指定的    LWA_ALPHA 有效时对窗口整体使用半**

颜色被视为透明                 **透明效果,阿尔法值由参数指定。** 

图片 1                 图片 2**

左侧是LWA_COLORKEY,可以看到在窗口    右侧是 LWA_ALPHA可以看到整体呈现半透明,而且

上画的RGB=(255,0,255)的圆形被视    在窗口上绘制的圆形也是半透明的。(也注意到对圆型

为透明                     窗口其坐标还是按矩形的左上角算的) 

 

两种效果可以同时使用效果,其效果就是一个半透明的黑色月亮。

可以使用UpdataLayeredWindow()函数更新Layered Window。比如重新设置其透明度,位置,大小,形状等。该函数会更新整个窗口。不需要担心被遮挡的窗口的更新问题,系统会处理好的。(对一个Layered窗口系统总是保存其下面的图像,并自动更新,这意味着占用更多内存,所以不需要时通过SetWindowLong()删除WS_LAYERED风格。这在下面还会说)

对透明的部分(比如上面左图月牙缺掉的部分或者对右图设置阿尔法值为0)点击鼠标时,鼠标消息会透过窗口,也就是Layered窗口在此处不接受鼠标消息。这很符合所看即所得的设计理念,用户感觉看不到的地方就是没有,他们不必理解什么阿尔法混合。

 

如何设置Layered窗口为普通的窗口

如果不再需要透明效果,尽早去掉Layered属性可以提高性能,标准的做法如下:

// Remove WS_EX_LAYERED from this window styles
SetWindowLong(hwnd, 
              GWL_EXSTYLE,
              GetWindowLong(hwnd, GWL_EXSTYLE) & ~WS_EX_LAYERED);

// Ask the window and its children to repaint
RedrawWindow(hwnd, 
             NULL, 
             NULL, 
             RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);

最后说一点,如果窗口已经创建好了也有其他的办法,调用SetWindowLong(),重新设置窗口风格即可。但是对一个已经显示在屏幕上的窗口修改其风格为 WS_EX_LAYERED时会发现该窗口不见了,此时调用UpdataLayeredWindow()或SetLayeredWindowAttributes()后会出现你想要的样子。

另外:一旦 SetLayeredWindowAttributes 被调用了, 之后对 UpdateLayeredWindow 的调用都会失败直到重新改变了窗口的Layered属性。

 

          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);

 

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

 

  下图就是我实现的效果:

   图片 3

原文链接:


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

mcool就是这效果,已开源

本文由星彩网app下载发布于星彩网app下载,转载请注明出处:Windows窗口的半透明效果,窗口上边文字图片等内

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。