Fenster zusammen verschieben
-
Hallo,
ich möchte ein Fenster gleichzeitig verschieben, wenn ich ein anderes Fenster verschiebe. Ich möchte das die Fenster zusammen verschoben werden, also aneinander kleben. Hat jemand dazu eine Lösung ?
Das andere Fenster neu zu positionieren, wenn ich das eine verschoben habe ist einfach. Es sollen immer beide gleichzeitig verschoben werden. Ich möchte das ohne andocken lösen.
Das eine Fenster verschiebe ich so :ReleaseCapture(); SendMessage(Form1->Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
Ich hab schon einen Teilerfolg erziehlt, in dem ich mir die WM_Moving Message besorge, aber beim verschieben hängen die Fenster nicht richtig zusammen, es gibt da kleine Lücken zwischen den Fenstern beim Verschieben. Hat dafür jemand eine Lösung, denn jetzt weiß ich nicht mehr weiter ?!?!
In der Unit1.h :
void __fastcall WMMove(TMessage&); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_MOVING, TMessage, WMMove) END_MESSAGE_MAP(TForm)
In der Unit1.cpp
void __fastcall TForm1::WMMove(TMessage&) { Form2->Left = Form1->Left+Form1->Width; Form2->Top = Form1->Top; }
Danke
-
Probiere doch mal die Messageverarbeitung des anderen Fenster zu aktivieren, während Du die WM-Message abarbeitest. Dann müßte es eigentlich ziemlich synchron passieren. Du mußt aber aufpassen, daß Du keine Endlosschleife produzierst, wenn das andere Fenster Dein Fenster wieder rufen sollte, sonst tut sich nach dem erste Move des Fensters nichts mehr und er hängt sich auf bzw. kapitualiert irgendwann wegen Stackoverflow.
-
Hallo JFK,
kannst du mir da einen Tip geben, wie ich das anstellen muß. Ich bin noch nicht so fitt mit der WinAPI. Das oben ist schon fast alles was ich kann.
Das sieht aber so aus, als wenn ich nur jede 2te Message bekomme, denn ich kann das erste Fenster immer so einen Pixel verschieben und erst beim zweiten Pixel wird auch das zweite Fenster verschoben.
Danke
-
Sorry, bin auf Arbeit und hab hier keinen BCB und kann nicht in der Hilfe nachkucken...
Schau Dir mal in der Hilfe die Themen zur Messageverarbeitung an. Das mit dem Messagehandler haste ja auch schon gefunden. Wenn es keine Methode gibt, die Messages eines Formulars abarbeiten zu lassen (in der Art "Form2->MessagesAbarbeiten()"), dann mußt Du notfalls eine Move-Message an Form2 schicken (schau Dir dazu mal PostMessage & SendMessage in der WinAPI Hilfe an... Ach und in der FAQ wirst Du da auch fündig!).
Ich bin mir auch nicht ganz sicher, welchen Wert Left und Top des Formulars zum Zeitpunkt der Move-Msg haben. Ich vermute aber stark, daß dort noch die ALTEN Werte stehen. Erst wenn Du mit Deiner Msg-Abarbeitung fertig bist, wird Left und Top von Form1 angepaßt.
Kuck mal in der Hilfe, welche Position in der Move-Msg-Struktur die X/Y Werte angeben. Die linke, obere Ecke des Windows? Wenn ja, dann nimmste diese Werte für die Form2-Zuweisung und die Lücke sollte weg sein.
-
Hallo,
also wenn ich WM_MOVE an statt WM_MOVING nehme klappt es, aber ich bekomme beim Programmstart eine Zugriffsverletzung ?!?!?!
Ich werde noch mal in der Hilfe suchen, vielleicht finde ich da eine Lösung.
Pronto451
-
Das liegt vermutlich daran, daß Form2 zu dem Zeitpunkt von WM_MOVE noch nicht erzeugt wurde oder Form2 noch nicht sichtbar ist bzw. bereit. Da mußte noch eine Sicherung einbauen.
Ich hab Deine WM_MOVING übersehen... Weiß jetzt auswendig nicht, welche Unterschiede da existieren. Steht aber auch alles in der Hilfe (doof, wenn man hier Infotechnisch "auf dem Trockenen" sitzt....
-
Hallo JFK,
hast recht, hab das übersehen.
Danke für die Hilfe jetzt klappt es mit WM_MOVE und ner Sicherung :).Danke
-
Und das funktioniert bei dir zufriedenstellend? Bei mir entstehen kurzzeitig immer noch Lücken, zumindest bei schnelleren Bewegungen.
Allerdings zeigt zB. WinAmp (das in Sachen Form-Docking ja durchaus als Vorbild gelten darf) dieselben Symptome. Vielleicht ist das ja as good as it gets?
-
Hallo Jansen,
also bei mir hängen die Fenster genau so fest zusammen wie bei WinAmp.
Hier mal mein Code:
*.cpp//--------------------------------------------------------------------------- void __fastcall TForm1::WMMove(TMessage& Message) { inherited::Dispatch(&Message); if (Form2) { Form2->Left = Left+Width; Form2->Top = Top; } }
*.h
private: // Anwender-Deklarationen void __fastcall WMMove(TMessage&); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_MOVE, TMessage, WMMove) END_MESSAGE_MAP(TForm)
Pronto451
-
Pronto451 schrieb:
genau so fest zusammen wie bei WinAmp
Wie gesagt, bei mir ist Winamp (2x) da auch nicht perfekt.
Insofern ist die Lösung schon ziemlich gut, denke ich.
-
hallo,
also bei mir funktionierts perfekt, bin selber erstaunt (p4, 2,4gh, 512ram)...
mfg
murph