Forms blinken beim Formwechsel

  • VB.NET

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

    Forms blinken beim Formwechsel

    Hi Leute, gerade hier angemeldet, also seid mir bitte nicht böse falls das doch zu den Grundlagen gehören sollte, denn für mich ist das schon Spezialwissen ^^

    Es geht darum, dass ich gerade dabei bin ein Spiel zu erstellen. Das Spiel soll nicht aufwendig sein, sondern eher eine .exe Version eines Browserspieles.

    Das Problem ist folgendes: Ich benötige ja, um die Übersicht zwischen den einzelnen Menüs zu behalten mehrere Forms (Anders könnte man es auch mit einer Form lösen, bei der man die ungenützten Buttons und Co visible=false und die benötigten true setzt, jedoch verliert man hier bei großen Programmen wie gesagt die Übersicht während des Programmierens.). Bisher habe ich also meine Anwendung mit Hilfe mehrerer Forms gelöst und auf den jeweiligen Forms die benötigten Buttons&Co gesetzt. Anschließend habe ich diese mit (nur ein Button- Click - Beispiel)

    VB.NET-Quellcode

    1. Private Sub BtnNeuesSpiel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnNeuesSpiel.Click
    2. GroesseUndPosition.Speichern(Me)
    3. FrmNew.Show()
    4. GroesseUndPosition.Laden(FrmNew)
    5. Me.Close()
    6. End Sub



    verknüpft. Wobei

    1) die .Speichern Funktion die Größe und Position der derzeitig geöffneten Form in den Settings speichert (siehe Anhang: Bild)
    2) dann die neue Form geöffnet wird
    3) anschließend die neue Form die gespeicherte Größe und Position (der Form) zugewiesen bekommt
    4) und zu guter Letzt die alte Form geschlossen wird.

    Nun mein Problem: Egal wie ichs drehe und wende. Wenn ich das Closing Event durch ein Hide Event ersetze, wirds auch nicht besser. Beim schnellen hinundherschalten der alten und neuen Form blinkt die alte Form kurz durch die neue durch und auch der Form-rand wird kurz durchsichtig. Zusätzlich wird bei eingeschaltetem Windows Aero Stil, beim Me.Close Event das Fenster in die linke untere Bildschirmecke minimiert und dann erst geschlossen.

    Jetzt meine Fragen: Gibt es eine andere Möglichkeit zwischen Forms zu wechseln? Gibt es eine andere Möglichkeit die Übersicht zu behalten, als Forms? Sind Forms für soetwas überhaupt die beste Lösung?

    Habe nirgendswo eine gute Lösung entdecken können, da ich nicht wusste, nach welchem Begriff ich suchen sollte, außer den mir bekannten Forms.

    (Falls ihr noch Zeit habt, würde ich auch noch gerne wissen, wie man in, in diesem Thread eingebundenen Code- Snippets Absätze einfügt. ^^)

    Danke im Vorraus, mfg der Escore!
    Bilder
    • SettingsUndStartScreen.gif

      335,18 kB, 1.920×1.080, 144 mal angesehen

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

    Hallo und willkommen im Forum.
    Erst mal: Bitte VB Tags benutzen - was ist damit gemeint?
    So kann man nichts lesen :)

    Also Forms (oder allgemeiner Programm-Fenster) sind ja eher nicht dazu gedacht, schnell geöffnet und geschlossen zu werden.
    Um Spiele zu programmieren bedient man sich normalerweise entweder GDI+, um einfache Sachen zu machen (wenn man im 2D Bereich bleibt), oder XNA (Oder wenn man ganz gut gelaunt ist DirectX), um aufwändige 2D und 3D Sachen zu rendern.

    Ich gehe jetzt mal kurz auf GDI ein, da ich mich mit XNA selbst nicht auskenne und GDI für Deinen Kenntnisstand ausreichend sein müsste.
    Mit nimmst Du vom Prinzip her nur die Tastatureingaben und die Mausposition (Und Mausklicks) als Eingabe.
    Die Ausgabe geschieht dann nicht über Controls, sondern über das Zeichnen auf die Form.
    Dadurch hat man keine "unnötigen Controls, die man ausblendet", sondern überlegt sich ein geschicktes Datenmodell, mit dem man bequem arbeiten kann.

    Ein Pseudobeispiel:
    Um einen Button zu realisieren hast Du eine Klasse, die zwei Schnittstellen implementiert: IClickable und IDrawable
    Die IDrawable Schnittstelle wird verwendet, um den Button auf den Bildschirm zeichnen zu können. Die IClickable Schnittstelle wird verwendet, um beim Klicken auf die Form reagieren zu können.
    Lies Dir am besten das GDI+ -Tutorial von jemandem hier im Forum durch. Dann verstehst Du besser, was hier mit Graphics und Paint gemeint ist.

    VB.NET-Quellcode

    1. Interface IClickable
    2. 'Weist das Objekt an, zu überprüfen, ob die angegebene Position auf dem Objekt liegt und nötige Events auszulösen.
    3. 'Gibt True zurück, wenn es ein Treffer war, andernfalls False.
    4. Function TryClick(Location As Point) As Boolean
    5. End Interface
    6. Interface IDrawable
    7. 'Weist das Objekt an, sich auf das angegebene Graphics-Objekt zu zeichnen.
    8. Sub DrawToGraphics(g As Graphics)
    9. End Interface
    10. Dim AllDrawables As New List(Of IDrawable)
    11. Dim AllClickables As New List(Of IClickable)
    12. Sub HandleMouseDown(sender As Object, e As MouseEventArgs) Handles ...
    13. For Each i In AllClickables
    14. If i.TryHit(e.Location) Then
    15. Exit For
    16. End If
    17. Next
    18. End Sub
    19. Sub PaintStuff(sender As Object, e As PaintEventArgs) Handles ...
    20. For Each i In AllDrawables
    21. i.DrawToGraphics(e.Graphics)
    22. Next
    23. End Sub

    Eine mögliche Button-Klasse wäre dann:

    VB.NET-Quellcode

    1. Class Button
    2. Implements IDrawable
    3. Implements IClickable
    4. Public Event Click
    5. 'Properties, die die Größe und Position angeben. Z.B:
    6. Public Property Bounds As Rectangle
    7. 'Properties wie Text, Font, etc.
    8. Public Function TryHit(Location As Point) As Boolean Implements IClickable.TryHit
    9. If Bounds.Contains(Location) Then
    10. RaiseEvent Click()
    11. Return True 'Ja, ginge schöner
    12. Else
    13. Return False
    14. End If
    15. End Function
    16. Public Sub DrawToGraphics(g As Graphics) Implements IDrawable.DrawToGraphics
    17. g.FillRectangle(Brushes.DarkRed, Bounds)
    18. g.DrawString(Text, Font, Bounds.X, Bounds.Y)
    19. End Sub
    20. End Class


    Um auch schöne Hover-Effekte zu erhalten, kannst Du die IClickable-Schnittstelle erweitern und eine MouseMove, MouseEnter und MouseLeave Methode einbauen, die dem Objekt sagt, "aha, jetzt ist die Maus über mir, jetzt muss ich mich heller zeichnen".

    Um nicht immer alle Buttons selbst erstellen zu müssen (was dann wieder stark an das Forms-Konzept erinnert, kannst Du Dir eine Screen-Klasse basteln, die die Liste an zeichenbaren und klickbaren Objekten selbst verwaltet. So musst Du nur z.B. CurrentScreen = New MainMenuScreen schreiben, und schon bist Du im Hauptmenü.


    Es ist zugegebenermaßen nicht ganz einfach, von Anfang an so objektorientiert wie möglich zu arbeiten, aber das kommt mit der Zeit.
    Lies Dich erst mal in GDI+ ein.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hey, danke für deine ausführliche Antwort!

    Hab gehofft es gibt eine einfachere Variante mit Verwendung der Forms,
    so dass ich die nacheinander aufgerufenen "Fenster" auch direkt visuell betrachten kann,
    aber dann muss ich wohl die Buttons&Co Selber coden..

    Ich denke mal dass sollte mir bei meiner beliebtesten Suchmaschine zu einigen Schlagwörtern weiterhelfen. Danke! :)

    Falls noch jemand nen Vorschlag hat, ich lasse den Beitrag noch 2-3 Tage als unerledigt stehen.

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

    Wenn Du es wirklich mit Forms machen willst, kann ich Dir noch einen Tipp geben:

    Du kannst alle Buttons, die zusammen gehören, in ein Panel packen, und das Panel ein- bzw. ausblenden. So kannst Du z.B. Menüs machen (ähnlich wie die Screen-Klasse im Beispiel).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils