Dienstag, 24. Juni 2008

Wie bewege ich eine Form ohne Titelleiste / How to move a form without titlebar

Ab und an besteht der Bedarf, ein Formobjekt ohne Titelleiste darzustellen. Mit Hilfe der Form-Eigenschaft 'TitleBar' läßt sich das soweit auch problemlos bewerkstelligen. Soll diese nun 'kopflose' Form jedoch trotzdem auf dem Bildschirm bewegt werden können, dann haben wir jetzt ein klitzekleines Problem, denn die Titelleiste einer Form dient nun einmal als Haltegriff für die Maus, wenn eine Form verschoben werden soll.

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