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

C++Builder Discussion :

Clignotement d'un TListView en utilisant Repaint()


Sujet :

C++Builder

Vue hybride

FredericB Clignotement d'un TListView... 21/11/2007, 14h05
Sunchaser Eventuellement, vois du côté... 21/11/2007, 17h28
FredericB Je ne suis pas sur de devoir... 21/11/2007, 20h27
Sunchaser Interessant ... je fini mon... 21/11/2007, 20h36
Sunchaser Bonjour, Un bout de code,... 22/11/2007, 13h35
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par défaut Clignotement d'un TListView en utilisant Repaint()
    Bonjour,

    J'utilise un TListView. Avec les touches fléchées je me déplace dans ce TListView, et en fonction de la valeur de la case sélectionnée, je change la couleur du fond.
    A chaque appuie sur une touche fléchée j'utilise ListView1->Repaint(); et donc CustomDrawSubItem pour redessiner à chaque fois mon ListView avec les changements. Mais le problème c'est que je pense que c'est assez lourd (car il doit réafficher toutes les lignes) , et en plus il y a un clignotement à chaque déplacement.

    Est-ce qu'il y aurait une autre façon de faire pour éviter le clignotement de mon TListView à chaque changement, et d'éviter de recharger toutes les lignes du TlistView ?

    Merci

  2. #2
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Eventuellement, vois du côté de ' DoubleBuffered '.

    Sinon, une question: es tu sur de devoir passer par un Repaint() ?
    Gérer dans OnCustomDrawSubItem le paramètre TCustomDrawState State (avec l'état cdsSelected par ex) ne suffirait pas ?

    En espérant t'aider,
    @+

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par défaut
    Sinon, une question: es tu sur de devoir passer par un Repaint() ?
    Je ne suis pas sur de devoir passer par un Repaint(), mais je ne sais pas comment faire autrement.
    Voici en exemple :
    Admettons que je suis sur la ligne 3, colonne 1, la case sélectionnée est verte.
    Si je change de position ma sélection à la ligne 2, colonne 1, ma nouvelle case va être verte, et l'ancienne doit redevenir blanche. En plus dans ces cases il y a des valeurs, et en fonction de ces valeurs la case change de couleur.

    Cela marche très bien avec CustomDrawSubItem.
    Comme CustomDrawSubItem est appelé pour chaque SubItems, ca fait clignoter mon ListView.

    Comment pourrais-je valider le changement des couleurs de ces 2 cases et le texte sans être obliger de repasser par un CustomDrawSubItem de mon TListView, lequel j'appelle par un Repaint() de la ListView ?

    Y-a-til une possibilité de juste colorier une case dans le ListView à une position précise (par exemple Colonne 1, ligne 3) sans passer par CustomDrawSubItem ?

  4. #4
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Interessant ... je fini mon miam du soir et je lance mon Builder ...

  5. #5
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonjour,

    Un bout de code, qui j'espère pourra t'aider:
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    void __fastcall TForm3::LVtestCustomDrawSubItem(TCustomListView *Sender,
    	  TListItem *Item, int SubItem, TCustomDrawState State, bool &DefaultDraw)
    {
    LVtest->DoubleBuffered = true;
    TCanvas *cnv = LVtest->Canvas;
    if (State.Contains(cdsSelected) )
    {
    	switch(SubItem)
    	{
    		case 1:
    		cnv->Brush->Color = clGreen;
    		cnv->Font->Color = clBlack;
    		break;
    		case 2:
    		cnv->Brush->Color = clSilver;
    		cnv->Font->Color = clBlack;
    		break;
     
    	}
    	if ((SubItem-1) == fCurrentCol)
    	{
    		cnv->Brush->Color = clYellow;
    		cnv->Font->Color = clRed;
    	}
    cnv->Font->Style = TFontStyles() << fsBold << fsUnderline;
    }
    else
    {
    	cnv->Brush->Color = clCream;
    	cnv->Font->Color = clBlack;
    	cnv->Font->Style = TFontStyles();
    }
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm3::LVtestCustomDrawItem(TCustomListView *Sender,
          TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
    {
    LVtest->DoubleBuffered = true;
    TCanvas *cnv = LVtest->Canvas;
    if (State.Contains(cdsSelected) )
    {
    	cnv->Brush->Color = clGreen;
    	cnv->Font->Color = clBlack;
    	cnv->Font->Style = TFontStyles() << fsBold << fsUnderline;
    }
    else
    {
    	cnv->Brush->Color = clCream;
    	cnv->Font->Color = clBlack;
    	cnv->Font->Style = TFontStyles();
    }
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm3::LVtestMouseDown(TObject *Sender, TMouseButton Button,
    	  TShiftState Shift, int X, int Y)
    {
    int ligne;
    int colonne;
      LVHITTESTINFO lvhtti;
      lvhtti.pt = Point(X, Y);
      if ( SendMessage(LVtest->Handle, LVM_SUBITEMHITTEST, NULL, reinterpret_cast<LPARAM>(&lvhtti)) != -1   )
      {
    	 ligne = lvhtti.iItem;
    	 colonne = lvhtti.iSubItem-1;
    	 fCurrentCol = colonne;
    		LVtest->ItemIndex = ligne;
    	 LVtest->Invalidate();
      }
    }
    ou ' fCurrentCol ' est un int en private.
    OwnerDraw (du TListView) est resté a false.

    @+

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par défaut
    Bonjour,

    Merci pour ton aide.
    Ca marche super bien maintenant.

    Merci.
    Fred

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/05/2015, 11h31
  2. utilisation de repaint
    Par Aurel_ dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 02/04/2007, 21h00
  3. Utilisation d'un repaint
    Par Marty McFly dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/05/2006, 13h08
  4. [Debutant] Utilisation de repaint
    Par Gotterfdom dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 26/02/2006, 21h43
  5. [TListView] Utilisation de SortType ?
    Par FredericB dans le forum C++Builder
    Réponses: 10
    Dernier message: 19/09/2003, 17h40

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