Zurück tutorials.de > Programming > C/C++

 
 
Hallo und herzlich willkommen! Tutorials.de ist eine Hilfe-Community mit dem Motto User helfen Usern. Als Gast verfügst Du über Schreibrechte in unseren Foren und Blogs. Du kannst dich aber gerne auch kostenlos registrieren und Teil unserer Gemeinschaft werden! Viel Spaß & Erfolg bei der Vermehrung deines Wissens :-)

Themen: 242.975 | Beiträge: 1.352.293 | Mitglieder: 169.418 (Stand 28.01.10) | Fragen zur Nutzung von Tutorials.de? Nutzungsregeln | Kontaktformular | Impressum

Jubiläums-Countdown 23.02 23.03 23.04 23.05 23.06 23.07 23.08 23.09


4 kostenlose Bücher bei unserer Buch-Verschenkaktion 03/2010
  AntwortAntworten (über Gastzugang)    
  AntwortAntworten (über Gastzugang)    
 
Themen-Optionen Ansicht
Alt 21.05.07, 17:54   #1 (permalink)
Mitglied Brokat
 
Registriert seit: Aug 2006
Beiträge: 413
Renommee-Modifikator: 9
Thomasio sorgt für eine eindrucksvolle Atmosphäre

MoveWindow step by step

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?
  Thomasio ist offline  
 
Alt 21.05.07, 20:19   #2 (permalink)
Mitglied Diamant
 
Benutzerbild von Endurion  
 
Registriert seit: Apr 2004
Beiträge: 2.062
Renommee-Modifikator: 20
Endurion sorgt für eine eindrucksvolle Atmosphäre

AW: MoveWindow step by step

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.
  Endurion ist offline  
 
Alt 22.05.07, 01:01   #3 (permalink)
Mitglied Brokat
 
Registriert seit: Aug 2006
Beiträge: 413
Renommee-Modifikator: 9
Thomasio sorgt für eine eindrucksvolle Atmosphäre

AW: MoveWindow step by step

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
  Thomasio ist offline  
 
Alt 22.05.07, 07:11   #4 (permalink)
Mitglied Diamant
 
Benutzerbild von Endurion  
 
Registriert seit: Apr 2004
Beiträge: 2.062
Renommee-Modifikator: 20
Endurion sorgt für eine eindrucksvolle Atmosphäre

AW: MoveWindow step by step

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.
  Endurion ist offline  
 
Alt 22.05.07, 14:36   #5 (permalink)
Mitglied Brokat
 
Registriert seit: Aug 2006
Beiträge: 413
Renommee-Modifikator: 9
Thomasio sorgt für eine eindrucksvolle Atmosphäre

AW: MoveWindow step by step

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?
  Thomasio ist offline  
 
Alt 22.05.07, 21:41   #6 (permalink)
Mitglied Diamant
 
Benutzerbild von Endurion  
 
Registriert seit: Apr 2004
Beiträge: 2.062
Renommee-Modifikator: 20
Endurion sorgt für eine eindrucksvolle Atmosphäre

AW: MoveWindow step by step

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.
  Endurion ist offline  
 
Alt 23.05.07, 05:06   #7 (permalink)
Mitglied Brokat
 
Registriert seit: Aug 2006
Beiträge: 413
Renommee-Modifikator: 9
Thomasio sorgt für eine eindrucksvolle Atmosphäre

AW: MoveWindow step by step

Ich glaube das habe ich sogar verstanden, werde ich umgehend ausprobieren
Herzlichen Dank
  Thomasio ist offline  
 
 
 
Lesezeichen:


Themen-Optionen
Ansicht
Ähnliche Themen
 
Thema Autor Forum Antworten Letzter Beitrag
AS Step by Step gygra Flash 24 05.05.07 12:25
Newbee vermasselt Prüfung, nun Fehlersuche step-by-step morphi79 Java 57 12.01.06 13:38
Installation von Cocoon in Eclipse - Step by Step downset04 Java 0 13.12.05 21:09
Step (iso-10303) Krümel C/C++ 1 29.02.04 00:08
Suche Step-by-step Tut Oxygen 3D Studio Max 1 22.07.01 13:13
» Tools
 
tutorials.de-Tools tutorial.de-Suchfeld tutorial.de-Widget tutorial.de-RSS-Feed tutorial.de-Banner
» Neue Links
 
Hits: 138
»
JHT's Planetary...
(Cinema 4D-Objekte)
Hits: 266
»
Tageslicht ohne GI
(Cinema 4D-Tutorials)
Hits: 155
»
Puzzle
(Cinema 4D-Tutorials)
Hits: 104
»
Lacreme
(Cinema 4D-Tutorials)
Hits: 196
»
Liquid Light
(Cinema 4D-Tutorials)
» Aktuelle Umfrage
 
Bist du mit der Geschwindigkeit der Tutorials.de-Website zufrieden?
Ja, es putzt mir glatt den Staub vom Bildschirm! - 80,61%
158 Stimmen
Nein, ich denke da muss noch nachgebessert werden... - 19,39%
38 Stimmen
Stimmen gesamt: 196
Du darfst bei dieser Umfrage nicht abstimmen.

 

Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.


Powered by vBulletin® Version 3.8.5 (Deutsch) & vBadvanced CMPS v.3.2.0
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.5.0 RC2 ©2010, Crawlability, Inc.
Alle Rechte vorbehalten ©2000 - 2010 tutorials.de
Design by Mark, CSS by Maik & Sven Mintel
Seite generiert in 0,29913 Sekunden mit 26 queries