Создайте прозрачное отверстие внутри фона окна - WPF - PullRequest
8 голосов
/ 19 апреля 2009

У меня есть окно со следующими значениями:

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

Это окно появляется поверх другого окна (в виде всплывающего окна) с содержимым в определенном месте.

У меня новое требование. Это окно должно показывать область прямоугольника из окна ниже. Другими словами, я должен установить «дыру» в этом окне, которая будет полностью прозрачной (без значения непрозрачности). До этого момента я не мог придумать, как сделать эту прозрачную дыру.

Надеюсь получить представление ...

Ответы [ 2 ]

10 голосов
/ 19 апреля 2009

Я нашел решение для этого:

это всплывающее окно поверх другого окна, содержащее отверстие для другого окна в нужном месте:

Заголовок окна:

    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>
4 голосов
/ 19 апреля 2009

старайтесь избегать AllowsTransparency = true, он очень глючный и медленный.

Вы можете PInvoke SetWindowRgn создать окно любой формы:

  1. Используйте CreateRectRgn дважды, один раз для прямоугольника, ограничивающего окно, и один раз для отверстия.
  2. Используйте CombineRgn с RGN_AND в качестве 4-го параметра, чтобы получить регион с дырой в нем
  3. Вызовите SetWindowRgn, чтобы применить регион к окну
  4. Не забудьте удалить все регионы, кроме той, которую вы передали в SetWindowRgn
...