Versuch mal ScrollWindow() oder ScrollDC(). Nur die letze Pixelzeile wird dann in den
DC gezeichnet. Am besten holste diese Pixelzeile aus einer Bitmap. Du zeichnest also zuerst mal die Bitamp in voller Größe (falls sie nicht zu groß). Dann beim wm_Paint,wm_EraseBkGnd zeichnest du die Bitmap ins Fenster. Nichts anders also wie Doublebuffering. Nun wird mit ScrollWindow() gescrollt. Dieser Funktion übergibst du aber eine leere Region mit. Mit dieser Region rufst du dann InvalidateRgn() auf. Danach gleich UpdateWindow(), oder gleich RedrawWindow) mit Region.
Es sieht so aus das die neuen Grafikkarten direkte Bildschirmbereiche schneller verschieben können als eine Bitmap mit gleicher Größe zu zeichnen. ScrollWindow() gibt dir in der Region den Bereich des Fenster der neu gezeichnet werden muß. Meistens, bei 1 Pixel Scroll, ist das also nur eine Pixelzeile. Die Ausnahme ist es wenn das Window durch andere Windows teilweise verdeckt werden. Dann besteht bei 1 Pixel Scroll die Region aus 1x Pixelzeile unterer Rand + x mal oberer Rand für x Fenster die überlappen.
In meiner Arbeit zu meinem ersten Tutorial für die
DP habe ich auch diesen Weg beschritten, allerdings innerhalb eines Threads. Anbei eine kleine Demo. Einfach Liblings-CD oder MP3 einlegen, Mediaplayer beenden und Demo starten.
Ganz exakt flüssig wird es aber nur wenn ein extrem gutes Timing benutzt wird und das Updating des Bildschirmbereiches mit dem Vertical Retrace Signal der Grafikkarte synchronisiert wird.
DirectX bietet glaube ich diese Möglichkeit. Auch ScrollWindow()/ScrollDC() scheinen da sehr flüssig zu sein (kein geflackerer durch Retrace). Allerdings funkt immer wieder der Threadsheduler dazwischen.
Ich bin aber auch auf jeden anderen Vorschlag gespannt der nur mit
API auskommt
Gruß Hagen
PS: ich scroll ca. alle 10ms um 1 Pixel nach links.