Lenteur affichage

cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 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 :)

Merci

22 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
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.

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
28 sept. 2006 à 11:40
Tes controls contiennent une backColor transparente ? et bien ca vient de la :/
0
cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 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.
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
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...)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 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.
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
28 sept. 2006 à 14:16
protected override OnPaint(PainEventArgs e)
{
this.SuspendLayout();
base.OnPaint(e);
this.ResumeLayout();
}
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
28 sept. 2006 à 14:17
pourrais-tu faire un test ?

dans le main de ton application, remplace la ligne :
Application.SetCompatibleTextRenderingDefault(false);

par
Application.SetCompatibleTextRenderingDefault(true);

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 avril 2010
28 sept. 2006 à 14:20
Application.SetCompatibleTextRenderingDefault était deja a false :)

Et pour le suspend et resume c'est ce que j'avais tenté suite a ton poste mais rien n'y fait :s
0
cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 avril 2010
28 sept. 2006 à 14:21
pardon j'avais pas vu que tu me disais de mettre Application.SetCompatibleTextRenderingDefault à true.

J'ai essayé mais ca ne change rien
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
28 sept. 2006 à 14:39
une autre idée... sur tes Label, Checkbox et autres... met la propriété FlatStyle à System.

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 avril 2010
28 sept. 2006 à 14:48
Non rien n'y fait !

Tous les controls sont dans une classe qui hérite d'une classe abstraite qui, elle, hérite de UserControl.

Le problème ne peut pas venir de par la ?
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
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);

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 avril 2010
28 sept. 2006 à 15:20
Ne change rien.

Je me demande si ce n'est pas propre à C# et à sa gestion d'image. Car sans image de fond c'est quand même un peu plus rapide.
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
28 sept. 2006 à 15:22
l'image de fond fait tout le formulaire ?

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 avril 2010
28 sept. 2006 à 15:26
Oui
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
28 sept. 2006 à 15:32
elle est mise en background du form ou dans un panel ?

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 avril 2010
28 sept. 2006 à 15:48
non en background
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
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.

donc un truc du genre :

private void override OnPaintBackground(object sender, PaintBackgroundEventArgs e) {
   e.Graphics.DrawImage(base.BackgroundImage, e.ClipRectangle, e.ClipRectangle, GraphicsUnit.Pixel);
}

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 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
0
cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 avril 2010
28 sept. 2006 à 16:43
Enfin normalement le suspendLayout devrait etre la solution. Mais je dois mal le placer.
Il faudrait le mettre dans le OnPaint de la formprincipal ?
0
Rejoignez-nous