WinAPI透明窗体SetLayeredWindowAttributes(转载)

来自:https://blog.csdn.net/weixin_33862041/article/details/91974508

 

SetLayeredWindowAttributes 
BOOL SetLayeredWindowAttributes(           
     HWND hwnd, 
     COLORREF crKey, 
     BYTE bAlpha, 
     DWORD dwFlags 
); 

hwnd是透明窗体的句柄, 
crKey为颜色值, 
bAlpha是透明度,取值范围是[0,255], 
dwFlags是透明方式,可以取两个值: 
          当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效; 
          当取值为LWA_COLORKEY时,bAlpha参数有效而窗体中的所有颜色为crKey的地方将变为透明。 
          LWA_ALPHA = 0x2 
          LWA_COLORKEY=0x1 

要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性 
(旧的sdk没有定义这个属性,所以可以直接指定为0x80000). 
WS_EX_LAYERED = 0x80000    

----------------------------------------------------------------------------------------- 
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, 
     GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE) | 0x80000); 
HINSTANCE hInst=LoadLibrary("User32.DLL"); 
if(hInst) 

     typedef BOOL     (WINAPI * MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
     MYFUNC fun=NULL; 

     //取得SetLayeredWindowAttributes函数指针 
     fun=(MYFUNC)GetProcAddress(hInst,"SetLayeredWindowAttributes"); 
     if(fun) 
      fun(this->GetSafeHwnd(),0,128,2); 
     FreeLibrary(hInst); 



可以看到这是动态的从User32.dl中取得函数地址然后调用的.而我在VS2005环境下可以直接使用SetLayeredWindowAttributes,代码如下: 
     SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^WS_EX_LAYERED); 
     SetLayeredWindowAttributes(this->m_hWnd,0,100,2); 
而如果在VC6下面使用这样的代码将来报错误:找不到标识符SetLayeredWindowAttributes.为什么呢? 
原来SetLayeredWindowAttributes函数只有在Win2000以上的系统才支持,而VC是98年的产物(快10年了),它自带的SDK自然也是98年的,所以才没有这个函数的头文件和对应的Lib.知道原因后就好办了,首先下载SDK,开始想下个最新的.是06年的Win2003的,但从说明中看到不支持VC,没办法,接着找,终于被我找到XPSP2的一个SDK,下载地址是:http://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm,下载后解压CAB,安装,通过开始菜单中的设置环境变量,手动的在VC6的选项中增加对SDK目录的Include和Lib的条目,再次编译终于通过.但美中不足的是,新增加的函数没有语法提示:( 
最后说一下,上面的两种写法,第一种还是比较稳妥的,因为在98下就会找不到这个函数的地址,但是估计第二种也不会有什么问题,必竟现在是XP的天下,95,98,ME只是我夸口自己玩电脑N年的谈资了.呵呵. 

posted @ 2020-10-09 16:49  宇宙之外  阅读(1290)  评论(0编辑  收藏  举报