Suporte ao desenvolvimento de jogos!


    [EO] Criando Janelas Transparentes

    Compartilhe
    avatar
    Valentine
    Administrador
    Administrador

    Medalhas :
    Mensagens : 4961
    Créditos : 1055

    [EO] Criando Janelas Transparentes

    Mensagem por Valentine em Dom Fev 13, 2011 12:05 am

    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:

    Código:
    ' 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:

    Código:
    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:

    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:

    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:

    Código:
    SetLayeredWindowAttributes hWnd, 0, bAlpha, LWA_ALPHA

    Para:

    Código:
    SetLayeredWindowAttributes hWnd, vbGreen, bAlpha, LWA_COLORKEY

    São pequenos exemplos de como usar a transparência nos Forms e como criar alguns efeitos interessantes.

    Se não entendeu a aula, você pode baixar as demos que eu fiz
    Tirando Cor de Fundo da Janela
    Cor Transparente

    Deixando a janela transparente
    Janela Transparente

    Retirado do site:
    Vbtuga Blogspot

      Data/hora atual: Sex Set 21, 2018 1:14 am