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参数失效,则让窗口全部区域透明化,而不以层次关系区分!




猜你喜欢

转载自blog.csdn.net/bjbz_cxy/article/details/80774694