Partilhar via


Estender Frame Transparente em um Aplicativo WPF

Este tópico demonstra como estender o quadro transparente do Windows Vista para dentro da área cliente de um aplicativo Windows Presentation Foundation (WPF).

ObservaçãoObservação:

Este exemplo só funcionará em um Windows Vista execução de computador de Gerenciador de Janelas da área de trabalho (DWM) com efeito de transparência habilitado. O Windows Vista Home Basic edition não tem suporte ao efeito de vidro transparente. As áreas que normalmente seriam renderizadas com o efeito transparente nas outras edições do Windows Vista são renderizadas opacas.

Exemplo

A imagem a seguir ilustra o quadro transparente estendido para dentro da barra de endereços do Internet Explorer 7.

Internet Explorer com quadro transparente estendido atrás da barra de endereços.

IE7 com moldura transparente por trás da barra de endereço.

Para estender o quadro transparente em um aplicativo WPF é necessário acesso à API não gerenciada. O exemplo de código a seguir faz uma invocação de plataforma (PInvoke) para as duas APIs necessárias para estender o quadro para a área cliente. Cada API dessas é declarada em uma classe chamada 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 é a função DWM que estende o quadro para a área de cliente. Leva dois parâmetros; um identificador de janela e um MARGENS estrutura. MARGENS é usado para informar o DWM extra quanto o quadro deve ser estendido para a área de cliente.

Para usar o DwmExtendFrameIntoClientArea função, um identificador de janela deve ser obtido. No WPF o identificador de janela pode ser obtido a partir da propriedade Handle de um HwndSource. No exemplo a seguir, o quadro é estendido para a área cliente no evento Loaded da janela.

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;
   }
}

O exemplo a seguir mostra uma janela simples em que o quadro é estendido para a área cliente. O quadro é estendido por trás da borda superior que contém os dois objetos 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>

A imagem a seguir ilustra o quadro de vidro estendido em um aplicativo WPF.

efeito de transparência quadro estendido em um WPF Aplicativo.

Moldura transparente estendida em um aplicativo WPF.

Consulte também

Referência

Área de trabalho janela Manager visão geral

Visão geral do Gerenciador de janelas da área de trabalho Desfoque

DwmExtendFrameIntoClientArea