2009-04-19 5 views
7

J'ai une fenêtre avec ces valeurs:Créer un trou transparent dans un arrière-plan de la fenêtre - WPF

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

Cette fenêtre arrive au-dessus d'une autre fenêtre (comme un pop-up) avec un contenu à ce sujet sur une Position spécifique.

J'ai une nouvelle exigence. Cette fenêtre doit montrer une zone rectangle de la fenêtre ci-dessous. En d'autres termes, je dois définir un "trou" dans cette fenêtre qui sera totalement transparent (sans la valeur d'opacité). Jusqu'à ce moment je ne pouvais pas trouver un moyen de rendre ce trou transparent.

l'espoir d'obtenir une idée ...

Répondre

3

essayer d'éviter AllowsTransparency = true, il est très lent et bogué.

vous pouvez PInvoke SetWindowRgn pour créer une fenêtre de toute forme:

  1. utilisation CreateRectRgn deux fois, une fois pour le rectangle de délimitation de la fenêtre et une fois pour le trou.
  2. Utilisation CombineRgn avec RGN_AND comme le 4ème paramètre pour obtenir une région avec un trou dans
  3. Appel SetWindowRgn pour appliquer la région à la fenêtre
  4. Ne pas oublier de supprimer toutes les régions à l'exception de celui que vous avez passé à SetWindowRgn
+0

Merci pour votre réponse, je l'ai trouvé un peu impossible de créer une zone de fenêtre avec un trou à l'intérieur ... ou peut-être vous savoir un moyen de le faire? – Satumba

+0

J'ai ajouté des instructions sur la façon de créer une région avec un trou. – Nir

+0

Merci mec, bien que j'ai décidé d'utiliser ma solution j'ai marqué votre suggestion comme réponse. – Satumba

9

J'ai trouvé une sorte de solution pour elle:

c'est la fenêtre pop-up qui au-dessus d'une autre fenêtre, et contenant un trou à l'autre fenêtre dans un endroit désiré:

en-tête de la fenêtre:

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

contenu de la fenêtre:

<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>