ein fenster seitlich aus und einfahren

    • VB.NET

    Es gibt 43 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

      ein fenster seitlich aus und einfahren

      hallo,

      hier ein codebeispiel, wie man ein ein- und ausfahrendes fenster realisieren kann.
      das ein - bzw. ausfahren hab ich in einen eigenen thread gepackt, um ein hängen der anwendung zu verhindern.

      VB.NET-Quellcode

      1. Imports System.ComponentModel
      2. Public Class Form1
      3. Private f As New Form
      4. Private WithEvents bgw As New BackgroundWorker
      5. Private ausfahren As Boolean = True
      6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      7. bgw.RunWorkerAsync(ausfahren)
      8. If ausfahren = True Then ausfahren = False Else ausfahren = True
      9. End Sub
      10. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
      11. 'bgw stoppen falls während des aus oder einfahrens die anwendung geschlossen wird
      12. If bgw.IsBusy = True Then
      13. bgw.CancelAsync()
      14. End If
      15. End Sub
      16. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      17. 'borderstyle setzen
      18. f.FormBorderStyle = Windows.Forms.FormBorderStyle.None
      19. 'backgroundworker einrichten
      20. bgw.WorkerReportsProgress = True
      21. bgw.WorkerSupportsCancellation = True
      22. 'fenster einrichten
      23. f.Show()
      24. f.Size = New Size(0, Me.Height)
      25. f.Location = New Point(Me.Right, Me.Top)
      26. End Sub
      27. Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
      28. 'fester mitbewegen
      29. f.Location = New Point(Me.Right, Me.Top)
      30. End Sub
      31. Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
      32. 'ein und ausfahrbewegung
      33. Select Case e.Argument
      34. Case True
      35. For i As Integer = 0 To 100
      36. 'aktuelle position ausgeben
      37. bgw.ReportProgress(i, i)
      38. 'warten, damit es auf allen cpu gleichschnell läuft
      39. Threading.Thread.Sleep(20)
      40. Next
      41. Case False
      42. For i As Integer = 100 To 0 Step -1
      43. 'aktuelle position ausgeben
      44. bgw.ReportProgress(i, i)
      45. 'warten, damit es auf allen cpu gleichschnell läuft
      46. Threading.Thread.Sleep(20)
      47. Next
      48. End Select
      49. End Sub
      50. Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
      51. 'neue größe an das fenster weitergeben
      52. f.Size = New Size(e.UserState, Me.Height)
      53. End Sub
      54. End Class

      kommentare erwünscht

      gruss

      mikeb69
      Ist wirklich klasse :), nur 2 kleine Dinge noch:

      1. damit sich beim Ändern der Größe von Form1 auch das ausfahrbare Formblatt verändert, kann man das noch dazu setzen:

      VB.NET-Quellcode

      1. Private Sub Form1_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
      2. f.Location = New Point(Me.Right, Me.Top)
      3. f.Height = Me.Height
      4. End Sub

      und in der Form1_Load Sub könnte man das noch einfügen:

      VB.NET-Quellcode

      1. f.ShowInTaskbar = False

      2. Wenn man zwischendurch ein anderes Fenster in den Vorderfrund holt und danach wieder das eigene Programmfenster, ist die ausfahrbare Form natürlich unter dem anderen Fenster. Wie kann ich den z-Index vom ausfahrbaren Fenster dann wieder auf den vom Hauptfenster ±1 setzen? Ich habe es mit dem Activated-Event versucht, das funktioniert aber nicht wirklich gut und ist ziemlich unsauber.

      Viele Grüße

      KillerVirus
      hallo killervirus,

      an sich kannst du ein fenster mit

      VB.NET-Quellcode

      1. Me.BringToFront()

      in der z-order ganz nach oben bringen.

      wenn wir aber den vorliegenden code hernehmen, würde ein

      VB.NET-Quellcode

      1. f.Show(Me)

      im Form_Load schon reichen

      nachtrag:
      wenn ich hier einen code poste ist das nie ein fertiges programm - eher ein gerüst
      dieses muss natürlich entsprechend ausgebaut und angepasst werden.

      aber - danke für deinen hinweis

      gruss

      mikeb69
      Hallo,

      danke für deine Hilfe, das habe ich gesucht =)

      mikeb69 schrieb:

      nachtrag:
      wenn ich hier einen code poste ist das nie ein fertiges programm - eher ein gerüst
      dieses muss natürlich entsprechend ausgebaut und angepasst werden.
      Das ist mir klar, dennoch wollte ich es erwähnen, da es mir wichtig erschien.

      Viele Grüße

      KillerVirus
      Mmh also bei mir gehts nicht...


      Hier:

      VB.NET-Quellcode

      1. 'ein und ausfahrbewegung
      2. Select Case e.Argument
      3. Case True
      4. For i As Integer = 0 To 100
      5. 'aktuelle position ausgeben
      6. bgw.ReportProgress(i, i)
      7. 'warten, damit es auf allen cpu gleichschnell läuft
      8. Threading.Thread.Sleep(20)
      9. Next
      10. Case Is False
      11. For i As Integer = 100 To 0 Step -1
      12. 'aktuelle position ausgeben
      13. bgw.ReportProgress(i, i)
      14. 'warten, damit es auf allen cpu gleichschnell läuft
      15. Threading.Thread.Sleep(20)
      16. Next


      Bekomm ich n error (bei den Case True und Case False)

      Fehler 1 "Option Strict On" lässt Operanden des Typs "Object" für den =-Operator nicht zu. Verwenden Sie den Is-Operator, wenn Sie die Objektidentität testen möchten. C:\Users\Florian\Documents\Visual Studio 2008\Projects\CCCrypt\CCCrypt\Form1.vb 273 18 CCCrypt
      Fehler 2 "Option Strict On" lässt Operanden des Typs "Object" für den =-Operator nicht zu. Verwenden Sie den Is-Operator, wenn Sie die Objektidentität testen möchten. C:\Users\Florian\Documents\Visual Studio 2008\Projects\CCCrypt\CCCrypt\Form1.vb 280 18 CCCrypt

      "Is" weg und e.Argument von Typ Object in Boolean casten:

      VB.NET-Quellcode

      1. Private Sub bgw_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
      2. Select Case CBool(e.Argument)
      3. Case True
      4. For i As Integer = 0 To 100
      5. 'aktuelle position ausgeben
      6. bgw.ReportProgress(i, i)
      7. 'warten, damit es auf allen cpu gleichschnell läuft
      8. Threading.Thread.Sleep(20)
      9. Next
      10. Case False
      11. For i As Integer = 100 To 0 Step -1
      12. 'aktuelle position ausgeben
      13. bgw.ReportProgress(i, i)
      14. 'warten, damit es auf allen cpu gleichschnell läuft
      15. Threading.Thread.Sleep(20)
      16. Next
      17. End Select
      18. End Sub
      Hallo zusammen,

      erstmal ein herzliches Danke an mikeb69, der Code funktioniert super!

      Bei folgendem Abschnitt habe ich allerdings etwas Schwierigkeiten:

      Quellcode

      1. Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
      2. 'neue größe an das fenster weitergeben
      3. f.Size = New Size(e.UserState, Me.Height)
      4. End Sub


      um genau zu sein in der Zeile

      Quellcode

      1. f.Size = New Size(e.UserState, Me.Height)


      Mit dieser Zeile wird die Größe des sich hervorschiebenden Fensters definiert. In diesem Fall
      richtet sich die Höhe des Fensters nach der Höhe der "Me".

      Ich möchte allerdings die Größe des ausfahrenden Fensters bestimmen können.
      Mit einem einfachen Size Code anstelle des Me.Height bekomme ich aber eine Fehlermeldung.

      Wenn ich f.Size = New Size(e.UserState, Me.Height) herausnehme und stattdessen

      Form3.Height = 270
      Form3.Width = 300

      verwende, bekomme ich zwar das gewünschte Fenster in der gewünschten Größe, es fährt aber nicht mehr
      heraus sondern erscheint sofort komplett.

      Außerdem habe ich noch eine weitere Frage:

      wie erhöht man die Aus- und Einfahrgeschwindigkeit des Fensters?

      Danke im Voraus
      Gruß
      Manuel
      1.

      e.UserState ist ein Prozentwert (wieviel Prozent ausgefahren , 0..100)
      Den kann man multiplizieren, um bei e.UserState = 100 die volle Größe zu haben

      2.

      Den Wert bei Threading.Thread.Sleep verändern bzw. die Schrittweite, indem In den For-Schleifen die 100 ersetzt wird.
      ACHTUNG: Wenn 100 verändert wird, dann wird auch e.UserState sich verändern.
      Wenn ich statt "f.FormBorderStyle = Windows.Forms.FormBorderStyle.None" sowas hier benutze: "
      f.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle", dann sieht man die 2. Form sofort nach dem Start und es fährt auch nicht mehr ein wenn ich den Button drücke? Erst wenn ich es wieder auf "none" setzte geht es wieder richtig
      also ich schreib hier jetzt keinen ganzen Code
      aber das sollte dir weiterhelfen (es bezieht sich auf den vorhandenen Code von mike)

      VB.NET-Quellcode

      1. f.Size = New Size(e.UserState, Me.Height)
      2. f.Left -= 1
      Könnte mir wer helfen damit die Form nach links ausfährt??
      Klappt bei mir nämlich ned
      Ich hab den Code so umgeschrieben:

      VB.NET-Quellcode

      1. Imports System.ComponentModel
      2. Public Class Form1
      3. Private f As New Form
      4. Private WithEvents bgw As New BackgroundWorker
      5. Private ausfahren As Boolean = True
      6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      7. bgw.RunWorkerAsync(ausfahren)
      8. If ausfahren = True Then ausfahren = False Else ausfahren = True
      9. End Sub
      10. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
      11. 'bgw stoppen falls während des aus oder einfahrens die anwendung geschlossen wird
      12. If bgw.IsBusy = True Then
      13. bgw.CancelAsync()
      14. End If
      15. End Sub
      16. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      17. 'borderstyle setzen
      18. f.FormBorderStyle = Windows.Forms.FormBorderStyle.None
      19. 'backgroundworker einrichten
      20. bgw.WorkerReportsProgress = True
      21. bgw.WorkerSupportsCancellation = True
      22. 'fenster einrichten
      23. f.Show()
      24. f.Size = New Size(0, Me.Height)
      25. f.Location = New Point(Me.Left, Me.Top)
      26. End Sub
      27. Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
      28. 'fester mitbewegen
      29. f.Location = New Point(Me.Left, Me.Top)
      30. End Sub
      31. Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
      32. 'ein und ausfahrbewegung
      33. Select Case e.Argument
      34. Case True
      35. For i As Integer = 0 To 100
      36. 'aktuelle position ausgeben
      37. bgw.ReportProgress(i, i)
      38. 'warten, damit es auf allen cpu gleichschnell läuft
      39. Threading.Thread.Sleep(20)
      40. Next
      41. Case False
      42. For i As Integer = 100 To 0 Step -1
      43. 'aktuelle position ausgeben
      44. bgw.ReportProgress(i, i)
      45. 'warten, damit es auf allen cpu gleichschnell läuft
      46. Threading.Thread.Sleep(20)
      47. Next
      48. End Select
      49. End Sub
      50. Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
      51. 'neue größe an das fenster weitergeben
      52. f.Size = New Size(e.UserState, Me.Height)
      53. f.left-=1
      54. End Sub
      55. End Class


      Könnte mir wer bitte sagen wo noch was verändert werden muss?
      danke im voraus
      mfg Mike

      NscMike schrieb:

      ne klappt irgendwie nicht...
      trotzdem danke
      sonst wer nen vorschlag?
      Hallo,

      ändere mal deine 2 Events folgendermaßen um:

      VB.NET-Quellcode

      1. Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
      2. 'neue größe an das fenster weitergeben
      3. f.Size = New Size(e.UserState, Me.Height)
      4. If ausfahren Then
      5. f.Left += 1
      6. Else
      7. f.Left -= 1
      8. End If
      9. End Sub
      10. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      11. bgw.RunWorkerAsync(ausfahren)
      12. ausfahren = Not ausfahren ' zur Vereinfachung ;)
      13. End Sub



      So sollte es jedenfalls klappen, falls nicht, sag Bescheid.

      MfG, spaXi