VB 6.0: Verschieben eines Form

Hallo VB’ler,
ich habe ein Coding, mit dem ich, egal wo ich aufs Form klicke, das Form verschieben kann. Ich weiss, dass es da auch die „SendMessage()-Variante“ gibt, möchte diese aber NICHT verwenden!!!

Prinzipiell funktioniert’s … nur wenn ich das Form verschiebe, „verwischt“ mir das System das Fenster d.h. ich ziehe so eine kleine „Fenster-Spur“ hinter mir her, und das sieht nicht besonders gut aus.

Je besser und schneller die Grafik-Karte bzw. das System, desto weniger „verwischt“ er mir - eh klar! Diverse „.Refresh“ und/oder „AutoRedraw=True,False“ haben leider keine Abhilfe geschaffen. Gibt es da einen kleinen API-Trick, ein Fenster „spuren-frei“ zu verschieben?!?

sanx from michL

PS: anbei mein Coding…

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private blnmMove As Boolean
Private xm As Single
Private ym As Single
'
'
Private Sub Form\_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
blnmMove = True
xm = X + (Me.Width - Me.ScaleWidth) / 2
ym = Y + (Me.Height - Me.ScaleHeight) / 2 + 150
End Sub
'
'
Private Sub Form\_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim p As POINTAPI
Call GetCursorPos(p)
If blnmMove Then
 Call Me.Move(p.X \* Screen.TwipsPerPixelX - xm, p.Y \* Screen.TwipsPerPixelY - ym)
End If
End Sub
'
'
Private Sub Form\_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
blnmMove = False
End Sub

Prinzipiell funktioniert’s … nur wenn ich das Form
verschiebe, „verwischt“ mir das System das Fenster d.h. ich
ziehe so eine kleine „Fenster-Spur“ hinter mir her, und das
sieht nicht besonders gut aus.

Schreibe in deine Ereignisprozeduren
nach jedem ‚Move‘ die Anweisung ‚DoEvents‘.

Vielleicht hilft das. Ausserdem kannst du in den
Systemeinstellungen verhindern, das Fensterinhalte
beim verschieben angezeigt werden.
(Desktop->Eigenschaften->Effekte)
Das empfiehlt sich sowieso.

Gruss

Christoph

Schreibe in deine Ereignisprozeduren
nach jedem ‚Move‘ die Anweisung ‚DoEvents‘.

Das hat ein bischen geholfen, die Fenster-Spur ist aber noch immer stark zu sehen.

Ausserdem kannst du in den
Systemeinstellungen verhindern, das Fensterinhalte
beim verschieben angezeigt werden.
(Desktop->Eigenschaften->Effekte)

Das hat bei mir keine Auswirkung, da ich ja, wie Du aus meinem Coding vom vorheringen Posting ersehen kannst, das „Fenster ziehen“ manuell programmiert habe … und das soll auch so bleiben.

Meine Fensterl sind nämlich nicht eckig sonder haben eine beliebige Form mit einem True-Color Bild darauf noch dazu!! Wenn ich die Variante

ReleaseCapture
SendMessage Me.hWnd, &HA1, 2, 0&

verwende, d.h. Fenster verschieben, ohne das es eine ‚Caption‘ hat, dann sieht man die Stricherl vom original Fenster, und das gefällt mir auch nicht.

Witzig, dass ich es noch ein bischen verbessern konnte, indem ich das Form vor dem bewegen vorher ‚disabled‘ habe.

Me.Enabled = False
Call Me.Move(p.X \* Screen.TwipsPerPixelX - xm, p.Y \* Screen.TwipsPerPixelY - ym)
Me.Enabled = True
DoEvents

… aber zufrieden bin ich eigentlich noch nicht.

Danke aber für Deinen Tipp.
sanx from michL

Verschieben eines Form: So geht’s
Hi michL,

Dein Problem ist, dass zu viele Events getriggert werden: Während Windows noch das Fenster verschiebt, wird die Sub schon wieder aufgerufen, so dass Windows mit dem Zeichnen des Hintergrundes nicht mehr hinterherkommt.

Abhilfe: Setze die Variable blnmMove während des Verschiebens auf False, so dass keine neuen Verschiebungen ausgeführt werden, während die alte noch nicht beendet ist:

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
If blnmMove Then
blnmMove = False
Dim p As pointapi
Call GetCursorPos§
Me.Move p.x * Screen.TwipsPerPixelX - xm, p.y * Screen.TwipsPerPixelY - ym
DoEvents
blnmMove = True
End If
End Sub

Das war’s auch schon :wink:

Viele Grüße
Sculpture

He!!!
echt supi!! Das ganze war wirklich ein Event-Problem.
Vielen Dank auch schön.
greets from michL