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:
Enviar um comentário