IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] - Scintillement de la fenetre lors du redimmensionnement


Sujet :

Windows Forms

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut [C#] - Scintillement de la fenetre lors du redimmensionnement
    Bonjour,

    Le scintillement de la fenêtre quand on la resize est un problème que je vois beaucoup sur le net avec toujours la même réponse:

    Mettre la propriété DoubleBuffered à True.

    Cependant ça ne marche pas dans mon cas.

    Dois-je modifier autre chose ? ou overrider certaines méthodes d'affichage ?

    Merci pour vos réponses.
    Tox

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 35
    Points : 42
    Points
    42
    Par défaut
    DoubleBuffered à true à un effet uniquement sur ​​la Form elle-même, et non pas pour tous les contrôles enfants. Plus il y en a, plus le temps pour dessiner devient perceptible !

    Il faut donc ajouter une option disponible depuis Windows XP qui est WS_EX_COMPOSITED.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       //Copie tout simplement cet propriété dans le code de t'as classe  WindowsForm, elle sera active directement à l'exécution de ton programme
       //
       protected override CreateParams CreateParams 
       {
             get 
             {
                  CreateParams cp = base.CreateParams;
                  cp.ExStyle | = 0x02000000; / / Activer le WS_EX_COMPOSITED
                  return cp;
              }
        }
    J'espère avoir résolu ton problème !

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    Bonjour,

    Merci pour ta réponse. J'ai cherché sur le net des articles en rapport avec ce que tu m'as proposé.

    J'ai trouvé ceci qui explique plus en détail : http://www.angryhacker.com/blog/arch...lications.aspx

    Ça améliore le rafraichissement (moins de scintillements), cependant on peut quand même en voir.
    J'ai enlever ma dataGridView d'un control Group et je l'ai mis directement sur la Form. Ça a aussi amélioré les performances.

    Mais c'est quand même bizarre qu'il n'y ai pas une méthode radicale pour supprimer tous les scintillements.

    Mais Merci, c'est mieux qu'avant !
    A+
    Tox

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    Bonjour,

    Je reviens sur ce post pour donner la solution complète pour supprimer le scintillement sur les fenêtres winform.

    Tout d'abord il faut englober les controls de la fenêtre dans un panel global, sinon ça ne scintillera plus mais certains controls ne seront pas rafraichit correctement. (sources : beaucoup de tests).

    Après il faut mettre ce code dans la classe de la fenêtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
            // supprime les scintillements
            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams cp = base.CreateParams;
     
                    cp.ExStyle |= 0x02000000;
                    //WS_EX_COMPOSITED. Prevents flickering.
                    cp.ExStyle |= 0x00080000; //WS_EX_LAYERED. Transparency key
     
                    return cp;
                }
            }
    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    // corrige le rafraichissement des controls après un maximize
    // du a la suppression des scintillements
    protected override void WndProc(ref Message message)
            {
                const int WM_SYSCOMMAND = 0x0112;
                const int SC_MAXIMIZE = 0xF030;
                const int SC_RESTORE = 0xF120;
     
                base.WndProc(ref message);
     
                switch (message.Msg)
                {
                    case WM_SYSCOMMAND:
                        int command = message.WParam.ToInt32() & 0xfff0;
                        if (command == SC_MAXIMIZE || command == SC_RESTORE)
                        {
                            this.Refresh();
                            this.Invalidate();
                        }
                        break;
                }
            }
    Puis dans l’événement Shown de la fenêtre, mettre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.MaximizeBox = true;
    Enfin, si sur certains controls, il y a des bordures mal redessinees, un petit this.Refresh() et this.Invalidate() à faire.

    J’espère que ça aidera tout ceux qui ont eu des problèmes de scintillement.

    A +
    Tox

  5. #5
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Cette dernière solution fonctionne parfaitement bien dans mon cas.
    Il n'y a même pas besoin de DoubleBuffered (qui n'a pas fonctionné pour moi non plus).

    A noter que le dernier morceau de code n'est pas indispensable, il permet de maximiser la fenêtre lors de son affichage.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    Bonjour,

    petite correction, la propriété MaximizeBox = true indique si le bouton Agrandir est affiché dans la barre de légende du formulaire.

    Dans les tutoriaux que j'ai regardé, ils disent qu'il faut le faire pour que ça marche.

    Mais dans mon cas également, ne pas le mettre ne change rien au résultat, les scintillements ont disparu.

    A+
    Tox

  7. #7
    Membre du Club
    Homme Profil pro
    Technicien
    Inscrit en
    Juillet 2020
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Juillet 2020
    Messages : 132
    Points : 63
    Points
    63
    Par défaut
    Bonjour le Forum,

    Désolé pour le déterrage de post mais c'est très intéressent.

    Le code ci-dessous fonctionne à merveille, les scintillements ont disparu.

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Protected Overrides ReadOnly Property CreateParams As CreateParams
        Get
            Dim cp As CreateParams = MyBase.CreateParams
            cp.ExStyle = cp.ExStyle Or &H02000000
            cp.ExStyle = cp.ExStyle Or &H00080000
            Return cp
        End Get
    End Property

    Et le code ci-dessous permet de Minimiser le formulaire "sans bug de rafraichissement", mais celui-ci pose problème en vb.net.

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Protected Overrides Sub WndProc(ByRef message As Message)
        Const WM_SYSCOMMAND As Integer = &H0112
        Const SC_MAXIMIZE As Integer = &HF030
        Const SC_RESTORE As Integer = &HF120
        MyBase.WndProc(message)
     
        Select Case message.Msg
            Case WM_SYSCOMMAND
                Dim command As Integer = message.WParam.ToInt32() And &Hfff0
     
                If command = SC_MAXIMIZE OrElse command = SC_RESTORE Then
                    Me.Refresh()
                    Me.Invalidate()
                End If
        End Select
    End Sub
     
    Protected Overrides Sub WndProc ' => Wndproc est en rouge.
     MyBase.WndProc(message)
            Select Case message.Msg '=>Message est en rouge sur ces deux lignes.

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changement Titre de fenetre lors d'une redirection
    Par Abac_Angelique dans le forum ASP.NET
    Réponses: 4
    Dernier message: 30/01/2008, 15h18
  2. Réponses: 1
    Dernier message: 14/06/2007, 10h04
  3. Scintillement de l'image lors de son déplacement
    Par micatt dans le forum Delphi
    Réponses: 3
    Dernier message: 04/03/2007, 12h22
  4. Scintillement d'une image lors de son déplacement
    Par johnbob789 dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 31/07/2006, 15h04
  5. Réponses: 6
    Dernier message: 27/01/2004, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo