Étendre le cadre de transparence dans une application WPF
Mise à jour : novembre 2007
Cette rubrique montre comment étendre le cadre de transparence Windows Vista dans la zone cliente d'une application Windows Presentation Foundation (WPF).
Remarque : |
---|
Cet exemple fonctionne uniquement sur un ordinateur Windows Vista exécutant le Gestionnaire de fenêtrage avec la fonction de cadre de transparence activée. L'édition Familiale Basique Windows Vista ne prend pas en charge l'effet d'affichage transparent. Dans les autres éditions de Windows Vista, les zones pouvant avoir un rendu avec l'effet d'affichage transparent ont un rendu opaque. |
Exemple
L'image illustre le cadre de transparence étendu dans la barre d'adresse d'Internet Explorer 7.
Internet Explorer avec le cadre de transparence derrière la barre d'adresse.
Pour étendre le cadre de transparence dans une application WPF, l'accès à une API non managée est nécessaire. L'exemple de code suivant effectue un appel de code non managé (pinvoke) pour les deux API requises pour étendre le cadre dans la zone cliente. Chacune de ces API est déclarée dans une classe appelée 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 est la fonction du Gestionnaire de fenêtrage qui étend le cadre dans la zone cliente. Il prend deux paramètres; un handle de fenêtre et une structure MARGINS. MARGINS sert à indiquer au Gestionnaire de fenêtrage de combien le cadre doit être étendu dans la zone cliente.
Pour utiliser la fonction DwmExtendFrameIntoClientArea, un handle de fenêtre doit être obtenu. Dans WPF, le handle de fenêtre doit être obtenu à partir de la propriété Handle d'une HwndSource. Dans l'exemple suivant, le cadre est étendu dans la zone cliente lors de l'événement de la fenêtre 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;
}
}
L'exemple suivant montre une simple fenêtre dans laquelle le cadre est étendu dans la zone cliente. Le cadre est étendu derrière la bordure supérieure contenant les deux objets 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>
L'image suivante illustre le cadre de transparence étendu dans une application WPF.
Cadre de transparence étendu dans une application WPF.
Voir aussi
Référence
Vue d'ensemble du Gestionnaire de fenêtrage
Vue d'ensemble de la fonction de flou du Gestionnaire de fenêtrage