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

 

 

新建二个MFC
Wizard项目,基于对话框。

介绍:

介绍:

介绍:

作者们来探视上面那段代码:

Layered Windows是windows窗口中的一类,提供类似半透明的功能(阿尔法混合)。半晶莹剔透效果是字面上有能看出来的,但实在依据MSND,该品种的窗口仍是能够更好的支撑非矩形的窗口,使之展现效果更平整流畅(暗地里估计是利用了硬件加快而达成的效率)。在win8之前WS_EX_LAYERED只好用来顶层窗口,win8及之后版本子窗口也得以采纳。

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通道过滤颜色
*/

使用:

第2要做的就是在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风格。之后调用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. 【澳门金沙国际】安装窗口背景透明,Windows窗口的半透明效果。}  

那正是说二种Flag有如何界别吧,可能说它们各自是何等效益呢?不多说上海教室就知道了。

LWA_COLO陆风X8KEY有效时参数钦命的    LWA_ALPHA
有效时对窗口全部采纳半**

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

澳门金沙国际 1 
             
 
澳门金沙国际 2**

左侧是LWA_COLORKEY,能够看看在窗口   
右边是 LWA_ALPHA能够看到完好显示半晶莹剔透,而且

上画的锐界GB=(255,0,255)的圈子被视   
在窗口上绘制的圆形也是半透明的。(也留意到对圆型

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

 

两种效应可以同时采纳效益,其成效正是八个半透明的石绿月亮。

可以动用UpdataLayeredWindow()函数更新Layered
Window。比如重新设置其光滑度,地点,大小,形状等。该函数会更新任何窗口。不要求操心被屏蔽的窗口的立异难题,系统会处理好的。(对1个Layered窗口系统总是保存其下部的图像,并自动更新,那意味占据更多内部存款和储蓄器,所以不须求时经过SetWindowLong()删除WS_LAYERED风格。那在上边还会说)

对透明的一些(比如上边左图月牙缺掉的部分大概对右图设置阿尔法值为0)点击鼠标时,鼠标新闻会经过窗口,也正是Layered窗口在此处不接受鼠标音信。那很合乎所看即所得的陈设理念,用户感到看不到的地点便是没有,他们不必精晓什么阿尔法混合。

那就是说二种Flag有什么样分别呢,恐怕说它们分别是什么意义啊?不多说上海教室就领会了。

LWA_COLO汉兰达KEY有效时参数内定的    LWA_ALPHA
有效时对窗口全体采取半**

水彩被视为透明  
              **
晶莹剔透效果,阿尔法值由参数内定。** 

澳门金沙国际 3     
         
 
澳门金沙国际 4**

左侧是LWA_COLOENCOREKEY,能够看到在窗口   
右边是 LWA_ALPHA能够见见完整表现半透明,而且

上画的汉兰达GB=(255,0,255)的圈子被视   
在窗口上绘制的圆形也是半晶莹剔透的。(也留意到对圆型

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

 

二种意义能够而且使用功效,其效率便是3个半晶莹剔透的橄榄棕月亮。

能够利用UpdataLayeredWindow()函数更新Layered
Window。比如重新设置其光滑度,地点,大小,形状等。该函数会更新任何窗口。不需求操心被遮挡的窗口的翻新难题,系统会处理好的。(对叁个Layered窗口系统总是保存其下部的图像,并自动更新,那代表占据越多内部存款和储蓄器,所以不须要时经过SetWindowLong()删除WS_LAYERED风格。那在上面还会说)

对透明的局部(比如上面左图月牙缺掉的片段或许对右图设置阿尔法值为0)点击鼠标时,鼠标音信会经过窗口,也正是Layered窗口在此地不接受鼠标新闻。那很合乎所看即所得的宏图意见,用户感到看不到的地方就是从未,他们不要通晓什么阿尔法混合。

那正是说二种Flag有怎么样分别呢,可能说它们各自是什么样意义啊?不多说上图就通晓了。

LWA_COLO途达KEY有效时参数钦赐的    LWA_ALPHA
有效时对窗口全部采纳半**

水彩被视为透明  
              **
透明效果,阿尔法值由参数钦点。** 

澳门金沙国际 5               
 
澳门金沙国际 6**

左侧是LWA_COLO奥迪Q5KEY,能够看看在窗口   
右侧是 LWA_ALPHA能够见到完好呈现半透明,而且

上画的奥迪Q5GB=(255,0,255)的圆形被视   
在窗口上制图的圆形也是半晶莹剔透的。(也注意到对圆型

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

 

三种作用能够同时采用效果,其效果正是一个半晶莹剔透的砖红月亮。

能够运用UpdataLayeredWindow()函数更新Layered
Window。比如重新设置其折射率,地点,大小,形状等。该函数会更新任何窗口。不须求操心被屏蔽的窗口的更新难题,系统会处理好的。(对1个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,COLOPAJEROREF,BYTE,DWO帕杰罗D); 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窗口中的一类,提供类似半透明的效用(阿尔法混合)。半晶莹剔透效果是…

怎么设置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(),重新安装窗口作风即可。不过对3个一度体今后荧屏上的窗口修改其风格为 WS_EX_LAYERED时会发现该窗口不见了,此时调用UpdataLayeredWindow()或SetLayeredWindowAttributes()后会出现你想要的金科玉律。

另外:一旦 SetLayeredWindowAttributes 被调用了,
之后对 UpdateLayeredWindow 的调用都会破产直到再也改变了窗口的Layered属性。

 

 

把上面的那段代码放在须要改变对话框背景折射率的地方,例如响应OK按钮函数OnOK里面大概OnInitDialog函数里。

下一场点击试试什么作用:

澳门金沙国际 7

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为掩码的水彩,能够用奥迪Q5GB(r,g,b)来钦定。

  bAlpha是不反射率,取值范围是(0,255),在那之中0代表全透明,255代表不透明。

  dwFlags是晶莹格局,能够取七个值:

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

  当取值为LWA_COLO奥迪Q3KEY时,窗体中的全部颜色为crKey的地点将成为透明,bAlpha参数无效。

  LWA_ALPHA = 0x2

  LWA_COLORKEY=0x1

  也得以取七个值的重组:LWA_ALPHA Or
LWA_COLOCR-VKEY。这样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,所以能够平素内定为&H捌仟0).

  WS_EX_LAYERED = &H80000

 

 

 

from:

相关文章