Jump to content

Recommended Posts

Posted

boas,

se percebi bem o teu problema, penso que este código te ajuda

Public Class Form1
    Dim tmp As Integer = 1

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'este 5 e apenas para nao ficar mesmo encostado à lateral do ecra lol
        Me.Left = Screen.PrimaryScreen.WorkingArea.Width - Me.Width - 5 
        Me.Top = Screen.PrimaryScreen.WorkingArea.Height 
        'timer adicionado a form com interval = 100 ms
        Timer1.Enabled = True

    End Sub

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If Me.Top >= Screen.PrimaryScreen.WorkingArea.Height - Me.Height Then
            Me.Top = Screen.PrimaryScreen.WorkingArea.Height - tmp
        ElseIf Me.Top = Screen.PrimaryScreen.WorkingArea.Height - Me.Height Then
            Me.Timer1.Enabled = False
            Exit Sub
        End If
        tmp += 1
    End Sub
End Class

ps: só fiz o fade in 🙂

Posted

A classe form osetnta uma propriedade chamada Opacity.

O valor desta propriedade oscila do 0 (zero) ao 1.

Se quiseres obter por exemplo 37% de opacidade, 37/100 = 0.37 é o valor a atribuír à propriedade.

Uma regra de três simples resolve-te o problema:

Posição máxima está para 1 de opacidade assim como a Posição actual está para X de opacidade.

Uns pequenos ajustes e adaptações matemáticas e tens o problema resolvido.

Até fazia num instantinho e mostrava-te um exemplo, mas não estou nem perto de uma máquina com a IDE instalada.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Posted

A classe form osetnta uma propriedade chamada Opacity.

O valor desta propriedade oscila do 0 (zero) ao 1.

Se quiseres obter por exemplo 37% de opacidade, 37/100 = 0.37 é o valor a atribuír à propriedade.

Uma regra de três simples resolve-te o problema:

Posição máxima está para 1 de opacidade assim como a Posição actual está para X de opacidade.

Uns pequenos ajustes e adaptações matemáticas e tens o problema resolvido.

Até fazia num instantinho e mostrava-te um exemplo, mas não estou nem perto de uma máquina com a IDE instalada.

Por momentos pensei que estavas a explicar o código do Soulsick, mas depois vi que não fazia sentido, e percebi o que querias dizer 😛

Realmente, também era uma forma engraçada, e com o opacity eu sei trabalhar bem 😄 vou experimentar 🙂

Abraço

Posted

Sinceramente não olhei para o código do soulsick, porque só reparei na pergunta que fizeste e não no pedido de explicação...

Se até domingo à noite continuares com dúvida, eu faço-te um exemplo.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Posted

Boas,

relativamente ao código do "fade-in":

Me.Top = Screen.PrimaryScreen.WorkingArea.Height

Torna o valor do top igual à altura da área visível, fazendo com que o form fique escondido.

If Me.Top > Screen.PrimaryScreen.WorkingArea.Height - Me.Height Then

Me.Top = Screen.PrimaryScreen.WorkingArea.Height - tmp

ElseIf Me.Top = Screen.PrimaryScreen.WorkingArea.Height - Me.Height Then

Me.Timer1.Enabled = False

Exit Sub

End If

Verifica se o valor do top é maior que o total do tamanho da área visível subtraído à altura do form:

Se for reduz ao top, de modo a que faça o efeito de subir

Se o top for igual ao tamanho da área visível - a altura do form ,significa que o form já está na "altura" máxima e não o deixa subir mais.

Atenção: No primeiro código que te dei, retira o igual na primeira comparação para que o form fique mesmo encostado à barra de tarefas. 😛

e agora quanto ao fade out:

Basicamente é o contrario do fade in  lol 🙂

Me.Top = Screen.PrimaryScreen.WorkingArea.Height - Me.Height

Atribui ao top o valor da área visível - a altura do form, de modo a que este fique a ver-se.

If Me.Top < Screen.PrimaryScreen.WorkingArea.Height Then

Me.Top = Screen.PrimaryScreen.WorkingArea.Height - Me.Height + tmp

ElseIf Me.Top = Screen.PrimaryScreen.WorkingArea.Height Then

Me.Timer1.Enabled = False

Exit Sub

End If

Verifica se o valor do top é menor que o tamanho da área visível:

Se for então atribui a top o valor da área visível - a altura do form + tmp, ou seja faz com que o top seja maior fazendo o efeito de descer.

Se o valor do top for igual ao tamanho da área visível, significa que já está completamente escondido e sai.

Presumo que te tenhas apercebido que só precisas de trocar os excertos de código uns pelos outros para obteres o efeito que desejas:P

Se houver alguma dúvida, avisa que eu não sou muito bom a explicar coisas lol ?

cumps 😉

Posted

Fade pode-se traduzir em "desvanecer".

Onde o Soulsick escreve "fade-in" leia-se antes "slide-up" e onde escreve "fade-out", leia-se antes "slide-down".

Para obteres o efeito "FADE" continuas a precisar da opacidade e a tal regra de 3 simples.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Posted

Hmm, porquê complicar?

Timer com intervalo de 1 e com o código:

Me.Opacity -= 0.01
If Me.Opacity = 0 Then Application.Exit()

Quando quiseres que faça o efeito:

Timer1.Enabled = "true"

Nada de génio, mas funcional  🙂

Cumps

Posted

A ideia e tornar o form mais opaco ou mais transparente consoante a posição vertical em que se encontra.

Não queiram fugir à matemática :nono1:

Eu já meto aqui um exemplo, como prometi.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Posted

Um bocado em cima do joelho, mas aí está um exemplo.

(sem grandes cálculos, por isso é que ando sempre com valores de ajuste de um lado para o outro)

Gosto de utilizar atenuadores de movimento, o que pode complicar um pouco o código e a sua percepção... mas para qualquer esclarecimento tou cá.

Deve, no mínimo, chegar para te dar uma ideia.

Se quiseres uma cena mais simples... melhor.

Todos os controlos são adicionados em runtime para minimizar os erros no copy/paste.

Para veres o exemplo, só precisas de 2 forms e no startup form (o Form1 por defeito) adicionas um botão, onde vais meter este código:

        Dim F As New Form2

        F.Show()
        F.Mostrar("Que cena marada!", 5)

Depois substituí todo o código do form2 para este:

Public Class Form2
    Private WithEvents TMR As New Timer
    Private WithEvents Temporizador As New Timer
    Private MSG As New Label

    Private ValorVerticalMin As Integer = 0
    Private ValorVerticalMax As Integer = 0
    Private ValorHorizontal As Integer = 0
    Private Dir As Direccao = Nothing

    Private Enum Direccao
        Mostrar
        Esconder
        Parado
    End Enum

    ''' <summary>
    ''' Mostrar o "popup"
    ''' </summary>
    ''' <param name="Texto">Texto a apresentar (nada de centrado nem isso, apenas para demonstrar)</param>
    ''' <param name="Tempo">Tempo em segundos</param>
    ''' <remarks></remarks>
    Public Sub Mostrar(ByVal Texto As String, ByVal Tempo As Integer)
        Dir = Direccao.Mostrar
        MSG.Text = Texto
        TMR.Enabled = True
        Temporizador.Interval = Tempo * 1000
    End Sub

    Private Sub RepetidorMovimento(ByVal sender As Object, ByVal e As System.EventArgs) Handles TMR.Tick
        Select Case Dir

            Case Direccao.Esconder
                Dim Modificador As Double = ((ValorVerticalMin + 24) - Me.Top) * 0.05
                If Modificador > 1 Then
                    Me.Top += Modificador
                    Me.Opacity = VerificaOpacidade()
                Else
                    TMR.Enabled = False
                    Dir = Direccao.Parado
                    Me.Close()
                End If

            Case Direccao.Mostrar
                Dim Modificador As Double = (Me.Top - (ValorVerticalMax + 24)) * 0.05
                If Modificador > 1 Then
                    Me.Top -= Modificador
                    Me.Opacity = VerificaOpacidade()
                Else
                    TMR.Enabled = False
                    Dir = Direccao.Parado
                    Temporizador.Enabled = True
                End If

        End Select
    End Sub

    Private Function VerificaOpacidade() As Double
        Dim OffsetMax As Integer = ValorVerticalMin - ValorVerticalMax
        Dim OffsetPos As Integer = ValorVerticalMin - Me.Top

        Return (OffsetPos / OffsetMax) + 0.2
    End Function

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        TMR.Interval = 1
        TMR.Enabled = False

        ValorVerticalMax = My.Computer.Screen.WorkingArea.Height - Me.Height
        ValorVerticalMin = My.Computer.Screen.WorkingArea.Height
        ValorHorizontal = My.Computer.Screen.WorkingArea.Width - Me.Width - 3

        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        Me.Top = ValorVerticalMin
        Me.Left = ValorHorizontal
        Me.BackColor = Color.White

        Temporizador.Enabled = False

        With MSG
            .AutoSize = False
            .Top = 2
            .Left = 2
            .Width = Me.Width - 4
            .Height = Me.Height - 4
        End With

        Me.Controls.Add(MSG)
    End Sub

    Private Sub TemporizadorParaEsconder(ByVal sender As Object, ByVal e As System.EventArgs) Handles Temporizador.Tick
        Dir = Direccao.Esconder
        TMR.Enabled = True
        Temporizador.Enabled = False
    End Sub
End Class

Há maneiras mais fáceis? Há. Tudo depende da maneira como queres utilizar.

Só um remark, adiciono 0.2 à opacidade na função que retorna a opacidade por causa do factor 0.05 que uso para atenuar o movimento.

Há maneiras matemáticas de dar a volta a isto e ficar certinho, mas não valia a pena para aqui.

EDIT: Se o que pretendes é apenas um Fade in/out, o código fica brutalmente mais fácil. Diz qualquer coisa assim que tentares. Posso ter percebido mal o que pretendes.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Posted

Fade pode-se traduzir em "desvanecer".

Onde o Soulsick escreve "fade-in" leia-se antes "slide-up" e onde escreve "fade-out", leia-se antes "slide-down".

Para obteres o efeito "FADE" continuas a precisar da opacidade e a tal regra de 3 simples.

sim eu sei  🙂 e eu até coloquei o fade-in entre "" mas o fade-out passou-me. Apenas utilizei as designações que o sir pereira deu  😛

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.