Windows核心编程_异型窗口

异型窗口是Windows200在窗口中引入的WS_EX_LAYERED风格,并搭配:SetLayeredWindowAttributes API实现的,这里所说的异型窗口不是指椭圆型的窗口或三角型之类的窗口:

这一类的窗口在早期的Windows里就已经规定了的,只需要在创建窗口时修改stsy风格就可以了,这里所说的异型窗口是不规则口,比如一些游戏界面:

类似这种在Windows并没有显示指定的风格界面

WS_EX_LAYERED风格是使窗体支持层次关系并支持透明,而SetLayeredWindowAttributes是设置窗口指定像素点透明!

大致思路就是,在窗口上放置UI图片并让其支持WS_EX_LAYERED风格,然后设置窗口背景色为黑色,在使用SetLayeredWindowAttributes设置窗口黑色像素点为透明色,即可达到这种效果!

这里我已经创建好一个窗口:

此窗口背景为黑色,图像为红色,为什么使用黑色?

答:SetLayeredWindowAttributes使像素透明时一旦不在像素范围内的就不会使其透明化,那怕像素值差1都不行,所以图像轮廓区域会留下一些痕迹锯齿,剔除不明显,所以黑色较暗,不明显!

代码:

//获取窗口句柄
	HWND hwnd = FindWindow(NULL, "1");
	//设置风格
	LONG t = GetWindowLong(hwnd, GWL_EXSTYLE);
	t |= WS_EX_LAYERED;
	SetWindowLong(hwnd, GWL_EXSTYLE, t);
	//设置透明
	SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);
 

运行效果:

 

这里边框我保留了下来方便移动,如果觉得碍眼可以增加:WS_POPUP风格去除:

 

被透明化的颜色会被鼠标穿透,但是没有被透明化的还是支持鼠标消息的!

 

最后对SetLayeredWindowAttributes函数介绍:

BOOL SetLayeredWindowAttributes(
HWND hwnd, // 指定分层窗口句柄
COLORREF crKey, // 指定需要透明的背景颜色值,可用RGB()宏
BYTE bAlpha, // 设置透明度,0表示完全透明,255表示不透明
DWORD dwFlags // 透明方式
);
其中,dwFlags参数可取以下值:
LWA_ALPHA时:crKey参数无效,bAlpha参数有效;
LWA_COLORKEY:窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。其常量值为1。
LWA_ALPHA | LWA_COLORKEY:crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。
如果想让窗口层次全部透明只需要使用:
LWA_ALPHA
风格即可,让crkey参数失效,则让窗口全部区域透明化,而不以层次关系区分!
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

17岁boy想当攻城狮

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值