Form nach minimieren nicht mehr zu öffnen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von Westerwälder.

    Form nach minimieren nicht mehr zu öffnen

    Guten Morgen,

    arbeite mit einem neuen HDMI-Monitor. DPI-Scalierung nicht aktiviert.
    Meine Forms werden nicht in der Taskleiste angezeigt.

    Mit dem alten Monitor war es so, dass wenn die Form minimiert wurde, sie unten links im Monitor (ein Stück über der Taskleiste) minimiert sichtbar war, und wieder maximiert werden konnte.
    Dies ist nun nicht mehr der Fall (auch wenn ich die Taskleiste ausblende). Kann sie nur noch mit dem Task-Manager wieder in den Vordergrund holen.
    Gruß Markus
    @Westerwälder OK.
    Ist das ein Tipp oder was ist das Problem?
    Die MainForm solltest Du schon in der Taskbar anzeigen.
    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!
    Kommst Du mit Alt+Tab bzw Windowstaste+Pfeiltasten alternativ ans Form?
    Ggf. musst Du zu Debuggingzwecken mal die Fensterkoordinaten ermitteln. Vielleicht liegen die im negativen Bereich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ist schon ein Problem, da ich die Form nicht wieder sichtbar machen kann.
    Die MainForm kann nicht minimiert werden.

    Mit Alt+Tab erscheint die Form wieder in ihrer ursprünglichen Grösse.
    Sehe ich mehr als Notlösung, da anders gewohnt.

    Im minimierten Zustand hat sie einen Top-Wert von 2.110.
    Denke hier liegt das Problem.
    Gruß Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Westerwälder“ ()

    @Westerwälder Wenn das eine nicht modale Form ist, kannst Du auf der MainForm einen Show()-Button dafür anlegen.
    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!
    Danke Rod,

    denke das wird nicht funktionieren.
    Öffne fast alle Formen nach dem gleichen Schema.

    VB.NET-Quellcode

    1. Private Sub TS_Internet_Click(sender As Object, e As EventArgs) Handles TS_Internet.Click
    2. If Halt Then Exit Sub
    3. If Internetbrowser.Visible Then Exit Sub
    4. Dim NeueForm As Form = Internetbrowser
    5. NeueForm.Opacity = 0
    6. NeueForm.Show()
    7. End Sub


    Behelfe mich vorab mit .MinimizeBox = False

    Die Frage die bleibt, warum zeigt der grössere Monitor die minimierte Form nicht mehr an?
    Gruß Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Westerwälder“ ()

    Opacity=0 ist so gewollt.

    Im Load der neuen Form werden erst die userspezifischen Einstellungen (Schrift, Schriftgrösse usw.) und andere datenrelevanten Sachen für die Form erledigt.
    Ist dies erledigt, gibt es ein Opacity=1. Dadurch vermeide ich ein Blitzen, was bei Visible False/True auftritt.
    Gruß Markus

    Westerwälder schrieb:

    Im Load der neuen Form
    ist die Form eh nicht sichtbar.
    Und dann dies:

    VB.NET-Quellcode

    1. Dim NeueForm As Internetbrowser
    2. Private Sub TS_Internet_Click(sender As Object, e As EventArgs) Handles TS_Internet.Click
    3. 'If Halt Then Exit Sub
    4. 'If NeueForm.Visible Then Exit Sub
    5. NeueForm = New Internetbrowser() ' oder wie die Klasse heißt
    6. 'NeueForm.Opacity = 0
    7. NeueForm.Show()
    8. End Sub
    Wie das richtig mit den nicht modalen Dialogen gemacht wird, steht hier: im zweiten Spoiler
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    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!
    Dies hier wäre auch eine Alternative:

    VB.NET-Quellcode

    1. Private Sub Internetbrowser_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged
    2. If Me.WindowState = FormWindowState.Minimized Then
    3. Me.ShowInTaskbar = True
    4. Else
    5. Me.ShowInTaskbar = False
    6. End If
    7. End Sub


    Meine NeueForm wird durch eine Klasse auf die Schrift und Grösse eingestellt.
    Kenne mich damit nicht aus.
    Könnte man in dieser Klasse oder einem Modul, nicht einen Eventhandler für oben gezeigtes SizeChanged-Event erzeugen?
    Anderfalls muss ich dies in ca. 50 Formen manuell erledigen.
    Gruß Markus

    Westerwälder schrieb:

    Anderfalls muss ich dies in ca. 50 Formen manuell erledigen.
    Schieb da eine gemeinsame Basisklasse zwischen, in der alles Gemeinsame gehandelt wird:
    BaseClass

    VB.NET-Quellcode

    1. Public Class FormBase
    2. Inherits System.Windows.Forms.Form
    3. Protected Overrides Sub OnSizeChanged(e As EventArgs)
    4. MyBase.OnSizeChanged(e)
    5. Me.ShowInTaskbar = (Me.WindowState = FormWindowState.Minimized)
    6. End Sub
    7. End Class
    abgeleitete Klasse

    VB.NET-Quellcode

    1. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    2. Partial Class Form1
    3. Inherits FormBase ' ################# der hier
    4. 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
    5. <System.Diagnostics.DebuggerNonUserCode()> _
    6. Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    7. Try
    8. If disposing AndAlso components IsNot Nothing Then
    9. components.Dispose()
    10. End If
    11. Finally
    12. MyBase.Dispose(disposing)
    13. End Try
    14. End Sub
    15. 'Wird vom Windows Form-Designer benötigt.
    16. Private components As System.ComponentModel.IContainer
    17. 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
    18. 'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
    19. 'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
    20. <System.Diagnostics.DebuggerStepThrough()> _
    21. Private Sub InitializeComponent()
    22. components = New System.ComponentModel.Container()
    23. Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    24. Me.Text = "Form1"
    25. End Sub
    26. End Class

    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!
    Irgendwas will nicht.

    VB.NET-Quellcode

    1. Public Class FormBase
    2. Inherits System.Windows.Forms.Form
    3. Protected Overrides Sub OnSizeChanged(e As EventArgs)
    4. MyBase.OnSizeChanged(e)
    5. Me.ShowInTaskbar = (Me.WindowState = FormWindowState.Minimized)
    6. End Sub
    7. End Class
    Bilder
    • FormBase.png

      436,33 kB, 3.840×2.160, 58 mal angesehen
    Gruß Markus
    Das liegt daran, dass Du noch ne Form1.Designer.vb hast, in der ähnliches drinne steht. Das aus Post#11 muss alles in leere Codedateien rein.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Westerwälder Sorry, das war wohl verwirrend.
    Aus

    VB.NET-Quellcode

    1. Partial Class Form1
    2. Inherits System.Windows.Forms.Form
    machst Du

    VB.NET-Quellcode

    1. Partial Class Form1
    2. Inherits FormBase

    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!
    @Westerwälder Sieh Dir mal das hier an:
    TestBaseClass.zip
    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!
    Guten Morgen Rod.
    Danke für deine Mühe.

    Denke warum es bei mir nicht geht, ist die Tatsache das

    VB.NET-Quellcode

    1. If frm2.WindowState = FormWindowState.Minimized Then
    2. frm2.WindowState = FormWindowState.Normal
    3. End If

    fehlt.
    Dann müsste ich es ja doch 50 mal ergänzen.
    Gruß Markus
    Wenn es Teil der BaseClass ist, von der alle erben, nicht.
    Spekulatius: in der BaseClass müsste es dann wohl heißen:

    VB.NET-Quellcode

    1. If Me.WindowState = FormWindowState.Minimized Then Me.WindowState = FormWindowState.Normal


    ##########

    Vielleicht sagt Dir diese minimale Erweiterung von RfGs Vorschlag mehr zu:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. frm2.GetValidFormInstance.ToggleView(Me)
    3. End Sub
    4. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    5. frm3.GetValidFormInstance.ToggleView(Me)
    6. End Sub
    7. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    8. frm4.GetValidFormInstance.ToggleView(Me)
    9. End Sub

    VB.NET-Quellcode

    1. Public Class FormBase : Inherits Form
    2. Protected Overrides Sub OnSizeChanged(e As EventArgs)
    3. MyBase.OnSizeChanged(e)
    4. Me.ShowInTaskbar = (Me.WindowState = FormWindowState.Minimized)
    5. End Sub
    6. Public Sub New()
    7. Me.ShowInTaskbar = False
    8. End Sub
    9. Public Sub ToggleView(ParentForm As Form)
    10. If Not Visible Then Show(ParentForm)
    11. If WindowState = FormWindowState.Minimized Then WindowState = FormWindowState.Normal
    12. End Sub
    13. End Class
    14. Public Module Extensions
    15. <Runtime.CompilerServices.Extension> Public Function GetValidFormInstance(Of T As {New, FormBase})(Form As T) As T
    16. If Form Is Nothing OrElse Form.IsDisposed Then Form = New T
    17. Return Form
    18. End Function
    19. End Module

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Ok, es sieht wohl so aus, dass es nicht ohne grössere Änderungen gehen wird.
    In Rod's Vorschlag wird schon anders deklariert:

    VB.NET-Quellcode

    1. Private WithEvents frm2 As Form2
    2. Private WithEvents frm3 As Form3
    3. Private WithEvents frm4 As Form4

    Wenn ich mir nun die Arbeit mache, sollte es so werden, dass ich in dieser neuen Variante auch die DPI-Scalierung für HDMI-Monitore mit rein bekomme.
    Dazu gab es hier einen seperaten Beitrag.

    DPI Form anpassen
    Gruß Markus
    Irgendwie will das bei mir nicht.

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Class BasisForm : Inherits Form
    4. Private WithEvents Frm1 As Internetbrowser
    5. Private WithEvents Frm2 As KombiKalender
    6. Public Sub New()
    7. Me.ShowInTaskbar = True
    8. End Sub
    9. Protected Overrides Sub OnSizeChanged(e As EventArgs)
    10. MyBase.OnSizeChanged(e)
    11. Me.ShowInTaskbar = (Me.WindowState = FormWindowState.Minimized)
    12. End Sub
    13. Public Sub Oeffnen(ByVal Nummer As Integer)
    14. If Nummer = 0 Then Exit Sub
    15. Try
    16. If Nummer = 1 Then
    17. If Frm1 Is Nothing OrElse Frm1.IsDisposed Then
    18. Frm1 = New Internetbrowser
    19. End If
    20. If Not Frm1.Visible Then
    21. Frm1.Show(Me)
    22. End If
    23. If Frm1.WindowState = FormWindowState.Minimized Then
    24. Frm1.WindowState = FormWindowState.Normal
    25. End If
    26. End If
    27. If Nummer = 2 Then
    28. If Frm2 Is Nothing OrElse Frm2.IsDisposed Then
    29. Frm2 = New KombiKalender
    30. End If
    31. If Not Frm2.Visible Then
    32. Frm2.Show(Me)
    33. End If
    34. If Frm2.WindowState = FormWindowState.Minimized Then
    35. Frm2.WindowState = FormWindowState.Normal
    36. End If
    37. End If
    38. Catch ex As Exception
    39. MsgBox(ex.Message)
    40. End Try
    41. End Sub


    VB.NET-Quellcode

    1. Private Sub TS_Internet_Click(sender As Object, e As EventArgs) Handles TS_Internet.Click
    2. If Halt Then Exit Sub
    3. 'If Internetbrowser.Visible Then Exit Sub
    4. 'Dim NeueForm As Form = Internetbrowser
    5. 'NeueForm.Opacity = 0
    6. 'NeueForm.Show()
    7. BasisForm.Oeffnen(1)
    8. End Sub
    Gruß Markus