Verschieben der Form sperren
-
Hallo
Ich würde es gerne hinbekommen, das man eine Form nicht mehr verschieben kann.
Derzeit hat meine Form den Style bsNone und ich bringe es über SendMessage(Form->Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0) zum bewegen. Nun fange ich die Message WM_MOVING ab und möchte, das sich die Form ab einem bestimmten Punkt nicht mehr verschieben lässt.
Alle meine bisherigen versuche endeten darin, das die Form zu ihrer Ausgangsposition zurückgesetzt wurde. Iss aber nicht so dolle denn es sollte eigentlich die aktuelle Position beibehalten werden. Ich dachte eher an so was wie SC_NOMOVE aber das gibt es ja leider nicht.
Was für Möglichkeiten habe ich denn, um mein Vorhaben zu realisieren?
-
Wie sehen denn deine bisherigen Versuche aus?
-
Ich hab versucht über SendMessage(Form->Handle, WM_SYSCOMMAND, SC_RESTORE, 0) die Form zurück zu setzen. Dummerweise wird hier zum Ausgangspunkt des Verschiebevorgangs zurück gesetzt. Ich hab jetzt die SDK-Hilfe und MSDN durchsucht, weiß aber nicht so ganz nach was ich suchen soll.
Hast du vielleicht einen Tipp?
-
Ich war eigentlich mehr darauf aus, wie du während des Verschiebens feststellst, ob du dich noch im Bereich befindest.
Ein möglicher Ansatz: lass den User doch verschieben, wohin er will. Wenn er damit fertig ist prüfst du, ob sich die Form im definierten Bereich befindet. Wenn nicht, dann setzt du sie einfach per Code an den nächstliegenden "Rand".
Ansonsten gibt's da noch die API-Funktion ClipRect, aber damit gibt's bei dieser Art Aufgabenstellung wohl Probleme.
-
Ich hab eigentlich vor mein Fenster an einen Rand des Bildschirmes anzudocken, währen der User das Fenster verschiebt (wie bei Winamp, der sich sozusagen an den Rand "saugt").
Wenn ich WM_MOVING abfange, prüfe ich ob sich das Fenster in der Nähe des Bildschirmrandes befindet (z.Bsp. if(Left<20)) und dann soll Left=0 gesetzt werden. Das funktioniert soweit auch alles, nur kann man das Fenster jetzt immernoch nach Links und Rechts verschieben, was aber nur der Fall sein soll, wenn eine weitere Bedingung erfüllt ist.
-
Das lässt sich doch erreichen, indem du schon den Aufruf von SendMessage(Form->Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0) von deinen Bedingungen abhängig machst!?
-
Das hab ich ja grad auch vor. Nur leider muss ich die Message ja irgendwo senden um das Verschieben überhaupt zu starten. Das hab ich im OnMouseDown der Form getan. Jetzt kann ich ja aber abfragen was ich will, aber ein Resultat bekomme ich da nicht. Erst wenn ich den Mousebutton wieder los lasse, werden weitere Anweisungen bearbeitet, aber nicht wärend des Verschiebens. Und genau da liegt mein Problem. Vielleicht seh ich aber auch den Wald vor lauter Bäumen nicht.
-
Du sollst den Aufruf der Funktion von Bedingungen abgängig machen, die Bedingungen also vor dem Aufruf prüfen.
void OnMouseDown() { if (Bedingung erfüllt) SendMessage(Formbewegen); }
-
Das brigt mir ja dann nicht viel, da ja während des Verschiebens geprüft werden soll und nicht vorher oder nachher. Ich hab jetzt ma eine andere Lösung probiert.
Ich hab einfach beim OnMouseDown die X- und Y-Position der Mouse in einer Globalen Variable gespeichert und verschiebe dann die Form im OnMouseMove mit Left = Left + X - start_x.
Das funktioniert und dann kann ich auch wärend des Verschiebens meine Abfragen machen, da sich die Maus auf der Form ja immer um mindestens 1 Pixel bewegt.
Ich persönlich finde diese Lösung aber nicht sehr elegant. Naja wenns anders nicht geht, dann halt so.
Trotzdem vielen Dank für deine Antworten.