MoveWindow step by step

Thomasio

Erfahrenes Mitglied
Bevor ich mit directX und Zeug anfange, versuche ich gerade ein Fenster über den Bildschirm zu bewegen, ohne Schnickschnack, einfach mit MoveWindow() in plain API

Das Ganze von irgendwo nach irgendwo anders ist kein Problem, nur hätte ich das ganze gern schrittweise, so dass man zusehen kann, wie das Fenster über den Bildschrim wandert

meine Idee dazu war (ausgehend von einen 50x50 grossen Fenster):

Code:
int oldleft = 0;
int oldtop = 100;
int newleft = 100;
int newtop = 200;

for (int i = 1; i < 101; i++)
    {
          MoveWindow(myWindow, oldleft + i, oldtop + i, 50, 50, TRUE);
          Sleep(100);
    }

Das Ganze funktioniert im Prinzip, er braucht 10 Sekunden um das Fenster zu verschieben, AAAAABER er zeigt das Fenster nicht an den Zwischenpositionen an, es bleibt an der ursprünglichen Position und springt erst am Ende zur letzten Position
Offensichtlich blockiert meine Funktion den WM_PAINT bis sie durch ist

Kann mir jemand sagen, ob und wie man das in plain API machen kann, ohne gleich directX oder sonstwas zu verwenden?
 
Der Gag ist, dass bei Windows praktisch alles über die WindowProc abgefackelt wird (genauer über die DefWindowProc, der man eigentlich alles weitergeben sollte).

Die Verarbeitung der Nachrichten passiert in deiner Message-Schleife, also dort wo du Peek/Get/Translate/DispatchMessage aufrufst.

Selbst das Bewegen eines Fensters läuft über Nachrichten.

Wenn du da jetzt so eine Schleife machst, wird das Fenster eine solche Bewegungs-Nachricht in seine Message-Abarbeitungsliste bekommen. Allerdings werden diese Nachrichten nicht abgearbeitet. Erst, wenn deine Schleife durch ist, bekommt das Fenster alle Nachrichten am Stück und es sieht so aus, als ob es direkt zur Zielposition kommt.

Für einfache Zwecke kannst du mit einem Timer operieren: Erzeuge mit SetTimer einen Timer, rufe innerhalb von WM_TIMER MoveWindow auf und vergiss nicht, da auch irgendwo eine Ende-Bedingungs reinzusetzen.
 
An timer habe ich gedacht, aber das ist mir zu ...... sagen wir mal erroranfällig, mit multi threading bin ich noch nicht sattelfest
Es wäre mir viel lieber, wenn ich das Fenster innerhalb der Funktion verschieben könnte, bzw. die Zwischenstationen beim verschieben sichtbar machen könnte ohne die Funktion dafür verlassen zu müssen
Wenn das nicht geht, dann lasse ich es lieber, ist eh nur eine Übung für mich zum lernen, und da gehört "geht so nicht" auch mal zu den möglichen Lerneffekten
 
Du kannst natürlich innerhalb der Schleife auch manuell die Messages weiterlaufen lassen; du musst dort nur eine Kopie der Hauptschleife mit Peek/Get/Translate/DispatchMessage aufrufen.

Zur Info: WM_TIMER bewegt sich ebenfalls über die Messages, hat also mit Multithreading nichts zu tun.
 
Hui, ich rieche Neuland
Oder anders gesagt, "nur" eine Kopie der Hauptschleife aufrufen, davon habe ich auch noch keine Ahnung
Ich habe gerade mal bei MSDN nach Get, Peek und Dispatch gesucht, aber die ergehen sich mal wieder lang und breit in fachchinesisch, ist mir einfach zu hoch, bin doch Anfänger

Kann mir einer für doofe erklären wie man das macht?
 
Die Hauptschleife sieht so aus:

Code:
MSG  msg;

while ( PeekMessage( &msg, 0, 0, PM_NOREMOVE ) )
{
  GetMessage( &msg, 0, 0 );
  TranslateMessage( &msg );
  DispatchMessage( &msg );
}

Kann sein, dass ich mich an den Parametern vertan habe, ist aus dem Kopf. Diese Schleife kannst du auch irgendwo hinsetzen.

Kleiner Haken: Da ist keine Prüfung auf WM_QUIT mit drin, die könnte man der Sauberkeit halber noch mit reinnehmen.
 
Zurück