Partager via


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

IE7 avec trame transparente étendue 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.

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

DwmExtendFrameIntoClientArea