透明窗体的实现 - 博客大巴

来源:百度文库 编辑:神马文学网 时间:2024/04/25 23:48:17

透明窗体的实现 - [日记]

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://zuowenp.blogbus.com/logs/80799819.html

要在windows下实现透明窗体,有两个函数可以使用,一个是SetLayeredWindowAttributes ,另一个是UpdateLayeredWindow

首先,使用这两个函数,窗口必须是WS_EX_LAYERED 属性,可以用SetWindowLong来声明。

SetLayeredWindowAttributes (分层窗口),MSDN的介绍如下

The SetLayeredWindowAttributes function sets the opacity and transparency color key of a layered window.

Syntax

              BOOL SetLayeredWindowAttributes(  

              HWND hwnd ,

              COLORREF crKey ,

              BYTE bAlpha ,

              DWORD dwFlags );

 

 

其中hwnd是窗口的句柄,crKey是掩码,即要透明的颜色,用RGB(r,g,b)来表示,bAlpha是透明度,取值在0-255之间,0为完全透明,255为完全不透明。dwFlags是标志位,用它的值表示透明的方式

LWA_COLORKEY            0x00000001     //表示用掩码颜色来透明
LWA_ALPHA               0x00000002        //表示用透明度来透明

比如要让一个窗口的黑色部分透明,就可以用

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

由于标志位是LWA_COLORKEY,因此bAlph a是不起作用的。如果是LWA_ALPHA的话,那么整个窗口都会根据bAlpha的大小来显示透明度。

颜色透明的地方鼠标可以穿透,可以在很方便的做出异形窗体。

The UpdateLayeredWindow function updates the position, size, shape, content, and translucency of a layered window.

Syntax

BOOL UpdateLayeredWindow(   
    HWND hwnd,
    HDC hdcDst,
    POINT *pptDst,
    SIZE *psize,
    HDC hdcSrc,
    POINT *pptSrc,
    COLORREF crKey,
    BLENDFUNCTION *pblend,
    DWORD dwFlags
);

hwnd为窗口句柄。

hdcDst为目的DC句柄,可以用GetWindowDC(hwnd)来取得。

pptDst用来指定新的分层窗口的起始位置,如果要保存位置不变,则可以为NULL。

psize用来指定分层窗口新的大小。如果不改变窗口大小,则可以为NULL。

hdcSrcd为如果来源DC句柄,如果不进行绘制,则可以为NULL。

pptSrc用来指定来源的屏幕位置。

crKey是掩码,可以用RGB(r,g,b)来生成。

pblend指向一个BLENDFUNCTION结构,如下定义

  typedef struct _BLENDFUNCTION
  {
      BYTE   BlendOp;     // 指定源混合操作。目前,唯一的源和目标混合,已定义的AC_SRC_OVER。
      BYTE   BlendFlags;  //必须是0。
      BYTE   SourceConstantAlpha; //透明度,取值0-255之间。
      BYTE   AlphaFormat; //可以定义为AC_SRC_ALPHA,表示位图有Alpha通道
  }BLENDFUNCTION,*PBLENDFUNCTION;

dwFlags为标志位,可以取以下值

ULW_ALPHA 使用pblend为混合功能。

ULW_COLORKEY 使用crKey值为颜色的透明度。  

ULW_OPAQUE 绘制一个不透明分层窗口。

要注意的是,一旦使用了UpdateLayeredWindow函数,那么它将接管窗口的绘制,不会响应WM_PAINT等消息,而窗口上面的控件也不会显示。如果你设定了pptDst和psize的话,就等于调用了setwindowpos函数改变了窗口的大小,这点要注意。