cs_kurky
Messages postés111Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention27 avril 2010
-
28 sept. 2006 à 11:17
ChrisBst -
20 sept. 2022 à 13:31
Bonjour,
J'ai remarqué que mon appli prennait beaucoup de temps à se redessiner. Par exemple, lorsque je reduis/restaure mon appli, on a le temps de voir tout ce qu'il y a derrière l'appli par les controls. C'est comme si le temps que tous les controls se redessinent, ils étaient transparent et on peut voir ce qu'il y a derriere, ce qui est vraiment moche. C'est assez rapide mais bon ca se voit beaucoup..
Voici un screen entre reduction/restauration :
Si quelqu'un avait une idée d'où ca peut venir ca m'aiderai beaucoup :)
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201436 28 sept. 2006 à 11:38
C'est un problème connu.
en gros, lorsque tu restores ton affichage windows envoie le message WM_PAINT aux controles pour qu'ils se mettent à jour... sauf que si tu utilises des controles dont tu as personnalisé l'affichage il faut prévoir plein de chose.
1. Est-ce que tu utilises des fonds transparents ? (à premiere vue oui)
2. Les controles se trouvant en dessous permettent-ils d'être redessiné partiellement ?
En gros, lorsque qu'un controle avec un fond transparent se dessine à l'écran, il demande à son parent de se dessiner... affiche la zone qu'il recouvre, et se dessine.
donc si le controle qui est en dessous mesure 400x400 pixel, mais que tu ne recouvres que 20x20... tu imagines bien qu'il travaille pour rien.
En gros, lorsque tu surcharges (ou t'abonnes à l'évènement) OnPaint, il faut bien pensé à travailler avec le e.ClipRectangle... et pas avec le rectangle complet du controle.
cs_kurky
Messages postés111Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention27 avril 2010 28 sept. 2006 à 11:54
Non ! j'utilise la transparence que pour quelques controls. (la ligne du bas sur limage de fond). Sans ces controls le problème est le même. Aucun control n'est personnalisé mis à part un seul mais bon. Avec ou sans c'est pareil.
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 28 sept. 2006 à 13:37
si le facteur rapidité de restauration n'est pas important et que tu recherche juste l'effet graphique, 2 solutions :
-la première, supenlayout puis resumelayout dans le onpaint de ta form
-la deuxieme, plus estetique mais plus chiante a implémenter, sauvegarder le graphics de ta form, et lors de la restauration dessiner le graphics pour "faire semblant" que ta fenetre est affichée, puis cacher ce graphics une fois le redessinement entièrement terminé.
si par contre tu recherche a ce que ton chargement soit plus rapide, cherche effectivement du coté des transparences...(ce qui est la meilleur solution, les premiers points ne sont que pour te faciliter la vie si tu as des contraintes de temps et que tu ne cherche qu'a rendre l'experience utilisateur visuelle plus agréable, et pas forcément l'application rapide...ok, cest un peu moche, mais dans un premier temps ca compense...)
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_kurky
Messages postés111Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention27 avril 2010 28 sept. 2006 à 14:00
En fait moi j'aurais voulu que ca face comme une appli VB. tu la réduis et tu la reprends, et tu vois pas tous les controls se recharger.
Bon le le C# c'est pas du VB mais s'en approcher serait le mieux.
Donc c'est plus en rapidité qu'il faudrait gagner.
Où est ce que tu mettrais ton suspendLayout et le resume pour que ca marche ?
Car j'ai utilisé a plusieurs reprise des suspend et resume mais je n'ai vu aucune différence.
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201436 28 sept. 2006 à 15:11
c'est probable oui.
dans le constructeur de ta classe... essaye de mettre ?
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, false);
this.SetStyle(ControlStyles.ResizeRedraw, false);
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201436 28 sept. 2006 à 15:59
ok... donc, l'idée que je te propose, c'est de surcharger la méthode OnPaintBackground du formulaire et ne dessiner que la partie correspondant au ClipRectangle.
cs_kurky
Messages postés111Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention27 avril 2010 28 sept. 2006 à 16:41
Effectivement ca corrige un problème qui était que les images transparentes s'affichaient une à une ce qui faisait considérablement ramer l'appli. Mais l'affichage des controls reste inchangé.
Peut-être qu'il existe une facon de redéfinir onPaint ou autre qui pourrait corriger ca :)
Mais le OnPaintBackground m'a corriger un bon problème donc merci :D