WinAPI: Scrollen von dutzenden Fenstern möglichst sanft



  • Hallo zusammen.
    Ich habe ein kleines Performanceproblem:

    Man nehme eine Win32 Anwendung und erzeuge darin eine Tabcontrol mit 3 Tabs.
    Je nachdem, welcher Tab ausgewählt ist werden unterschiedliche Fenster sichtbar.

    Ich könnte einen kleinen Tipp gebrauchen was das performante "Scrollen" von mehreren dutzend Fenstern anbelangt 😞

    http://www.fotos-hochladen.net/uploads/schlieren28so0vlcaq.png

    Ich denke mit MoveWindow bin ich auf dem falschen Dampfer. (Zu Unperformant / Umweg??)
    Mit SetWindowPos experimentiere ich schon aber es bringt mir nicht viel.. 😞

    Hier ist die Codestelle in der ich die Fenster "gescrollt rendere":

    (Aktueller Experimentierstand)

    // Diese Funktion soll die Fenster nach Ändern der Fenstergröße u.Ä. wiederherstellen
    void SiegerrundeAusrichten(void)
    {
    	GetClientRect(hWnd,&r);
    
    	for(int i=0; i<64; i++)
    	{
    		SetWindowPos(Siegerrunde[i], HWND_TOP,
    			Siegerrunde_Auswahlisten_Positionen[i][POSX],
    				Siegerrunde_Auswahlisten_Positionen[i][POSY] - (ScrollY[SIEGERRUNDE]*5),150,28,SWP_SHOWWINDOW);
    
    		/*MoveWindow(Siegerrunde[i], 
    			Siegerrunde_Auswahlisten_Positionen[i][POSX],
    				Siegerrunde_Auswahlisten_Positionen[i][POSY] - (ScrollY[SIEGERRUNDE]*5),150,28,true);
    		BringWindowToTop(Siegerrunde[i]);*/
    	}
    
    	for(int i=0; i<32; i++)
    	{
    		SetWindowPos(SiegerrundeText[i],HWND_TOP,
    			Siegerrunde_Auswahlisten_Positionen[i*2][POSX],
    			Siegerrunde_Auswahlisten_Positionen[i*2][POSY]- (ScrollY[SIEGERRUNDE]*5) -15,150,20,SWP_SHOWWINDOW);
    
    		/*MoveWindow(SiegerrundeText[i],
    			Siegerrunde_Auswahlisten_Positionen[i*2][0],
    			Siegerrunde_Auswahlisten_Positionen[i*2][1]- (ScrollY[SIEGERRUNDE]*5) -15,150,20,true);
    		BringWindowToTop(SiegerrundeText[i]);*/
    
    	}
    
    	//InvalidateRect(hWnd,NULL,true);
    }
    

    Könnte mir bitte jemand einen kleinen Hinweis geben?

    Bin dankbar für jegliche Hilfe.
    Vielen Dank,
    Johannes Schneider.



  • Moin,

    ScrollWindow, bzw. ScrollWindowEx ...
    http://msdn.microsoft.com/en-us/library/windows/desktop/bb787593%28v=vs.85%29.aspx

    Sieh Dir das verlinkte Beispiel an. 😉

    Gruß
    Greenhorn



  • Idee 1:
    Schieb ein Zwischenfenster zwischen Hauptfenster und die ganzen Childfenster (abgesehen von den Scrollbars).
    Und dann verschiebst du nur mehr das Zwischenfenster. Ich hab das noch nie gemacht, aber mMn. sollte Windows dann schlau genug sein die Bereiche die nur verschoben werden direkt zu kopieren, und nur die Bereiche die neu sichtbar werden auch wirklich neu zu zeichnen. Kann mich aber auch täuschen 🙂

    Idee 2:
    Verwende ein anderes GUI Framework (vielleicht .NET Forms oder WPF?).

    Idee 3:
    WS_EX_COMPOSITED

    Idee 4:
    ScrollWindowEx

    Idee 5:
    Implementiere das Scrollen selbst. D.h. du musst den Bereich der nur verschoben wird selbst mit BitBlt() kopieren. Dann verschiebst du alle Child-Fenster mit MoveWindow(bRepaint=FALSE). Danach rufst du InvalidateRect() auf den neu sichtbar gewordenen Bereich des Hauptfensters auf, sowie auf alle Child-Fenster die (teilweise oder ganz) im neu sichtbar gewordenen Bereich liegen.
    Damit das funktioniert musst du sicherstellen dass dir beim Verschieben des Fensterinhalts mit BitBlt() nicht WS_CLIPCHILDREN dazwischenfunkt. D.h. entweder verwendest du WS_CLIPCHILDREN einfach nicht, oder sonst ... Pfuh. GetDCEx könnte/sollte funktionieren.



  • Vielen Dank!
    Von ScrollWindow(Ex) hab ich nichts gewusst!
    Ich mach mal Experimente damit und wenn ich was brauchbares habe schreib ich es der Vollständigkeit dann drunter.


Anmelden zum Antworten