Resize einer Form mit FormBorderStyle=None

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

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Resize einer Form mit FormBorderStyle=None

    Hallo Profis

    Ich möchte den LINKEN Rand eines randlosen Fensters mit der linken Maustaste verschieben mit folgendem Code

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim ButtonLeft As Boolean
    3. Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    4. If e.Button = Windows.Forms.MouseButtons.Left Then ButtonLeft = True
    5. End Sub
    6. Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    7. If ButtonLeft Then
    8. Me.SetBounds(Me.Location.X + e.X, Me.Location.Y, Me.Width - e.X, Me.Height)
    9. End If
    10. End Sub
    11. Private Sub Form1_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp
    12. ButtonLeft = False
    13. End Sub
    14. End Class

    Das funktioniert auch, nur - der RECHTE Rand der Form flackert ganz gewaltig, bis zu einem Zentimeter, wenn ich die Maus schnell nach links bewege. Was macht da Windows? Ich zeichne den RECHTEN Rand ja immer am gleichen Ort (ein verschobener linke Rand wird durch die geänderte Fensterbreite kompensiert). Wenn ich die Maus nach RECHTS bewege, bleibt hingegen der rechte Rand wie gewünscht stabil an Ort. Wieso dieser Unterschied? Noch wichtiger aber: Wie kann ich das Geflacker beim Vergrössern des Fensters verhindern?
    Ich hab hier im Forum verschiedene Lösungen angetroffen: Form skalierbar machen (FormBorderStyle=None) & Form umherziehbar machen oder etwa Größenänderung bei Forms mit dem Borderstyle None. Alle leiden an der selben Krankheit wie mein obiger Code. Das sieht sehr unprofessionell aus. Ich hab auch mit

    VB.NET-Quellcode

    1. LockWindowUpdate(Me.Handle)

    etc. experimentiert, erfolglos. Hat jemand noch weitere Ideen? (Zum Austesten einfach eine Form1 mit FormBorderStyle=None erzeugen und obiger Code kopieren.)

    Danke fürs Mitdenken.

    Bernhard
    @Grüter Beschfreib mal, was bei welcher Aktion passieren soll.
    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!

    ichduersie schrieb:

    Hast du die Property DoubleBuffered der Form auf True gesetzt? Dann sollte das flackern aufhören.

    Diesen Tipp hab ich auch schon irgendwo gelesen, bringt aber leider keine Veränderung.

    RodFromGermany schrieb:

    Beschreib mal, was bei welcher Aktion passieren soll.

    Eigentlich nur dies: Wenn ich mit der Maus ins Fenster klicke, soll der LINKE Rand des Fensters mit dem Cursor wandern. Die anderen drei Ränder sollen unverändert bleiben.

    Grüsse

    Bernhard

    Grüter schrieb:

    soll der LINKE Rand des Fensters mit dem Cursor wandern
    Meinst Du:
    Das Fenster soll schmaler / breiter werden?
    Das geht wie es soll.
    Allerdings wird beim 1. Klick mitten in die Form der linke Formrand auf die Mausposition gezogen, was Du möglicheerweise als Flackern bezeichnest.
    Frag die Mausposition beim Klicken ab und berücksichtige nur Klicks, die nahe genug am Rand sind.
    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!

    Grüter schrieb:

    ichduersie schrieb:

    DoubleBuffered---

    Diesen Tipp hab ich auch schon irgendwo gelesen, bringt aber leider keine Veränderung.
    Jo, das falsche Mittel - denkst du nun aber auch daran, den entsprechenden Code-Unfug wieder zu entfernen?
    Grad Anfänger-Code ist oft vollgeballert mit lauter unnützem Zeug, was iwo aufgeschnappt wurde, nicht verstanden aber dringelassen wurde.

    probierma

    VB.NET-Quellcode

    1. Const HT_CAPTION As Integer = &H2
    2. Const HT_Left As Integer = &HA
    3. Const HT_Right As Integer = &HB
    4. Const WM_NCLBUTTONDOWN As Integer = &HA1
    5. Private Sub frm_Drag(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseDown
    6. If Me.WindowState = FormWindowState.Maximized OrElse e.Button <> Windows.Forms.MouseButtons.Left Then Return
    7. Me.Capture = False
    8. Me.WndProc(Message.Create(Me.Handle, WM_NCLBUTTONDOWN, _
    9. CType(HT_Left, IntPtr), IntPtr.Zero))
    10. End Sub

    RodFromGermany schrieb:


    Das Fenster soll schmaler / breiter werden?
    Das geht wie es soll.
    Allerdings wird beim 1. Klick mitten in die Form der linke Formrand auf die Mausposition gezogen, was Du möglicherweise als Flackern bezeichnest.
    Frag die Mausposition beim Klicken ab und berücksichtige nur Klicks, die nahe genug am Rand sind.

    Ja, das Fenster soll nach links breiter werden. Wie in #1 geschrieben, macht das mein Code aus #1. ABER es gibt einen unschönen Nebeneffekt: Die entgegengesetzte Kante, also der RECHTE Rand, flakert massiv, wenn ich das Rechteck schnell vergrössere. Dass der linke Rand zuerst zum Cursor springt, bezeichne ich NICHT als Flackern (im vollständigen Code verändere ich den linken Rand natürlich nur, wenn ich genügend nahe beim linken Rand geklickt habe...)



    ErfinderDesRades schrieb:

    probierma

    Danke vielmals für den Code, nur: Auch dieser Code lässt - genauso wie mein Code - den entgegengesetzten RECHTEN Rand des Rechtecks stark flackern, wenn ich die Maus schnell nach links bewege (zumindest passiert dies mit meiner Graphikkarte...)

    Bernhard
    Dann weiß ich auch nicht.
    Bei mir workt das optimal.
    Ich hätte sogar immer gedacht, das wäre dasselbe, was intern auch angewendet wird, wenn man den linken Rand eines Forms zieht.
    Ich denke, du hast noch anneren Kram in deim Form, der das Geflacker verursacht.

    Ich häng meins mal an
    Dateien
    • _Tests00.zip

      (11,22 kB, 173 mal heruntergeladen, zuletzt: )

    ErfinderDesRades schrieb:


    Bei mir workt das optimal.


    Danke für deine Mithilfe. Jetzt wird es spannend: Bei mir flackert der rechte Rand in deinem Programm unverändert. Damit wir ganz sicher vom gleichen reden, hab ich mal einen Film von meinem Screen angehängt. Habe leider grad keine Programm installiert, welches mir den Bildschirm abfilmt, deshalb eine Handyaufnahme (.mp4 gezippt). Man sieht aber dennoch gut, dass der rechte (rote!) Rand (mitsamt dem Inhalt) mitgezogen wird, wenn ich das Fenster schnell nach links vergrössere. Ist das bei euch tatsächlich NICHT der Fall? Dann müsste es ja an meiner Hardware/an meinem Win7 64bit liegen??? Wenn ihr wirklich diesen Effekt nicht beobachten könnt, dann steh ich vor einem Rätsel und hoffe, dass mir jemand einen weiteren Tipp hat...

    Schöner Tag

    Bernhard

    EDIT: Der Film wurde aus Platzgründen gelöscht. Siehe aber Posting Nr. 16.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Grüter“ ()

    ich kanns so nicht angugge - kannste das utuben?
    Und von vbp vlt. löschen - vbp hat zwar glaub reichlich Server-Power, aber als Video-Datenbank ists glaub doch nicht gedacht.

    Edit:
    Hab jetzt doch einen Weg gefunden...
    Also ja bei dir wackelts aber bei mir nicht.
    Glaub mir das, weil ich mach jetzt keinen Film davon.

    Und wenn du ein ganz normales Form, mit Rand am linken Rand resizest - das wackelt nicht?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ...glaub ich dir schon. Also bei mir auch mit FormBorderStyle=Sizable ein Geflacker :( . Präziser: Der Rahmen bleibt schon an Ort, aber die rote Fläche mit den Steuerelementen bewegt sich bis zu 1 cm nach links und rechts. Mach jetzt auch keinen erneuten Film. Hmm, bin absolut ratlos.

    PS: Video werd ich in 1 Woche löschen. Vielleicht nützt's noch jemandem in dieser Woche.

    Bernhard

    Grüter schrieb:

    Die entgegengesetzte Kante, also der RECHTE Rand, flakert massiv

    ErfinderDesRades schrieb:

    Bei mir workt das optimal.
    Jou, bei mir auch. Mit und ohne EDR's Code.
    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!
    Tja, dann liegt's wohl auf meiner Seite. Ich werde jetzt mal ein paar Sachen versuchen: Alte Backups einspielen und schauen, ob das schon immer so war. Tests, ob meine Bildschirmeinstellung 125% DPI schuld ist, usw. Das dauert aber, und diese Woche komm ich wohl nicht mehr dazu. Melde mich dann wieder.

    Bernhard
    Wie ändere ich diesen Code von ErfinderDesRades (der code funktioniert), sodass die Form in der Senkrechten gezogen werden kann?

    VB.NET-Quellcode

    1. Const HT_CAPTION As Integer = &H2
    2. Const HT_Left As Integer = &HA
    3. Const HT_Right As Integer = &HB
    4. Const WM_NCLBUTTONDOWN As Integer = &HA1
    5. Private Sub frm_Drag(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseDown
    6. If Me.WindowState = FormWindowState.Maximized OrElse e.Button <> Windows.Forms.MouseButtons.Left Then Return
    7. Me.Capture = False
    8. Me.WndProc(Message.Create(Me.Handle, WM_NCLBUTTONDOWN, _
    9. CType(HT_Left, IntPtr), IntPtr.Zero))
    10. End Sub


    Danke schon mal

    LG Lars
    Pokatahhh!

    SAxLars schrieb:

    in der Senkrechten
    Hier ist die vollständige Auflistung:

    VB.NET-Quellcode

    1. Const HT_Left As Integer = &HA
    2. Const HT_Right As Integer = &HB
    3. Const HT_Top As Integer = &HC
    4. Const HT_TopLeft As Integer = &HD
    5. Const HT_TopRight As Integer = &HE
    6. Const HT_Bottom As Integer = &HF
    7. Const HT_BottomLeft As Integer = &H10
    8. Const HT_BottomRight As Integer = &H11

    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!
    Erneut hallo Profis!

    Endlich hatte ich etwas Zeit und konnte nach der angekündigten Pause meinem komischen Effekt (Flackern des rechten Randes des mit folgendem Code erzeugten Rechteckes) nachgehen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    3. ''' If Me.Location.X + Me.Width <> 500 Then System.Media.SystemSounds.Beep.Play()
    4. If e.Button = MouseButtons.Left Then Me.SetBounds(Me.Location.X + e.X, Me.Location.Y, Me.Width - e.X, Me.Height)
    5. End Sub
    6. End Class

    In den obigen Antworten haben EDR und Rod bestätigt, dass sie selber kein Flackern beobachten können, was mich vermuten liess, dass auf meiner Seite Hardware-/Softwareprobleme vorliegen. In der Zwischenzeit hab ich nun meinen Code und der Code von EDR aus Posting 6 und 8 auf zehn ganz verschiedensten Rechnern meines Arbeitsplatzes laufen lassen - IMMER flackerte es, auch auf meinem in den jungfräulichen Zustand versetzten Rechner. Langsam glaub ich, dass mein Problem doch nicht verstanden wurde, deshalb nochmals:
    Auf remob.hol.es/Flackern.avi seht ihr einen Film meines Screens mit zwei schwarzen Rechtecken. Ziehe ich beim oberen Rechteck den linken Rand nach links, flackert der rechte (!!) entgegengesetzte Rand ziemlich fest, egal ob ich dieses Rechteck mit dem Code aus Posting 6, 8 oder 16 erzeuge. Dass der rechte Rand nicht zwingend flackern muss, zeigt das untere Rechteck. Das dahinterstehende Programm hab ich vor langer Zeit im Internet gefunden und deckt einzig Bildschirmteile ab.
    Immer noch die gleiche Frage: Was flackert bei meinem Code? Ich lasse ja den rechten Rand immer an der Stelle Me.Location.X + Me.Width zeichnen, und diese Summe ist konstant, wie ich bestätigt bekomme, wenn ich oben die auskommentierte Zeile wieder einblende.

    Jeder Tipp ist hochwillkommen. Schöner Tag,

    Bernhard

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Grüter“ ()

    Grüter schrieb:

    In den obigen Antworten haben EDR und Rod bestätigt, dass sie selber kein Flackern beobachten können
    Das bezieht sich auf meinen Code, nicht auf das was du da grad postest.
    Zumindest bei mir.
    Bei Rods "mit oder ohne" scheint sichs auch auf anneren Code zu beziehen - k.A.
    Also dass dein Code flackern muss halte ich für gut möglich.
    Mein Code jdfs. flackert nicht bei mir.