Fenster beim Verschieben aneinander binden
-
Ich möchte das Hauptfenster aus WinMain und ein Dialogfenster beim jeweiligen Verschieben fest aneinander binden. Egal welches Fenster WM_MOVE auslöst, soll das andere Fenster fest der Verschiebung folgen. Bisher gelingt mir das nur einseitig vom Hauptfenster ausgehend, aber nicht beidseitig. Mit einem Flipflop 0 / 1 komme ich noch nicht weiter, weil jeweils viele WM_MOVE ausgelöst werden.
-
Das Dialog Fenster hat ein Parent, das Hauptfenster kennt das Handle des Dialoges.
Behandle in beiden Fenstern WM_MOVING und verschiebe das andere Fenster mit...Was meinst Du mit Flipflop?
-
Danke, es läuft wie gewünscht! Jedoch unter WM_MOVE, statt WM_MOVING.
Ich verstehe unter Flipflop eine Schaltvariable zur Unterscheidung von alternierenden stabilen Zuständen (0 / 1):
// jeder Durchlauf hier ändert den Zustand if(flipflop) flipflop=0; else flipflop=1; ... // jetzt kann nach aktuellem Zustand weiteres unterschieden werden
Hat sich aber erledigt, weil hier unbrauchbar. Sollte unerwünschte Rückkopplungen mit SendMessage zwischen den Fenstern vermeiden. Der Begriff stammt aus dem Bereich elektronischer Schaltungen.
-
Mir ist klar, was ein Flipflop ist, mir war nich tklar was Du hier mentest.
BTW:
Solche einen Flipflop würde ich nie mit einem IF machen sondern einfach so:flipflop = !flipflop;
-
Verstanden: flipflop != flipflop; ist einfacher.
Das jeweils andere Fenster wird mit SetWindowPos(hwndAnderesfenster,...) nachgezogen. Geht soweit auch jeweils einzeln in eine Richtung. Es bleibt aber das Problem von Rückkopplungen, wenn beide Fenster die Verschiebungen unabhängig auslösen sollen. Hier scheint doch eine Unterscheidung notwendig, welches der beiden Fenster den Vorgang veranlasst hat. Anderenfalls funktioniert es nicht - beide Fenster schicken sich mit SetWindowPos die Nachrichten WM_MOVE (und mehr?) hin und her. Zur weiteren Erklärung: hwndMain und hwndDialog sind moduslos eingerichtet.
-
Du kannst dir eine kleine Funktion schreiben und abhängig von dem gerade verschobenen Fenster die Handles und Position übergeben:
enum DD_Mode // bestimmt, wohin das andockbare Fenster verschoben werden soll { DD_TopLeft, DD_TopRight // kann noch beliebig ergänzt werden }; void DockWnd(HWND main, HWND docked, DD_Mode mode) { RECT wndrct; GetWindowRect(main, &wndrct); RECT dockedwndrct; GetWindowRect(docked, &dockedwndrct); RECT targetrct; switch(mode) { case DD_TopLeft: targetrct.left = wndrct.left-(dockedwndrct.right-dockedwndrct.left); targetrct.top = wndrct.top; break; case DD_TopRight: targetrct.left = wndrct.right; targetrct.top = wndrct.top; break; } SetWindowPos(docked, 0, trgt.left, trgt.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER); }
Jetzt ist natürlich die Unterscheidung nötig, wenn das Hauptfenster bewegt wird, ist der Dialog das Fenster, was verschoben werden soll und umgekehrt (der Dialog soll in diesem Fall immer links vom Hauptfenster stehen):
INT_PTR CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_MOVING: DockWnd(hwnd, GetParent(hwnd), DD_TopRight); return 1; } return 0; } // und in der Fensterproc: LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_MOVING: DockWnd(hwnd, /*DialogHandle*/, DD_TopLeft); return 1; } ...
-
Ergänzung: SetWindowPos sollte auch noch das Flag SWP_NOACTIVATE übergeben werden...
-
Ich habe doch geschrieben, dass Du WM_MOVING verwenden sollst und nicht WM_MOVE!
WM_MOVING wird nur an das Fenster gesendet, dass durch eine Benutzerinteraktion verschoben wird und das kann nur ein Fenster bekommen.
-
Es scheint da einen Unterschied zu geben, ob das Dialogfenster modal oder modeless ist. WM_MOVING bekommt man offensichtlich nur in modalen Fenstern zu sehen?
Danke an alle. Ich kann damit leben, wenn es nur einseitig hMain --> hDialog möglich ist
-
Unter welcher Windowsversion hast du es denn getestet? Unter Win7 funktioniert der Code problemlos.
Der einzige Unterschied zwischen modalen und nichtmodalen Dialogen dürfte die eigene Nachrichtenschleife bei den modalen Dialogen sein, dass bestimmte Nachrichten abhängig davon verschickt werden oder nicht, bezweifel ich...