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#] Interdire le Paint d'un contrôle


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Points : 89
    Points
    89
    Par défaut [C#] Interdire le Paint d'un contrôle
    J'ai créé un UserControl contenant lui-même de nombreux Labels que je dessine / resize à outrance. S'en suit un "clignotement" de ce controle, assez peu esthétique.

    Ma question est la suivante : la classe Control possède-t-elle une méthode permettant de "bloquer" le repaint automatique (ie dès qu'un controle est resizé / redessiné) afin que je le declenche moi-même "à la main" une bonne fois pour toutes ? ...

    N'hésitez pas à me demander des précisions si ttefois je n'ai pas été assez clair. Merci d'avance

    [Edit]
    SuspendLayout() "bloque" les resize (entre autres) mais pas les changements de BackColor, ce que je fais. Cette méthode ne convient donc pas.

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Essaye d'overrider la méthode Paint pour retourner null. Ensuite, quand tu as besoin d'appeler le Paint, tu passes par base.Paint();

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Points : 89
    Points
    89
    Par défaut
    Bonne idée! Toutefois, la méthode Paint n'est a priori pas "overridable". J'ai essayé avec Refresh(), aucun changement ...

    Je ne pense pas qu'il y ait de solution à mon pb

    [Edit]
    Voici des complements d'information :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    private void LoadValues()
    {
    	if (m_fMaxValue > 0)
    	{
    		m_fHeightMultiplicator = (float)this.Height / (float)m_fMaxValue;
    	}
    
    	m_bUpdatingControls = true;
    
    	for (int iIndex = 0; iIndex < m_iCapacity; iIndex++)
    	{
    		Label objLabel = this.Controls[
    			NamePrefix + iIndex.ToString()] as Label;
    		if (m_lfValues.Count <= iIndex)
    		{
    			objLabel.Location = new Point(
    				objLabel.Location.X,
    				objLabel.Location.Y + objLabel.Height);
    			objLabel.Height = 0;
    			continue;
    		}
    
    		float fValue = m_lfValues[iIndex];
    		int iDeltaHeight = Convert.ToInt32(
    			fValue * m_fHeightMultiplicator - objLabel.Height);
    			objLabel.Height = Convert.ToInt32(
    			fValue * m_fHeightMultiplicator);
    		objLabel.Location = new Point(
    			objLabel.Location.X,
    			objLabel.Location.Y - iDeltaHeight);
    		if (fValue >= m_fTrigger &&
    			objLabel.BackColor != m_objTriggeredColor)
    		{
    			objLabel.BackColor = m_objTriggeredColor;
    		}
    		else if (fValue < m_fTrigger &&
    			objLabel.BackColor != m_objNormalColor)
    		{
    			objLabel.BackColor = m_objNormalColor;
    		}
    
    
    		if (m_bDisplayValue)
    			objLabel.Text = fValue.ToString();
    		else
    			objLabel.Text = "";
    	}
    
    	m_bUpdatingControls = false;
    }
    La boucle for récupère les Labels existants, change leurs propriétés 'BackColor' et 'Height'. Afin de m'assurer que tous les Paint de ces Labels allaient etre appelés a la fin de ce traitement, j'utilise le booléen m_bUpdatingControls comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    protected override void OnPaint(PaintEventArgs e)
    {
    	if (!m_bUpdatingControls)
    		base.OnPaint(e);
    }
    Malheureusement, le flag m_bUpdatingControls n'est jamais à True ds l'event OnPaint car ce dernier est appelé pdt le traitement, mais s'exécute a la fin de celui-ci, les messages OnPaint ayant été empilés ...

    Si toutefois qqn a une idée je suis tt a fait preneur !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Points : 89
    Points
    89
    Par défaut
    J'ai trouvé un article traitant de ce fameux probleme de clignotement. Il s'applique au Resize d'une Form, mais applicable au OnPaint d'un UserControl.

    Les classes utilisees n'existent plus et doivent etre remplacees par BufferedGraphics et consorts (source ici)...

    Du coup, mon pb se resume a cette unique question : Comment intercepter l'event OnPaint de mon UserControl seulement lorsque qu'il a été provoqué par ma fonction LoadControls() ?

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par hobotalker
    Bonne idée! Toutefois, la méthode Paint n'est a priori pas "overridable".
    Je voulais parler de OnPaint...

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/07/2015, 10h50
  2. Evènement PAINT d'un contrôle
    Par riadh_ado dans le forum Windows Forms
    Réponses: 6
    Dernier message: 02/01/2011, 21h13
  3. Interdire le focus à un contrôle TextBox (VB 2008)
    Par Angelique64 dans le forum VB.NET
    Réponses: 4
    Dernier message: 12/04/2010, 08h45
  4. [VB6] [Form] Interdire le déplacement d'une feuille
    Par Loïc dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 23/09/2002, 15h02
  5. [Kylix] Contrôle DBGrid
    Par KThrax dans le forum EDI
    Réponses: 1
    Dernier message: 10/05/2002, 14h18

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