tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
557
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    683
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
     
    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?
     

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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.
     

  3. #3
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    683
    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
     

  4. #4
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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.
     

  5. #5
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    683
    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?
     

  6. #6
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Die Hauptschleife sieht so aus:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    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.
     

  7. #7
    Thomasio Thomasio ist offline Mitglied Platin
    Registriert seit
    Aug 2006
    Beiträge
    683
    Ich glaube das habe ich sogar verstanden, werde ich umgehend ausprobieren
    Herzlichen Dank
     

Ähnliche Themen

  1. Microsoft Exchange 2007 Step by Step
    Von denisSCR im Forum Microsoft Windows
    Antworten: 0
    Letzter Beitrag: 24.02.10, 11:25
  2. "making of" eines 3d characters - step by step
    Von pixel-panik im Forum Cinema 4D
    Antworten: 1
    Letzter Beitrag: 07.02.08, 11:15
  3. Step-by-Step Tutorial: Achieve Rapid Application Development with Seam+Eclipse+Tomcat
    Von Techieexchange im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 1
    Letzter Beitrag: 13.11.07, 22:43
  4. Antworten: 57
    Letzter Beitrag: 12.01.06, 13:38
  5. Antworten: 0
    Letzter Beitrag: 13.12.05, 21:09