【问题标题】:Create a transparent hole inside a window's background - WPF在窗口的背景中创建一个透明的洞 - WPF
【发布时间】:2010-10-20 09:42:49
【问题描述】:

我有一个包含这些值的窗口:

WindowState="Maximized"
AllowsTransparency="True"
Opacity="0.5"
WindowStyle="None"

此窗口位于其他窗口之上(作为弹出窗口),其内容位于特定位置。

我有一个新要求。这个窗口必须从下面的窗口中显示一个矩形区域。换句话说,我必须在这个窗口中设置一个完全透明的“洞”(没有不透明度值)。 直到此刻,我才想出办法来制作这个透明的洞。

希望得到一个想法...

【问题讨论】:

    标签: wpf transparency


    【解决方案1】:

    尽量避免 AllowsTransparency=true,它非常错误且速度慢。

    你可以 PInvoke SetWindowRgn 来创建一个任意形状的窗口:

    1. 使用 CreateRectRgn 两次,一次用于窗口边界矩形,一次用于孔。
    2. 使用 CombineRgn 和 RGN_AND 作为第 4 个参数来获得一个有洞的区域
    3. 调用 SetWindowRgn 将区域应用到窗口
    4. 不要忘记删除除传递给 SetWindowRgn 的区域之外的所有区域

    【讨论】:

    • 感谢您的回答,我发现创建一个带有孔的窗口区域有点不可能……或者您知道一种方法吗?
    • 我添加了有关如何创建带孔区域的说明。
    • 谢谢老兄,虽然我决定使用我的解决方案,但我将您的建议标记为答案。
    【解决方案2】:

    我找到了一种解决方案:

    这是在另一个窗口顶部的弹出窗口,并且在所需位置包含另一个窗口的孔:

    窗口标题:

        WindowState="Maximized"
        AllowsTransparency="True"
        WindowStyle="None"
    

    窗口内容:

    <Window.Background >
        <SolidColorBrush x:Name="BackgroundBrush" Color="WhiteSmoke" Opacity="0" ></SolidColorBrush>
    </Window.Background>
    <Canvas x:Name="ContectHolder" >
        <Path Stroke="Black" Fill="WhiteSmoke" Opacity="0.8">
            <Path.Data>
                <CombinedGeometry GeometryCombineMode="Exclude">
                    <CombinedGeometry.Geometry1  >
                        <RectangleGeometry Rect="0,0,2000,2000"  />
                    </CombinedGeometry.Geometry1>
                    <CombinedGeometry.Geometry2>
                        <RectangleGeometry Rect="75,75,400,900" />
                    </CombinedGeometry.Geometry2>
                </CombinedGeometry>
            </Path.Data>
        </Path>
    </Canvas>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多