Windows窗口的半透明效果,设置窗口背景透明
分类:pc28.am神测网

 

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

介绍:

我们来探视上面这段代码:

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通道过滤颜色
*/
  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_COLOSportageKEY有效时参数钦点的    LWA_ALPHA 有效时对窗口全部接收半**

水彩被视为透明                 **晶莹剔透效果,alpha值由参数钦命。** 

图片 1                 图片 2**

左侧是LWA_COLO奥迪Q7KEY,能够见到在窗口    左侧是 LWA_ALPHA能够见见完好展现半透明,况兼

上画的SportageGB=(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,COLOENCOREREF,BYTE,DWOKoleosD); 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属性。

 

 

把地方的这段代码放在需求转移对话框背景折射率之处,举例响应OK开关函数OnOK里面也许OnInitDialog函数里。

下一场点击试试什么效益:

图片 3

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

  bAlpha是不折射率,取值范围是(0,255卡塔 尔(英语:State of Qatar),其中0代表全透明,255意味不透明。

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

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

  当取值为LWA_COLO凯雷德KEY时,窗体中的全数颜色为crKey之处将改为透明,bAlpha参数无效。

  LWA_ALPHA = 0x2

  LWA_COLORKEY=0x1

  也能够取多少个值的结合:LWA_ALPHA Or LWA_COLOMercedes-A名爵KEY。那样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:

本文由pc28.am发布于pc28.am神测网,转载请注明出处:Windows窗口的半透明效果,设置窗口背景透明

上一篇:cgroup原理简析 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • cocoapods的技术活,1系统出现C0000034正在应用更新
    cocoapods的技术活,1系统出现C0000034正在应用更新
       说来也意外,小编Dell笔记本后天系统提示有校订,作者对系统实行了立异,可明天开机后,就现身了C0000034正在利用立异操作的情形,且计算机一贯没
  • Shell系列教程之
    Shell系列教程之
      Shell协助自定义变量。 Linux Shell体系教程之(三卡塔 尔(英语:State of Qatar)Shell变量,linuxshell 本文是Linux Shell系列教程的第(三)篇,更多shell教程请看
  • 磁盘文件排序,提醒货仓损坏的解决办法
    磁盘文件排序,提醒货仓损坏的解决办法
    ......BITMAPINFOHEADER bi;bi.biSize = sizeof(BITMAPINFOHEADER);bi.biWidth = bmpScreen.bmWidth;bi.biHeight = bmpScreen.bmHeight;bi.biPlanes = 1;bi.biBitCount = bmpScreen.bmBitsPixel; bi.biCompression =
  • rm命令总计,要做手術
    rm命令总计,要做手術
     功能说明:删除文件、目录 测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删
  • mv命令总结,Linux基础知识之文件管理命令
    mv命令总结,Linux基础知识之文件管理命令
    cp命令使用: Linux基础知识之文件管理命令(cp、mv、rm) 我们日常工作中对于文件的操作用到最多的几个我觉得应该是是复制、剪切、移动、重命名、删除这