8

次の値のウィンドウがあります。

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

このウィンドウは、特定の場所にコンテンツが表示された他のウィンドウの上に(ポップアップとして)表示されます。

新しい要件があります。このウィンドウは、下のウィンドウから長方形の領域を表示する必要があります。つまり、このウィンドウに「穴」を設定する必要があります。この穴は完全に透明になります(不透明度の値はありません)。この瞬間まで、私はこの透明な穴を作る方法を見つけることができませんでした。

アイデアを得たいと思っています...

4

2 に答える 2

12

私はそれに対する一種の解決策を見つけました:

これは、別のウィンドウの上にあるポップアップウィンドウであり、目的の場所にある他のウィンドウへの穴が含まれています。

ウィンドウのヘッダー:

    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>
于 2009-04-19T14:55:41.010 に答える
4

AllowsTransparency=trueを避けてください。非常にバグが多く低速です。

SetWindowRgnを呼び出して、任意の形状のウィンドウを作成できます。

  1. CreateRectRgnを2回使用します。1回はウィンドウの境界の長方形に、もう1回は穴に使用します。
  2. 4番目のパラメーターとしてRGN_ANDを指定したCombineRgnを使用して、穴のある領域を取得します
  3. SetWindowRgnを呼び出して、領域をウィンドウに適用します
  4. SetWindowRgnに渡した領域を除くすべての領域を削除することを忘れないでください
于 2009-04-19T12:57:32.010 に答える