투명 효과 프레임을 WPF 응용 프로그램으로 확장
업데이트: 2007년 11월
이 항목에서는 Windows Vista 투명 효과 프레임을 WPF(Windows Presentation Foundation) 응용 프로그램의 클라이언트 영역으로 확장하는 방법을 보여 줍니다.
참고
이 예제는 투명 효과가 설정되어 있는 DWM(데스크톱 창 관리자)을 실행 중인 Windows Vista 시스템에서만 작동합니다. Windows Vista Home Basic Edition에서는 투명 효과를 지원하지 않습니다. Windows Vista의 다른 버전에서는 일반적으로 투명 효과로 렌더링될 영역이 불투명하게 렌더링됩니다.
예제
다음 이미지에서는 Internet Explorer 7의 주소 표시줄로 확장되는 투명 효과 프레임을 보여 줍니다.
주소 표시줄 뒤로 투명 효과 프레임이 확장된 Internet Explorer
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);
DwmExtendFrameIntoClientArea는 프레임을 클라이언트 영역으로 확장하는 DWM 함수입니다. 이 함수는 두 개의 매개 변수, 즉 창 핸들과 MARGINS 구조체를 사용합니다. MARGINS는 프레임의 여백을 얼마나 클라이언트 영역으로 확장해야 하는지를 DWM에 알리는 데 사용됩니다.
DwmExtendFrameIntoClientArea 함수를 사용하려면 창 핸들을 가져와야 합니다. WPF에서 창 핸들은 HwndSource의 Handle 속성에서 가져올 수 있습니다. 다음 예제에서 프레임은 창의 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;
}
}
다음 예제에서는 프레임이 클라이언트 영역으로 확장되는 간단한 창을 보여 줍니다. 프레임은 두 개의 TextBox 개체가 포함된 위쪽 테두리 뒤에서 확장됩니다.
<Window x:Class="SDKSample.Window1"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://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 응용 프로그램으로 확장된 투명 효과 프레임을 보여 줍니다.
**투명 프레임 확장:**WPF 응용 프로그램