当前位置: 澳门新濠3559 > 操作系统 > 正文

之后调用,之后调用

时间:2019-10-07 00:32来源:操作系统
  Layered Windows窗口的半透明效果,layered窗口   之后调用,之后调用。新建一个MFCWizard项目,基于对话框。 介绍: 介绍: 我们来看看下面这段代码: Layered Windows是windows窗口中的一类,

 

Layered Windows窗口的半透明效果,layered窗口

 

之后调用,之后调用。新建一个MFC Wizard项目,基于对话框。

介绍:

介绍:

我们来看看下面这段代码:

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

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

[cpp] view plaincopyprint?

使用:

首先要做的就是在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通道过滤颜色
*/

使用:

首先要做的就是在CreateWindowEx()时加入 WS_EX_LAYERED风格。之后调用澳门新濠3559,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通道过滤颜色
*/
  1. SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)^0x80000);  
  2. //加载dll   
  3. HINSTANCE hInst=LoadLibrary("User32.dll");  
  4. if(hInst)  
  5. {  
  6.     typedef BOOL (WINAPI *Fun)(HWND,COLORREF,BYTE,DWORD);  
  7.     Fun fun=NULL;  
  8.     //找到dll中的SetLayeredWindowAttributes函数首地址   
  9.     fun=(Fun)GetProcAddress(hInst,"SetLayeredWindowAttributes");  
  10.     if(fun)  
  11.     {  
  12.          //调用SetLayeredWindowAttributes函数   
  13.          fun(this->GetSafeHwnd(),0,200,2);  
  14.     }  
  15.     //释放dll   
  16.     FreeLibrary(hInst);  
  17. }  

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

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

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

澳门新濠3559 1                 澳门新濠3559 2**

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

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

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

 

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

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

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

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

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

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

澳门新濠3559 3                 澳门新濠3559 4**

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

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

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

 

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

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

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

SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)^0x80000); //加载dll HINSTANCE hInst=LoadLibrary("User32.dll"); if(hInst) { typedef BOOL (WINAPI *Fun)(HWND,COLORREF,BYTE,DWORD); Fun fun=NULL; //找到dll中的SetLayeredWindowAttributes函数首地址 fun=(Fun)GetProcAddress(hInst,"SetLayeredWindowAttributes"); if(fun) { //调用SetLayeredWindowAttributes函数 fun(this->GetSafeHwnd(),0,200,2); } //释放dll FreeLibrary(hInst); }

如何设置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属性。

 

如何设置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属性。

 

Windows窗口的半透明效果,layered窗口 介绍: Layered Windows是windows窗口中的一类,提供类似半透明的效果(阿尔法混合)。半透明效果是...

 

把上面的这段代码放在需要更改对话框背景透明度的地方,例如响应OK按钮函数OnOK里面或者OnInitDialog函数里。

然后点击试试什么效果:

澳门新濠3559 5

SetLayeredWindowAttributes函数用来设置窗口透明度,看看解析:

http://baike.baidu.com/view/1329156.htm?fr=ala0_1

 

Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

  hWnd是透明窗体的句柄,

  crKey为掩码的颜色,可以用RGB(r,g,b)来指定。

  bAlpha是不透明度,取值范围是(0,255),其中0代表全透明,255代表不透明。

  dwFlags是透明方式,可以取两个值:

  当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;

  当取值为LWA_COLORKEY时,窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。

  LWA_ALPHA = 0x2

  LWA_COLORKEY=0x1

  也可以取两个值的组合:LWA_ALPHA Or LWA_COLORKEY。这样crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。

  要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性,方法:

  先声明GetWindowLong和SetWindowLong

      Dim rtn As Long

  rtn = GetWindowLong(Me.hWnd, -20)

  rtn = rtn Or WS_EX_LAYERED

  SetWindowLong (Me.hWnd, -20, rtn)

  (旧的sdk没有定义WS_EX_LAYERED,所以可以直接指定为&H80000).

  WS_EX_LAYERED = &H80000

 

 

 

from:

编辑:操作系统 本文来源:之后调用,之后调用

关键词: 澳门新濠3559