Um unsere Form aus ihrer Zwangsstarre zu befreien benötigen wir jedoch nur zwei Funktionen aus der win32api und schon klappts es wieder mit dem Bewegen. Um der Form eine maximale Beweglichkeit zu ermöglichen sollten wir zuvor noch einige Eigenschaften anpassen:
AlwaysOnTop = .T. && optional
Desktop = .T. && optional
ShowWindow = 2 && optional
TitleBar = 0
Innerhalb des LOAD-Events der Form fügen wir den folgenden Code ein:
DECLARE integer ReleaseCapture IN WIN32API
DECLARE integer SendMessage IN WIN32API INTEGER, INTEGER, INTEGER, INTEGER
Dieser Code kommt in den MOUSEDOWN-Event:
LPARAMETERS nButton, nShift, nXCoord, nYCoord
IF nButton = 1
ReleaseCapture()
SendMessage(This.HWnd, 0x112, 0xF012,0)
ENDIF
Sobald wir nun mit der Maus auf einen objektfreien Bereich klicken und die Taste festhalten, können wir die Form frei bewegen.
Wenn nun noch eine kleine 'Einrastfunktion' wie in WinAMP dazukommen soll, dann packen wir einfach den folgenden Code in das MOVED-Ereignis:
liOffset = 20
WITH This
IF .Height < SYSMETRIC(2) - liOffset
DO CASE
CASE .Top < liOffset
.Top = 0
CASE .Top + .Height > SYSMETRIC(2) - liOffset
.Top = SYSMETRIC(2) - .Height
ENDCASE
ENDIF
IF .Width < SYSMETRIC(1) - liOffset
DO CASE
CASE .Left < liOffset
.Left = 0
CASE .Left + .Width > SYSMETRIC(1) - liOffset
.Left = SYSMETRIC(1) - .Width
ENDCASE
ENDIF
ENDWITH
Die o.a. lokale Variable liOffset kann natürlich auch als Form-Eigenschaft hinterlegt werden. Sie definiert letztlich nur den Randabstand, ab dem die Einrastfunktionalität greifen soll.
Übrigens wäre auf dieser Form ein Button zum Schliessen recht sinnvoll. Wegen der ausgeblendeten Titelleiste fehlt diese Funktion nämlich ;-).
Keine Kommentare:
Kommentar veröffentlichen