Borderless Form in Tray minimieren und wieder anzeigen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    Borderless Form in Tray minimieren und wieder anzeigen

    Hallo,

    ich erstelle mir gerade ein neues Programm und möchte dieses ohne den normalen Rand haben. Dazu habe ich den Borderstyle der Form auf None gesetzt.

    Ebenso verwende ich ein Notifyicon um es im Tray anzuzeigen. Mein Problem ist jetzt, dass die Form immer kleiner wird, nachdem ich sie wieder aus dem Tray aufrufe.

    Mein Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Me.Close()
    3. End Sub
    4. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    5. Me.WindowState = FormWindowState.Minimized
    6. End Sub
    7. Private Sub NotifyIcon1_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NotifyIcon1.DoubleClick
    8. Me.WindowState = FormWindowState.Normal
    9. End Sub
    10. Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize
    11. Select Case Me.WindowState 'derzeitigen Fensterstatus abfragen
    12. Case FormWindowState.Minimized 'Wenn minimiert
    13. Me.NotifyIcon1.Visible = True 'Icon sichtbar machen
    14. Me.NotifyIcon1.ShowBalloonTip(2000)
    15. Me.ShowInTaskbar = False 'Programm aus Task-Leiste entfernen
    16. Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle 'Formrahmen abändern um es in ALT+TAB unsichtbar zu machen
    17. Case FormWindowState.Normal 'Wenn normal
    18. Me.NotifyIcon1.Visible = False 'Icon ausblenden
    19. Me.ShowInTaskbar = True 'In der Task-leiste wieder anzeigen
    20. Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None 'Formrahmen abändern um es wieder mit ALT+TAB sichtbar zu machen
    21. End Select
    22. End Sub


    Das Problem hängt wohl damit zusammen, dass FormBorderstyle.None irgendetwas ändert, so dass das mit dem Minimieren nicht mehr richtig funktioniert. Kann das leider nicht so genau beschreiben, weil mir dazu das Fachwissen fehlt. Angeblich soll jedoch der folgende Snippet das Problem beseitigen, nur habe ich keine Ahnung, wie ich das einbinden sollte.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Protected Overrides ReadOnly Property CreateParams() As CreateParams
    2. Get
    3. Dim cp As CreateParams = MyBase.CreateParams
    4. Const WS_SYSMENU As Int32 = &H80000
    5. Const WS_MAXIMIZEBOX As Int32 = &H10000
    6. Const WS_MINIMIZEBOX As Int32 = &H20000
    7. cp.Style = cp.Style Or WS_SYSMENU Or WS_MINIMIZEBOX
    8. cp.Style = cp.Style And Not WS_MAXIMIZEBOX
    9. Return cp
    10. End Get
    11. End Property


    Mein Wunsch ist eine randlose Form, der ich je einen Button zum Schließen und Minimieren manuell hinzufüge. Die Form soll eine feste, nicht veränderliche Größe haben. Des Weiteren möchte ich das Programm mittels Notifyicon in den Traybereich minimieren und beim Doppelklick auf das Icon soll die Form in gleicher Größer etc. wieder angezeigt werden.

    Ich hoffe ihr versteht meine Problematik und habt eine Idee/Lösung, wie ich das mit meinem Anforderungen umsetzten könnte. Danke!

    rdmguy schrieb:

    nicht mehr richtig funktioniert
    Gib Dir mal Me.Size und Me.ClientSize vor und nach dem Minimieren aus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Programm gestartet, in den Tray minimiert, aus dem Tray geholt, Programm geschlossen. Folgende Ausgabe:
    Spoiler anzeigen
    Me.Size: {Width=529, Height=713}
    Me.ClientSize: {Width=513, Height=674}


    Me.Size: {Width=513, Height=674}
    Me.ClientSize: {Width=513, Height=674}

    Me.Size: {Width=497, Height=635}
    Me.ClientSize: {Width=497, Height=635}

    Me.Size: {Width=497, Height=635}
    Me.ClientSize: {Width=497, Height=635}

    Me.Size: {Width=160, Height=28}
    Me.ClientSize: {Width=0, Height=0}


    Me.Size: {Width=497, Height=635}
    Me.ClientSize: {Width=497, Height=635}

    Me.Size: {Width=481, Height=596}
    Me.ClientSize: {Width=481, Height=596}

    Me.Size: {Width=481, Height=596}
    Me.ClientSize: {Width=481, Height=596}


    Die Stellen wo Me.Size von Me.ClientSize abweicht habe ich mal rot markiert. Das erste wird bei Laden der Form sein, das zweite beim Minimieren in den Tray.
    Die Form wird halt immer kleiner, dass habe ich auch optisch schon gesehen. Also 2 mal auf und wieder zu und schon ist die Form nur noch halb so groß.
    Was ich darüber hinaus an den Werten erkenn kann weiß ich nicht.
    Also ich mache es bei mir so, das ich der form ihre maße fest einstelle, das notifyicon richte ich auch im designer ein. Dann im Click event des notify 1 zeile Code

    VB.NET-Quellcode

    1. ​If frmMain.Visible Then frmMain.Visible = False Else frmMain.Visible = true

    und hab damit keine Probleme... Meine Form ist immer gleich gross
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    1 zeile Code

    VB.NET-Quellcode

    1. frmMain.Visible = Not frmMain.Visible
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!