2009-04-19 14 views
7

私は、これらの値を持つウィンドウを持っている:ウィンドウの背景内の透明穴を作成します - WPF

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

このウィンドウには、上のそれ上のコンテンツを(ポップアップなど)他のウィンドウの上に来ています特定の場所。

私には新しい要件があります。このウィンドウは、下のウィンドウから長方形の領域を表示する必要があります。言い換えれば、私は完全に(不透明度の値なしで)透明になるこのウィンドウに "穴"を設定する必要があります。 この瞬間まで、私はこの透明な穴を作る方法を見つけられませんでした。希望のアイデアを得るために

...

答えて

3

試みがAllowsTransparency = trueを避けるために、それは非常にバギーと遅いです。一度ウィンドウ境界の矩形のため、一度穴のために、二回

  1. 使用CreateRectRgn:

    あなたがPInvokeのSetWindowRgnは、任意の形状のウィンドウを作成することができます。
  2. ウィンドウ
  3. にリージョンを適用することで穴
  4. コールSetWindowRgnと地域を取得するための4番目のパラメータとしてRGN_ANDとCombineRgn使用あなたが渡された1以外のすべての領域を削除することを忘れないでください。
+0

おかげで、 は、私はそれは少し不可能、内部に穴を窓領域を作成することが判明...または多分あなたをそれを行う方法を知っていますか? – Satumba

+0

穴がある領域を作成する方法を説明しました。 – Nir

+0

おかげで、私は答えとしてあなたの提案をマーク私のソリューションを使用することにしましたが、ちょっと。 – Satumba

9

をSetWindowRgnするために、私はそれのための解決策のようなものを見つけました:

これは他のウィンドウの上にいる、そして所望の場所に他のウィンドウに穴を含むポップアップウィンドウです:

ウィンドウのヘッダー:

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> 
関連する問題