A transparência é a capacidade de ser transparente, ou seja, de permitir ver através, neste caso, do objecto. Esta transparência permite criar formulários que deixam ver através dele, que abrem com um efeito fade in (começar a aparecer até ficar opaco) ou fade out (do opaco ao invisível). Estas são algumas aplicações possíveis, que para além de um efeito bonito, melhoram o visual da aplicação.
O design de uma aplicação é muito importante e o seu sucesso pode também ser o sucesso da aplicação. Uma aplicação por muito boa que esteja (funcional), dificilmente vende ou convence se não tiver um bom design.

O VB.NET já inclui esta propriedade nos Forms mas o VB6 não e para a criarmos necessitamos de recorrer a alguns API’s. O API que permite este efeito é o SetLayeredWindowAttributes() embora se utilizem outros auxiliares, como é o caso das funções GetWindowLong() e SetWindowLong().
Para tornarmos um form transparente necessitamos do seguinte código (embora apenas seja usado o Sub MakeTransparent() e não o MakeOpaque() que “apenas” transforma o form em opaco):
No módulo:
' Declaração de API's necessários
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As LongPrivate Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
' Definição de constantes
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_COLORKEY = &H1
Private Const LWA_ALPHA = &H2
Private Const ULW_COLORKEY = &H1
Private Const ULW_ALPHA = &H2
Private Const ULW_OPAQUE = &H4
Private Const WS_EX_LAYERED = &H80000' Define o Form como transparente
Public Sub MakeTransparent(ByVal hWnd As Long, ByVal bAlpha As Integer)
Dim msg As Long' Ignora possíveis erros
On Error Resume Next' Caso o valor seja inferior a 255 e superior
' a 0 aplica uma nova transparência
If bAlpha > 0 Or bAlpha < 255 Thenmsg = GetWindowLong(hWnd, GWL_EXSTYLE)
msg = msg Or WS_EX_LAYERED
SetWindowLong hWnd, GWL_EXSTYLE, msgSetLayeredWindowAttributes hWnd, 0, bAlpha, LWA_ALPHA
End If
End Sub
' Define o form com opaco
Public Sub MakeOpaque(ByVal hWnd As Long)
Dim msg As Long' Ignora possíveis erros
On Error Resume Nextmsg = GetWindowLong(hWnd, GWL_EXSTYLE)
msg = msg And Not WS_EX_LAYERED
SetWindowLong hWnd, GWL_EXSTYLE, msg
SetLayeredWindowAttributes hWnd, 0, 0, LWA_ALPHAEnd Sub
Depois, na inicialização do Form:
Private Sub Form_Initialize()
MakeTransparent Me.hWnd, 150
End Sub
O valor a indicar pode variar entre 0 e 255, onde 0 é o máximo de transparência.
Este exemplo mostra como iniciar um Form transparente, mas pode-se criar um efeito mais interessante onde o Form começa a aparecer até ficar opaco – fade in. Para criar este efeito é apenas necessário adicionar um Timer ao Form e utilizar o seguinte código:
' Variável que irá guardar o valor da transparência
Private i As Integer' Inicializa o form como transparente
Private Sub Form_Initialize()MakeTransparent(Me.hWnd, 0)
End Sub
' No intervalo definido
Private Sub Timer1_Timer()
' Incrementa o valor da transparência
i = i + 10' Caso não tenha atingido 255 define nova
' transparência, caso contrário pára o timer
If i <= 255 Then
MakeTransparent(Me.hWnd, i)
Else
Timer1.Enabled = False
End IfEnd Sub
' Definição do intervalo do timer e inicialização
Private Sub Form_Load()
Timer1.Interval = 100
Timer1.Enabled = True
End Sub
Outra das aplicações que esta função permite, com umas pequenas alterações, é dizer que apenas uma cor ficará transparente. Ora isto permite colocar um controlo dentro do form e dizer que este é transparente criando uma janela ou um formato diferente.
Um exemplo engraçado para mostrar a sua implementação é criar algo parecido com um queijo. É apenas necessário colocar umas shapes no Form, formatá-las e definir no Form BorderStyle = None. Depois o código:
Private Sub Form_Load()
Dim ctrl As Control' Definição de todas as shapes do Form com o fundo a
' verde, estilo opaco e com os limites a transparente
For Each ctrl In Me.ControlsIf TypeOf ctrl Is Shape Then
ctrl.BackStyle = 1
ctrl.BackColor = vbGreen
ctrl.BorderStyle = 0
End IfNext
' Chamar a função que irá colocar
' tudo o que é verde como transparente
MakeTransparent Me.hWnd, 0End Sub
Finalmente no Sub MakeTransparent() alterar a seguinte linha, de modo a transformar tudo o que está a verde (vbGreen) em invisível.
De:
SetLayeredWindowAttributes hWnd, 0, bAlpha, LWA_ALPHA
Para:
SetLayeredWindowAttributes hWnd, vbGreen, bAlpha, LWA_COLORKEY
São pequenos exemplos de como usar a transparência nos Forms e como criar alguns efeitos interessantes.
PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!
14 comentários:
eu gostei muito dos exemplos, mas sempre que o coloco o codigo da algum erro .alguem pode me explicar como usar corretamente esses codigos?
meu e-mail:daniloapcarmo3@hotmail.com
BLZ, TOTALMENTE FUNCIONAL!
Excelente!!
Funcionou 100% também!
Como faço para deixar meu formulário com o formato de uma imagem PNG?
Ou seja, respeitando a sua transparência e sua sombra?
Algo impossível aos nossos olhos?
Ag. respostas!
Obs.: "Ótimooo tópico! Muito bem explicado e super funcional!"
Maycon Moreira Vieira
Gostei muito, mas como posso fazer que funcione em forms não Modal, como ter um MDI e Filhos transparentes ????
Funciona perfeitamente, mas gostaria de colocar transparencia em forms filhos dependentes de um MDI e não funciona, como posso fazer ? meu e-mail diazdeherrera@click21.com.br
Olá,
Em MDI Childs não funciona e sinceramente penso que não seja possível (pelo menos não conheço nem nunca vi nenhuma maneira de o fazer).
Um abraço
Achei excelente o Código, muito bom, e parabéns.
Silvio
Confirmo o que o Silvio disse. Esse artigo é nota mil, dez é pouco!!!
Vitor Hugo
Por isso que eu gosto do VBzão! É rústico mas tem suas artimanhas.
Parabéns!
tem como fazer em mdi ou em uma picturebox?
Venancio Guedes-Gostei Funcionou perfeitamente
eu adorei os exemplos.
mas em vez de 1 form, que tal(por exemplo) 1 picturebox?
obrigado
Muy bueno.
También ejemplos básicos: http://tupagina.comuf.com/
Enviar um comentário