Wiedermal ein Einblendeffekt

    • VB.NET

    Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von raupy.

      Wiedermal ein Einblendeffekt

      Hi Leute!
      Da hier schon 2 Einbenldeffekte gepostet wurden, wollte ich uahc mal einen Posten :]
      Dieser Einblendeffekt ist abgeleitet von dem Vista-Einblendeffekt der Fenster.
      Weil ich selber noch XP habe, konnte ich nicht prüfen, ob er der gleiche ist. (Und ich weiß desshalb auch nicht, wie er unter Vista aussieht)
      Hier ist erstmal der Quellcode:
      (Am besten in der Form_Load Event reinstellen)

      VB.NET-Quellcode

      1. For i As Integer = 0 To 10 'Startet eine For-Schleife von 0 bis 10 mit der Schrittgröße 1
      2. Me.Location = New Point(Me.Location.X - i / 2, Me.Location.Y - i / 2) ' Verhindert, dass das Fenster sin nur nach unten vergrössert, sondern in alle Richtungen
      3. Me.Size = New Size(Me.Size.Width + i, Me.Size.Height + i) 'Vergrössert die Form um i
      4. Me.Opacity = i / 10 ' stellt die Transparenz auf i/10
      5. Me.Refresh() ' Aktualisiert die Form
      6. Threading.Thread.Sleep(10) ' Bringt Thread für 10ms in den Schlaf (Pausiert)
      7. Next


      leider hab ich kein Vorschau-Video. Desshalb: Wer es sehn will, einfach ausprobieren und Verbesserungen bitte Posten :D

      mfg
      Von meinem iPhone gesendet

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

      [BackgroundWorker][Code]

      Nicht als Kritik zu verstehen, sondern als Anregung:

      VB.NET-Quellcode

      1. Imports System.ComponentModel
      2. Imports System.Threading
      3. Public Class FormBlender
      4. Private _f As Form
      5. Private WithEvents _bw As New BackgroundWorker
      6. Public Sub New(ByVal f As Form)
      7. _f = f
      8. _bw.WorkerReportsProgress = True
      9. _bw.WorkerSupportsCancellation = True
      10. End Sub
      11. Public Sub Blend(ByVal DurationMS As Integer)
      12. If Not _bw.IsBusy Then
      13. _bw.RunWorkerAsync(DurationMS)
      14. End If
      15. End Sub
      16. Public Sub CancelBlend()
      17. If _bw.IsBusy Then _bw.CancelAsync()
      18. End Sub
      19. Private Sub Blender(ByVal sender As BackgroundWorker, ByVal param As Object)
      20. Dim dr As Integer = 100
      21. If Not param Is Nothing AndAlso TypeOf param Is Integer Then
      22. dr = param
      23. If dr < 100 Then dr = 100
      24. If dr > 3000 Then dr = 3000
      25. dr = (dr \ 100) * 100
      26. End If
      27. Dim i As Integer
      28. For i = 1 To 100
      29. If sender.CancellationPending Then Exit For
      30. sender.ReportProgress(i)
      31. Thread.Sleep(dr \ 100)
      32. Next
      33. End Sub
      34. Private Sub _bw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles _bw.DoWork
      35. Blender(CType(sender, BackgroundWorker), e.Argument)
      36. End Sub
      37. Private Sub _bw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles _bw.ProgressChanged
      38. Try
      39. If Not _f Is Nothing Then
      40. _f.Opacity = CDbl(e.ProgressPercentage) / 100.0#
      41. _f.Refresh()
      42. End If
      43. Catch ex As Exception
      44. ' just fall through, there is nothing we can do, except ..
      45. If _bw.IsBusy Then _bw.CancelAsync()
      46. End Try
      47. End Sub
      48. End Class


      Benutzung:
      Dim bl as New FormBlender(Me)
      bl.Blend(100)

      Die (private) Sub "Blender" kann man natürlich an die eigenen Vorstellungen anpassen.

      Wenn man das ganze in eine Klasse packt, hat es denn Vorteil dass es viel einfacher zu verwenden und wiederzuverwenden ist.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()

      hier hab ich mal ne verbesserung gemacht, dann hakt das nicht so:

      VB.NET-Quellcode

      1. Public Class Form1
      2. Dim C As Integer = 0
      3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      4. Timer1.Start()
      5. Me.Location = New Point(Me.Location.X - 20 / 2, Me.Location.Y - 20 / 2)
      6. Me.Size = New Size(Me.Size.Width - 20, Me.Size.Height - 20)
      7. End Sub
      8. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
      9. If C < 10 Then
      10. Me.Location = New Point(Me.Location.X - 2 / 2, Me.Location.Y - 2 / 2)
      11. Me.Size = New Size(Me.Size.Width + 2, Me.Size.Height + 2)
      12. Me.Opacity = 10 / C
      13. Me.Refresh()
      14. C += 1
      15. Else
      16. Timer1.Stop()
      17. MsgBox(Me.Size.ToString)
      18. End If
      19. End Sub
      20. End Class


      lg.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gelöschter Benutzer“ ()

      Naja ein Timer ist hier aber klar die bessere Lösung, er läuft viel flüssiger (ich würde Interval 1-10 empfehlen). Ob Freakstars Code jetzt auch hakt keine Ahnung habe ihn nicht ausprobiert, aber der Timer ist bei sowas immer die bessere Wahl.