如何创建透明且可穿透鼠标的窗口






4.42/5 (16投票s)
一个WTL类,可以在Windows 2000和XP中使任何窗口透明,并允许鼠标点击穿透窗口。
引言
在2005年12月的MSDN杂志专栏中,Paul DiLascia解释了如何创建一个所谓的“分层”窗口,该窗口是透明的,并且可以传递鼠标事件。这 оказалась довольно простой задачей,所以我编写了一个名为CLayered
的WTL类。
不过需要说明一点 - 此处呈现的代码仅在Windows 2000及更高版本上有效。
要创建一个可见穿透(分层)窗口,我们需要设置扩展样式WS_EX_LAYERED
,并且要使窗口可点击穿透,我们需要WS_EX_TRANSPARENT
扩展样式。这可以使用SetWindowLong()
API函数或CWindow
类的ModifyStyleEx()
函数来完成。然后,我们可以使用SetLayeredWindowAttributes()
API函数来设置分层窗口的不透明度和透明度。要反转透明度,请删除WS_EX_LAYERED
和WS_EX_TRANSPARENT
样式。
但是让我警告你,设置WS_EX_TRANSPARENT
属性会影响整个窗口:用户无法使用“x”按钮关闭窗口,用鼠标选择它,或选择窗口上的任何控件。应用程序仍然可以以编程方式关闭窗口。微软建议将WS_EX_TRANSPARENT
样式用于具有短生命周期的模式窗口。
使用代码
- 从
CLayered
派生你的类,如下所示class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>, public CMessageFilter, public CIdleHandler, CLayered<CMainDlg>
- 然后在你的代码中的某个位置,修改你的窗口样式
// To make a visible-through window BOOL SetLayered()
或
// To make a clicked-through window BOOL SetClickThru()
- 并设置窗口的透明度。如果需要,请调用
BOOL MakeTransparent(int nOpacity)
其中
nOpacity
描述了分层窗口的不透明度。0表示窗口完全透明,255表示窗口不透明。
软件要求
- 所需的最低操作系统 - Windows 2000。
- 演示项目是用Visual Studio 2005创建的,但它不包含任何VS2005特定的功能,因此在不同版本的Visual Studio上重新创建它不会有问题 - 只是创建一个空的WTL项目并添加所有源文件。
- 演示项目在Windows XP Pro SP2上进行了测试。
历史
- 2005年11月20日 - 初始发布。