Habilitando o Glass em Winforms

Publicado: 29/05/2006 em IntoSpaces
Estou gostando muito de brincar com o desenvolvimento para Windows Vista e vim compartilhar um pouco do que estou vendo com vocês.
Hoje vou mostrar aqui como colocar o efeito "Glass" em um Winform de maneira a deixar a aplicação mais com cara de Windows Vista.

O glass é o efeito introduzido pelo tema Aero do Windows Vista que dá um efeito translúscido às janelas. O Windows Desktop Manager redireciona todas as nossas ações com o GDI+ para o seu contexto e transforma as janelas, desde as mais antigas em "Aeroed" hehe.
O Aero proporciona uma série de efeitos às janelas por padrão e algumas funcionalidades podem ser extendidas, de acordo com a nossa necessidade e assim podemos personalizar os efeitos e fazer nossas aplicações ficaram com a cada do Windows Vista.

Exemplos interessante de extensões de utilização do glass são as implementações do Explorer, Windows Media Player e o Visualizador de Imagens do Windows. Cada um deles utiliza o Aero para exaltar suas características de navegação para o conteúdo o qual é destinado.

O exemplo mostrado aqui ainda é o mais básico possível, sendo que diversos outros recursos podem ser utilizados. Veremos como aumentar a area do glass em nossa janela.

Primeiramente precisamos interoperar com a API do glass, localizada na dwmapi.dll

[DllImport("dwmapi.dll")]
public static extern int DwmExtendFrameIntoClientArea(
   IntPtr hWnd,
   ref MARGINS pMarInset
);

Lembre-se de adicionar a referência para interoperabilidade no seu código
using System.Runtime.InteropServices;

Esta chamada à API do DWM extende a área do glass em nossa janela, notem que precisamo passar o Handle da janela em qual o efeito ocorrerá e quais são as espessuras da margens, sendo assim o glass vai ocupando as bordas da janela.
As margens são representadas pela estrutura MARGINS que devemos declarar de acordo com a estrutura que a API reconhece de maneira a podermos trabalhar com ela nos dois mundos, o nosso Winform e a API.

[StructLayout(LayoutKind.Sequential)]
public struct MARGINS
{
   public int cxLeftWidth;
  
public int cxRightWidth;
  
public int cyTopHeight;
  
public int cyBottomHeight;
}

A estrutura MARGINS é simples, ela apenas contém informações para as quatro margens de nossa janela.
Com a função e a estrutura prontas, já temos nosso Winform habilitado a receber áreas personalizadas do glass, e para isto devemos colocar no evento Load do Form a chamada para a função, setando os valores que nos interessam para o efeito final.

MARGINS margins = new MARGINS();
margins.cxLeftWidth = 0;
margins.cxRightWidth = 0;
margins.cyTopHeight = 45;
margins.cyBottomHeight = 0;

IntPtr hWnd = this.Handle;
int result = DwmExtendFrameIntoClientArea(hWnd, ref margins);

Primeiro inicializamos nossa estrutura e atribuimos os valores das bordas, sendo que queremos que somente a borda superior seja maior que o padrão para todas as janelas, assumindo uma espessura de 45 pixels. Este espaço pode ser útil para colocar o nome do software por exemplo.
Com isto o glass já ocupa as áreas necessárias, porém os controles que vamos espalhar sobre a janela devem ter seu fundo transparente, para que não se sobreponham de maneira errada ao glass. Isto é bastante simples em um Winform, basta setar a propriedade Transparency Key do Winform para a sua cor de fundo (Background). Lembrando que os controles também devem utilizar a mesma cor de fundo transparente.

Com toda as configurações devidamente implementadas, podemos brincar com os controles e valorizar a aparência que o glass oferece.
No meu exemplo utilizei a parte superior do Form para colocar a logomarca do meu site, entretando é um exemplo ilustrativo para que possamos visualizar o que é possível fazer com as aplicações existentes.

Este exemplo é bem simples e pode ser melhorado, para podermos arrastar a janela utilizando a camada do glass, adicionar efeitos de brilho e desfoque e até escrever sobre ele, mas fica para os próximos posts.
Espero que tenham apreciado e que possamos desvendar todos os segredos que o Vista nos trará!

[]’s
Shinji

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s