Form mit Borderstyle - None Größe anpassen

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    Form mit Borderstyle - None Größe anpassen

    Schönen Vormittag,
    ich habe eine Form mit dem Borderstyle = None um sie möglichst komplett selbst zu gestalten. Ich möchte aber auch die Größe ändern können, sowie auf sizeable. Dazu habe ich eine dll geschrieben ums gegebenenfalls später erneut zu nutzen. Hab für die 4 Ränder und 4 Ecken Graphicspath gemacht , dann auf MouseDown mit GraphicsPath.IsVisible(MouseLocation) die passenden Flags gesetzt und auf MouseMove dann Cursors angepasst und die Größenänderung selber angepasst. Nun mal zur Frage , es läuft alles soweit gut nur der manche Änderungen machen Probleme z.B. der obere Rand.

    VB.NET-Quellcode

    1. Dim y As Point = Form.Location
    2. If Form.MinimumSize.Height <> Form.Height And e.Location.Y > 0 Then
    3. Form.Location = New Point(Form.Location.X, Form.Location.Y + e.Y)
    4. Form.Height = Form.Height + (y.Y - Form.Location.Y)
    5. ElseIf e.Location.Y < 0 Then
    6. Form.Location = New Point(Form.Location.X, Form.Location.Y + e.Y)
    7. Form.Height = Form.Height + (y.Y - Form.Location.Y)
    8. End If

    Es klappt wenn ich die Größe hier langsam ändere nur wenn ich das ganze schneller mache, Bewegt sixch die Form zuweit nach unten. Findet ihr den Fehler ?

    Gonger96 schrieb:

    VB.NET-Quellcode

    1. Dim y As Point = Form.Location
    Wozu soll dies gut sein?
    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!

    RodFromGermany schrieb:

    Gonger96 schrieb:

    VB.NET-Quellcode

    1. Dim y As Point = Form.Location
    Wozu soll dies gut sein?

    Der aktuelle Punkt wird ausgelesen,dann bewegt sich die Form auf den neuen Punkt und die neue Größe ist die Differenz zwischen alter und neuer location.

    Gonger96 schrieb:

    dann bewegt sich die Form auf den neuen Punkt
    In welchen beiden Routinen passiert dies?
    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!

    Gonger96 schrieb:

    VB.NET-Quellcode

    1. Form.Height = Form.Height + (y.Y - Form.Location.Y)
    Welchen Wert hat diese Differenz: y.Y - Form.Location.Y?
    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!
    Nein, die Differenz ist 0, Null, Zero, weil y.Y und Form.Location.Y identisch sind.
    Oder
    Du hast einige winzige Details nicht gepostet.
    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!

    RodFromGermany schrieb:

    Nein, die Differenz ist 0, Null, Zero, weil y.Y und Form.Location.Y identisch sind.
    Oder
    Du hast einige winzige Details nicht gepostet.

    Nein, Y ist die alte Location danach wird die Form auf der Y-Achse sagen wir 3 px bewegt folglich ist die Differenz 3
    Sieh Dir Deinen 1. Post an, zwischen der Zuweisung Dim y As Point = Form.Location und der Abfrage y.Y - Form.Location.Y kann sich Form.Location nicht verändert haben.
    Deswegen meine Frage nach den 2 Prozeduren und die Bemerkung

    RodFromGermany schrieb:

    Du hast einige winzige Details nicht gepostet.
    Welchen Code muss ich noch in mein Programm schreiben, damit ich Deinen Effekt reproduzieren kann?
    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!
    Ok erstmal Borderstyle auf none stellen, dann das Fehlende

    VB.NET-Quellcode

    1. Public PT As New GraphicsPath
    2. Public BT As Boolean = False
    3. Private Sub Form_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Form.Paint
    4. With PT
    5. .Reset()
    6. .AddRectangle(New Rectangle(New Point(3, 0), New Size(Form.Width - 6, 3)))
    7. .CloseFigure()
    8. End With
    9. End Sub
    10. Private Sub Form_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Form.MouseDown
    11. If PT.IsVisible(e.Location) = True Then BT = True
    12. End Sub
    13. Private Sub Form_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Form.MouseMove
    14. If BT = True Then
    15. Form.Cursor = Cursors.SizeNS
    16. Dim y As Point = Form.Location
    17. If Form.MinimumSize.Height <> Form.Height And e.Location.Y > 0 Then
    18. Form.Location = New Point(Form.Location.X, Form.Location.Y + e.Y)
    19. Form.Height = Form.Height + (y.Y - Form.Location.Y)
    20. ElseIf e.Location.Y < 0 Then
    21. Form.Location = New Point(Form.Location.X, Form.Location.Y + e.Y)
    22. Form.Height = Form.Height + (y.Y - Form.Location.Y)
    23. End If
    24. End If
    25. End Sub
    Wie gesagt das ganze steckt in einer Klasse . Es gibt eine Variable Private WithEvents Form As Control , diese erbt ein Parameter im Konstruktor. So kann ich bei späteren Projeckten das ganze mit einer Zeile Code laufen lassen - Wenns dann fertig ist :) .
    Du hast meine Frage leider nicht verstanden.

    RodFromGermany schrieb:

    Was ist Form :?:
    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!
    Klasse Namensgebung. :thumbdown:
    Form ist die Basisklasse aller WinForms. ;(
    Pack die Eventhandler dort in die Klasse, nicht in eine fremde.

    VB.NET-Quellcode

    1. Private Sub Form_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Form.MouseMove
    2. If BT = True Then
    3. Form.Cursor = Cursors.SizeNS
    4. Dim y As Point = Form.Location '@@@@@@1
    5. If Form.MinimumSize.Height <> Form.Height And e.Location.Y > 0 Then
    6. Form.Location = New Point(Form.Location.X, Form.Location.Y + e.Y)
    7. Form.Height = Form.Height + (y.Y - Form.Location.Y) '@@@@@@2
    8. ElseIf e.Location.Y < 0 Then
    9. Form.Location = New Point(Form.Location.X, Form.Location.Y + e.Y)
    10. Form.Height = Form.Height + (y.Y - Form.Location.Y) '@@@@@@3
    11. End If
    12. End If
    13. End Sub
    Und nun erkläre mir bitte, wie sich ein Wert der Form.Location von '@@@@@@1 bis '@@@@@@2 bzw. '@@@@@@3 geändert haben kann.
    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!
    Die Namensgebung war nicht die Intelligenteste muss ich mal ändern. Alsoho zu Anfang hat die Form sagen wir die LocationY = 10 so danach wird die Form verschoben

    VB.NET-Quellcode

    1. Form.Location = New Point(Form.Location.X, Form.Location.Y + e.Y)
    da wird halt die Mouselocation addiert bzw. subtrahiert. Ist die Mause währenddessen z.B. 3 Px über der Form ist die Yposition der Maus -3 (bezogen auf die Form). Die Folge ist die Formlocationy geht 3 px nach oben.
    OK, überredet, hab ich übersehen.
    Das kannste Dir aber alles sparen und gleich e.Y verwenden, dann kann man es auch ordentlich lesen.
    UInd wenn Du dann noch überall e.Y statt e.Location.Y verwendest, wird langsam ein Schuh draus. :thumbsup:
    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!

    Gonger96 schrieb:

    Ich könnte ebend schnell ein Video machen und das hochladen wenns hilft.
    Heute abend, da hab ich etwas Ruhe.
    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!