Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB6: Forms Transparentes

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 Long

    Private 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 Then

            msg = GetWindowLong(hWnd, GWL_EXSTYLE)
            msg = msg Or WS_EX_LAYERED
            SetWindowLong hWnd, GWL_EXSTYLE, msg     

            SetLayeredWindowAttributes 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 Next

        msg = GetWindowLong(hWnd, GWL_EXSTYLE)
        msg = msg And Not WS_EX_LAYERED
        SetWindowLong hWnd, GWL_EXSTYLE, msg

        SetLayeredWindowAttributes hWnd, 0, 0, LWA_ALPHA

    End 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 If

    End 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.Controls

            If TypeOf ctrl Is Shape Then
                ctrl.BackStyle = 1
                ctrl.BackColor = vbGreen
                ctrl.BorderStyle = 0
            End If

        Next

        ' Chamar a função que irá colocar
        ' tudo o que é verde como transparente
        MakeTransparent Me.hWnd, 0

    End 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!

13 comentários:

Anónimo disse...

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

Eudes Fernando disse...

BLZ, TOTALMENTE FUNCIONAL!

Anónimo disse...

Excelente!!
Funcionou 100% também!

Anónimo disse...

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

Anónimo disse...

Gostei muito, mas como posso fazer que funcione em forms não Modal, como ter um MDI e Filhos transparentes ????

Anónimo disse...

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

jpaulino disse...

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

Anónimo disse...

Achei excelente o Código, muito bom, e parabéns.
Silvio

Anónimo disse...

Confirmo o que o Silvio disse. Esse artigo é nota mil, dez é pouco!!!
Vitor Hugo

Mr Jones disse...

Por isso que eu gosto do VBzão! É rústico mas tem suas artimanhas.

Parabéns!

Anónimo disse...

tem como fazer em mdi ou em uma picturebox?

Anónimo disse...

Venancio Guedes-Gostei Funcionou perfeitamente

Joaquim disse...

eu adorei os exemplos.
mas em vez de 1 form, que tal(por exemplo) 1 picturebox?
obrigado

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico