Entwickler-Ecke

WinForms - PictureBox/Form flackern bei update/move


Durin - Mo 10.10.11 11:59
Titel: PictureBox/Form flackern bei update/move
Hallo Forum :)

Folgendes Problem habe ich bereits hier gepostet:
http://www.mycsharp.de/wbb2/thread.php?threadid=98947

Leider wurde ich hier sehr schnell mit einem close abgewimmelt. Auf Empfehlung von Th69 probiere ich es hier nochmal, da ich zwischenzeitlich leider noch keine Lösung gefunden habe:


Ich komme ursprünglich aus der Webentwicklung mit PHP, habe aus dem Studium bisher JAVA mitgenommen und möchte mich gerade mit C# näher beschäftigen.

Zu diesem Zweck haben ich einen Launcher geschrieben, mit einem grafischen Skin, den mir jemand gezeichnet hat. Hier habe ich ein Problem:

Der Launcher funktioniert von seiner Funktionalität tadelos. Doch jedes mal, wenn ich den Text eines Labels, oder das visible Flag einer PictureBox mit transparentem Hintergrund und einer .png Grafik ändere flackert mir teilweise die ganze Form. Aus meiner Sicht lädt er jedesmal statt der trasparenz erst einen weißen Hintergrund und macht das Control danach transparent, so wirkt es jedenfalls. Ein unangenehmes Flackern eben.

Kann mir hier jemand weiterhelfen dieses Problem zu umgehen?

Ich habe bereits umfangreich gesucht und auch hier im Forum einiges gefunden. Im wesentlichen ausprobiert habe ich:

Doublepuffer soll wohl gegen diese flickern helfen. Vlt. bin ich hier zu naiv vorgegangen, ich habe lediglich in den Konstruktor der Main Form folgendes Snippet kopiert:

C#-Quelltext
1:
this.SetStyle( ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true);                    

Hatte leider keinen Effekt.

Auf der anderen Seite habe ich control.suspendLayout(); und control.resumeLayout() ausprobiert.

Analog zu oben, habe ich den Konstruktor mit suspend und resume geklammert und testweise in einer meiner methoden, welche die gui verändert für jedes element mit suspend und resume geklammert.

Ebenfalls leider keinen Effekt. :(

Für Hilfe sehr dankbar :)
Durin

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Ralf Jansen - Mo 10.10.11 12:13

Der DoubleBuffer ControlStyle gehört in die obsolete Ecke. Ersetze den mal durch OptimizedDoubleBuffer vielleicht reicht das schon.


Durin - Mo 10.10.11 12:23

Hallo Ralf Jansen,

Du meinst folgendermaßen?


C#-Quelltext
1:
2:
3:
4:
5:
this.SetStyle(
    ControlStyles.UserPaint | 
    ControlStyles.AllPaintingInWmPaint | 
    ControlStyles.OptimizedDoubleBuffer, true
);


Eben ausprobiert: Leider kein Effekt :(


Ralf Jansen - Mo 10.10.11 12:27

Schade. Das meinte ich.

Dann müsstest du uns mal zeigen wie der Skin gezeichnet wird. Also die OnPaint Methode oder der Paint Event deiner Form.


Th69 - Mo 10.10.11 12:29

Hallo Durin,

könntest du vllt. mal ein Testprojekt aufsetzen und hier als Anhang hochladen?
Evtl. reicht es auch schon, in dem du ein neues Projekt aufsetzt und dann nach und nach die Controls hinzufügt, um zu sehen, ab wann das Flackern anfängt.


Durin - Mo 10.10.11 12:33



Ralf Jansen - Mo 10.10.11 12:56

Nein. Das war es nicht was ich wollte.

Aber man kann zumindest ein paar Details erraten ;) Die Styles zu setzen hilft nicht da du es schon längst getan hast (die DoubleBuffered Property gesetzt). Gezeichnet/geskinnt wird aber auch scheinbar nicht die Form sondern eins deiner TableLayoutPanels. Controls zeichnen sich jeweils selber. Dein Panel ist also mehr oder weniger unbeeindruckt davon wie du deine Form einstellst. Zeig doch mal denn Launcher_Paint Event. Ungesehen sieht es für mich im Moment so aus das du wahrscheinlich ein eigenes TableLayoutPanel ableiten musst um dessen DoubleBuffered Property bzw. ControlStyles zu setzen.


Th69 - Mo 10.10.11 13:34

Hallo Durin,

dein About-Programm flackert bei mir nicht (bzw. kaum, d.h. nicht mehr als auch andere Fenster, wie z.B. der "Explorer") beim Verschieben (hauptsächlich der Windows-Rand).

Unter welcher Windows-Version testest du denn? Ich habe hier noch WinXP.


Horschdware - Mo 10.10.11 13:39

Bei mir flackert das About-Programm auch nicht.
Lediglich der Aufbau des Fensters dauert ein wenig (alter Rechner), wodurch erst ein paar weisse Flächen sichtbar sind, die innerhalb von Sekundenbruchteilen nach dem Start mit den gewünschten Elementen überdeckt werden.

System ist WinXP SP3.


Ralf Jansen - Mo 10.10.11 13:43

Was soll da denn Flackern und wobei? Es gibt keinen veränderlichen Inhalt in der About Form. Wenn es beim verschieben flackert liegt es an deinem System/Treiber. Deine Anwendung ist beim verschieben eigentlich gänzlich unbeteiligt.


validas - Mo 10.10.11 13:59

Auch ich habe nichts störendes gesehen... kein flackern.. Ebenfalls getestet unter WinXP SP3....


Durin - Mo 10.10.11 15:10

Merkwürdig:

Ich hab ein Win7 64 Bit System, bei mir flackert er ordentlich beim Aufbau des Aboutfensters. Überall dort wo ein transparenter Hintergrund gesetzt ist lädt er zunächst weis und dann transparent, dadurch flimmert er beim Aufbau. Das selbe Flimmern habe ich ganz extrem bei meiner Hauptanwendung, da dort mehr Elemente sind. Dort habe ich dann auch "Animationen" bzw. sich ändernde Elemente. Zum Beispiel beim Wechsel zwischen 2 Tablelayouts (also dem visible false/true) flimmert er ebenso. Dies beobachte ich nur bei meiner Anwendung, nicht bei anderen Anwendungen.

@ Ralf Jansen:

Er registriert zwar einen Eventhandler auf die Launcher_Paint Function, ich habe aber keine solche. Wo befindet die sich? Wenn ich auf "springe zur Definition" klicke, lande ich in meiner Form1 Klasse und er generiert eine solche Funktion