Drag+Fade Window

    • VB.NET

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Agita.

      Drag+Fade Window

      Mein Lösungsweg wie man ganz einfach ein Fenster ohne Titelleiste bewegen kann
      Dabei wird die Form ausgeblendet und beim Loslassen der Maustaste wieder eingeblendet

      Hier die Vorschau

      Was zu tun ist:

      - neues einfaches Projekt erstellen
      - neues Modul erstellen
      - auf der Form eine PicBox anlegen
      - Wenn der Standartname nicht "PictureBox1" ist dann in diesen umbenennen
      - Folgendes als jeweiligen Code einfügen:

      Code für die Form

      VB.NET-Quellcode

      1. Imports System.Threading
      2. Public Class Form1
      3. Public MyForm As Class_MyForm
      4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      5. MyForm = New Class_MyForm(Me)
      6. MyForm.SetAlpha(0.0)
      7. MyForm.SetFading(1.0, 20, 50)
      8. Dim NewThread = New Thread(AddressOf MyForm.StartFading)
      9. NewThread.Start()
      10. End Sub
      11. Private Sub PicBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseDown
      12. Dim NewThread As Thread = Nothing
      13. MyForm.SetFading(0.4, 10, 100)
      14. NewThread = New Thread(AddressOf MyForm.StartFading)
      15. NewThread.Start()
      16. MyForm.DragMe(Me.Handle)
      17. MyForm.SetFading(1, 5, 50)
      18. NewThread = New Thread(AddressOf MyForm.StartFading)
      19. NewThread.Start()
      20. End Sub
      21. Public Sub CallBack_SetOpacity(ByVal Opacity_ As Double)
      22. Me.Opacity = Opacity_
      23. End Sub
      24. End Class


      Code für das Modul

      VB.NET-Quellcode

      1. Public Class Class_MyForm
      2. Private Declare Function ReleaseCapture Lib "user32" () As Integer
      3. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As Object) As Integer
      4. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
      5. Private Delegate Sub CallBack_SetOpacity(ByVal Alpha As Double)
      6. Private Const HTCAPTION As Short = 2
      7. Private Const WM_NCLBUTTONDOWN As Short = &HA1S
      8. Private Const WM_SYSCOMMAND As Short = &H112S
      9. Private AlphaNow As Double = 1
      10. Private AlphaNew As Double
      11. Private LoopsI As Integer
      12. Private SleepI As Integer
      13. Private IsFading As Boolean = False
      14. Private LoopI As Integer
      15. Private AlphaBit As Double
      16. Protected That As Object
      17. Sub New(ByVal This As Object)
      18. That = This
      19. End Sub
      20. Public Sub SetAlpha(ByVal AlphaNow_ As Double)
      21. Dim frm = That
      22. Dim d As New CallBack_SetOpacity(AddressOf frm.CallBack_SetOpacity)
      23. AlphaNow = AlphaNow_
      24. If (AlphaNow > 1) Then AlphaNow = 1
      25. If (AlphaNow < 0) Then AlphaNow = 0
      26. frm.Invoke(d, New Object() {AlphaNow})
      27. End Sub
      28. Public Sub SetFading(ByVal AlphaNew_ As Double, ByVal LoopsI_ As Integer, ByVal SleepI_ As Integer)
      29. AlphaNew = AlphaNew_
      30. LoopsI = LoopsI_
      31. SleepI = SleepI_
      32. LoopI = 1
      33. AlphaBit = ((AlphaNew - AlphaNow) / LoopsI)
      34. End Sub
      35. Public Sub StartFading()
      36. If (IsFading = False) Then
      37. IsFading = True
      38. For Me.LoopI = 1 To LoopsI
      39. SetAlpha(AlphaNow + AlphaBit)
      40. Application.DoEvents()
      41. Sleep(SleepI)
      42. Next LoopI
      43. SetAlpha(AlphaNew)
      44. IsFading = False
      45. End If
      46. End Sub
      47. Public Sub DragMe(ByVal hwnd As Long)
      48. ReleaseCapture()
      49. SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)
      50. End Sub
      51. End Class


      Würd mich freuen wenn dies für den ein oder anderen interessant ist ^,^

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

      Nun nur noch eine kurze Erklärung:

      Da ich nicht wusste ob/wie es möglich ist einem Thread beim starten parameter zu übergeben, gibt es die SetFading-Funktion
      Mit ihr setzt man die Werte die mit "StartFading" benutzt werden sollen
      Wer die Werte von "SetFading" ändern möchte:

      Parameter #1: (Double) NewAlpha
      Der neue Alpha Wert der erreicht werden soll (Zwischen 0.0 und 1.0)

      Parameter #2: (Int) LoopI
      Die Anzahl von Loop-Runden

      Parameter #3: (Int) SleepI
      Die Sleep-Zeit pro Runde

      Anhand von LoopI und SleepI kann man festsetzen wie lange das Fading dauern soll