다음을 통해 공유


투명 효과 프레임을 WPF 애플리케이션으로 확장

이 항목에서는 Windows Vista 투명 효과 프레임을 Windows Presentation Foundation(WPF) 애플리케이션의 클라이언트 영역으로 확장하는 방법을 보여 줍니다.

비고

이 예제는 투명 효과가 사용되도록 설정된 DWM(바탕 화면 창 관리자)를 실행하는 Windows Vista 컴퓨터에서만 작동합니다. Windows Vista Home Basic 버전은 투명한 유리 효과를 지원하지 않습니다. 일반적으로 다른 Windows Vista 버전에서 투명 효과로 렌더링되는 영역이 불투명하게 렌더링됩니다.

주소 표시줄의 확장 투명 효과 프레임

다음 그림은 Internet Explorer 7의 주소 표시줄로 확장되는 투명 효과 프레임을 보여 줍니다.

Screenshot showing glass frame extended behind IE7 address bar.IE7 주소 표시줄 뒤에 확장된 투명 효과 프레임을 보여주는 스크린샷.

WPF 애플리케이션에서 투명 효과 프레임을 확장하려면 관리되지 않는 API에 액세스해야 합니다. 다음 코드 예제는 프레임을 클라이언트 영역으로 확장하는 데 필요한 두 개의 API에 대해 플랫폼 호출(pinvoke)을 수행합니다. 이러한 각 API는 NonClientRegionAPI라는 클래스에서 선언됩니다.

[StructLayout(LayoutKind.Sequential)]
public struct MARGINS
{
    public int cxLeftWidth;      // width of left border that retains its size
    public int cxRightWidth;     // width of right border that retains its size
    public int cyTopHeight;      // height of top border that retains its size
    public int cyBottomHeight;   // height of bottom border that retains its size
};

[DllImport("DwmApi.dll")]
public static extern int DwmExtendFrameIntoClientArea(
    IntPtr hwnd,
    ref MARGINS pMarInset);
<StructLayout(LayoutKind.Sequential)>
Public Structure MARGINS
    Public cxLeftWidth As Integer ' width of left border that retains its size
    Public cxRightWidth As Integer ' width of right border that retains its size
    Public cyTopHeight As Integer ' height of top border that retains its size
    Public cyBottomHeight As Integer ' height of bottom border that retains its size
End Structure

<DllImport("DwmApi.dll")>
Public Shared Function DwmExtendFrameIntoClientArea(ByVal hwnd As IntPtr, ByRef pMarInset As MARGINS) As Integer
End Function

DwmExtendFrameIntoClientArea는 프레임을 클라이언트 영역으로 확장하는 DWM 함수입니다. 이 함수는 창 핸들 및 MARGINS 구조체의 두 매개 변수를 사용합니다. MARGINS는 프레임을 클라이언트 영역으로 얼마나 추가로 확장해야 하는지를 나타내는 데 사용됩니다.

로드된 이벤트에서 확장된 투명 효과 프레임

DwmExtendFrameIntoClientArea 함수를 사용하려면 창 핸들을 가져와야 합니다. WPF에서는 HwndSourceHandle 속성에서 창 핸들을 가져올 수 있습니다. 다음 예제에서 프레임은 창의 Loaded 이벤트에서 클라이언트 영역으로 확장됩니다.

void OnLoaded(object sender, RoutedEventArgs e)
{
   try
   {
      // Obtain the window handle for WPF application
      IntPtr mainWindowPtr = new WindowInteropHelper(this).Handle;
      HwndSource mainWindowSrc = HwndSource.FromHwnd(mainWindowPtr);
      mainWindowSrc.CompositionTarget.BackgroundColor = Color.FromArgb(0, 0, 0, 0);

      // Get System Dpi
      System.Drawing.Graphics desktop = System.Drawing.Graphics.FromHwnd(mainWindowPtr);
      float DesktopDpiX = desktop.DpiX;
      float DesktopDpiY = desktop.DpiY;

      // Set Margins
      NonClientRegionAPI.MARGINS margins = new NonClientRegionAPI.MARGINS();

      // Extend glass frame into client area
      // Note that the default desktop Dpi is 96dpi. The  margins are
      // adjusted for the system Dpi.
      margins.cxLeftWidth = Convert.ToInt32(5 * (DesktopDpiX / 96));
      margins.cxRightWidth = Convert.ToInt32(5 * (DesktopDpiX / 96));
      margins.cyTopHeight = Convert.ToInt32(((int)topBar.ActualHeight + 5) * (DesktopDpiX / 96));
      margins.cyBottomHeight = Convert.ToInt32(5 * (DesktopDpiX / 96));

      int hr = NonClientRegionAPI.DwmExtendFrameIntoClientArea(mainWindowSrc.Handle, ref margins);
      //
      if (hr < 0)
      {
         //DwmExtendFrameIntoClientArea Failed
      }
   }
   // If not Vista, paint background white.
   catch (DllNotFoundException)
   {
      Application.Current.MainWindow.Background = Brushes.White;
   }
}

클라이언트 영역의 확장된 투명 효과 프레임

다음 예제는 프레임이 클라이언트 영역으로 확장되는 간단한 창을 보여 줍니다. 이 프레임은 2개의 TextBox 개체를 포함하는 위쪽 테두리 뒤로 확장됩니다.

<Window x:Class="SDKSample.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Extended Glass in WPF" Height="300" Width="400"
    Loaded="OnLoaded" Background="Transparent"
    >
  <Grid ShowGridLines="True">
    <DockPanel Name="mainDock">
      <!-- The border is used to compute the rendered height with margins.
           topBar contents will be displayed on the extended glass frame.-->
      <Border Name="topBar" DockPanel.Dock="Top" >
        <Grid Name="grid">
          <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="100" Width="*"/>
            <ColumnDefinition Width="Auto"/>
          </Grid.ColumnDefinitions>
          <TextBox Grid.Column="0" MinWidth="100" Margin="0,0,10,5">Path</TextBox>
          <TextBox Grid.Column="1" MinWidth="75" Margin="0,0,0,5">Search</TextBox>
        </Grid>
      </Border>
      <Grid DockPanel.Dock="Top" >
        <Grid.ColumnDefinitions>
          <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <TextBox Grid.Column="0" AcceptsReturn="True"/>
      </Grid>
    </DockPanel>
  </Grid>
</Window>

다음 그림은 WPF 애플리케이션으로 확장되는 투명 효과 프레임을 보여 줍니다.

Screenshot showing a glass frame extended into a WPF application.WPF 애플리케이션에 확장된 투명 효과 프레임을 보여주는 스크린샷.

참고하십시오