65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.42/5 (16投票s)

2005年11月25日

CPOL

2分钟阅读

viewsIcon

144907

downloadIcon

3344

一个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_LAYEREDWS_EX_TRANSPARENT样式。

但是让我警告你,设置WS_EX_TRANSPARENT属性会影响整个窗口:用户无法使用“x”按钮关闭窗口,用鼠标选择它,或选择窗口上的任何控件。应用程序仍然可以以编程方式关闭窗口。微软建议将WS_EX_TRANSPARENT样式用于具有短生命周期的模式窗口。

使用代码

  1. CLayered派生你的类,如下所示
    class CMainDlg : public CDialogImpl<CMainDlg>, 
                    public CUpdateUI<CMainDlg>,
                    public CMessageFilter, 
                    public CIdleHandler,
                    CLayered<CMainDlg>
  2. 然后在你的代码中的某个位置,修改你的窗口样式
    // To make a visible-through window
    BOOL SetLayered()

    // To make a clicked-through window
    BOOL SetClickThru()
  3. 并设置窗口的透明度。如果需要,请调用
    BOOL MakeTransparent(int nOpacity)

    其中nOpacity描述了分层窗口的不透明度。0表示窗口完全透明,255表示窗口不透明。

软件要求

  • 所需的最低操作系统 - Windows 2000。
  • 演示项目是用Visual Studio 2005创建的,但它不包含任何VS2005特定的功能,因此在不同版本的Visual Studio上重新创建它不会有问题 - 只是创建一个空的WTL项目并添加所有源文件。
  • 演示项目在Windows XP Pro SP2上进行了测试。

历史

  • 2005年11月20日 - 初始发布。
© . All rights reserved.