在窗口的背景中创建一个透明孔 - WPF

Sat*_*mba 8 wpf transparency

我有一个带有这些值的窗口:

WindowState="Maximized"
AllowsTransparency="True"
Opacity="0.5"
WindowStyle="None"
Run Code Online (Sandbox Code Playgroud)

此窗口位于其他窗口的顶部(作为弹出窗口),其中包含特定位置上的内容.

我有一个新的要求.该窗口必须从下面的窗口显示一个矩形区域.换句话说,我必须在这个窗口中设置一个"洞",它将是完全透明的(没有不透明度值).直到这一刻我才想出办法让这个透明的洞.

希望得到一个想法......

Sat*_*mba 10

我找到了一种解决方案:

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

Window的标题:

    WindowState="Maximized"
    AllowsTransparency="True"
    WindowStyle="None"
Run Code Online (Sandbox Code Playgroud)

窗口内容:

<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>
Run Code Online (Sandbox Code Playgroud)


Nir*_*Nir 4

尽量避免AllowsTransparency=true,它有很多错误并且速度很慢。

您可以 PInvoke SetWindowRgn 创建任意形状的窗口:

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