Descobrir o Windows Presentation Foundation

Windows Presentation Foundation (WPF). Finalmente estou a ser ''obrigado'' a compreender como funciona para criar uns programas mais apelativos. Ora o WPF foi bastante bem construido, principalmente com o novo sistema de Front-Buffer e Back-Buffer, que faz com que não exista arrastamento das janelas que existia no Windows XP, e ainda nos permite efeitos como o Aero Glass, Aero Thumbnails, e Aero Flip e Flip 3D. É sobre eles que vou falar hoje, e principalmente de como adicionar "Vidro" ao WinForm de uma aplicação.

Mas primeiramente, o que significa "Adicionar vidro"? Como todos sabem, o Windows Vista, a partir da versão Home Premium, inclui o novo tema, o Aero theme. Existem 3 adições no Aero, e todas elas funcionam graças ao WPF, mas a que salta mais a vista é concerteza o efeito "Glass", ou "Vidro baço", que se pode ver nas frames das janelas deste Sistema Operativo, mas não é só isso, é muito mais do que isso...

Em máquinas bem equipadas (Que suportem o Aero na sua totalidade), todas as janelas têm as bordas emvidraçadas (até mesmo a linha de comandos do DOS!), mas algumas aplicações utilizam o vidro mesmo na área de interacção, e a maior parte delas fá-lo por motivos de design. Internet Explorer 7 expande o "Glass" para a área onde estão presentes os botões de retroceder a avançar, e também na barra de endereço. O Windows Média Player 11 utiliza o "Glass" na área de controlo da média, entre muitas aplicações que utilizam o "Glass" mais profundamente, como por exemplo, o "Centro de Mobilidade do Windows".

Agora estou a investigar como colocar esse efeito nas minhas aplicações, e se estiver a ler atentamente este post também o poderá fazer, pois irei dar umas noções de como o fazer.

Criar este efeito nas minhas aplicações será mais uma maneira de a fazer parecer parte integrante deste Sistema Operativo.

A API que faz todo o trbalho sujo são apenas 4 linhas de código que são as seguintes:

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

Esta chamada faz quase tudo. Cria dois parametros que contém informação de quanto mais "Glass" o WDM deve aplicar no form, para a esquerda, direita, para cima e para baixo. E aqui poderá ver a declaração das margens:

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

O grande desafio aqui será meter o "alpha-Blending" a funcionar correctamente. Caso não o faça, todo o coteúdo que colocar em cima do "Glass" irá substituir o "Glass" em si, e não verá nada. Isto é um problema no GDI, já que ele não sabe distinguir um canal "Alpha" de outro qualquer, mas é mais fácil em GDI+.

No seu form da aplicação, apenas terá de ajustar a propriedade "TransparencyKey" para uma cor que não vá aser utilizada em mais nenhuma parte do programa (Uso o Gainsboro), por razões que irão ser aparentes mais tarde).

Aqui fica um exemplo de como usar a API acima (a partir de um evento Form_Load):

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

Se tiver criado os painéis correctamente, já deverá poder ver "Vidro" na sua aplicação. Agora já poderá desenhar botões, letras em cima do vidro, e desde que defina a sua cor de fundo para transparente, deverão integrar-se correctamente com o "Glass". Aqui fica um exemplo:

Como podem ver, o Windows Presentation Foundation foi bastante bem contruído e pode dar muita "vida" às vossas e minhas aplicações!



0 comentários: