Desenvolvimento - C#

Habilitando o Aero Glass em Winforms

Neste artigo o autor mostra como colocar o efeito "Glass" em um Winform de maneira a deixar a aplicação mais com cara de Windows Vista.

por Murilo Maciel Curti



Neste artigo vou mostrar 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".

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

Espero que tenham apreciado e que possamos desvendar todos os segredos que o Vista nos trará!

Murilo Maciel Curti

Murilo Maciel Curti - Microsoft Student Ambassador, co-líder do Grupo de Usuários GU-RJ.NET, líder da célula Unifev.NET, finalista do Imagine Cup Brasil 2004, com experiência há mais de 2 anos com a plataforma .NET, ministra palestras e diversas outras atividades para universidades além de trabalhar como Desenvolvedor em um provedor de wireless.
The Spoke:
http://br.thespoke.net/MyBlog/shinji/MyBlog.aspx