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

  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

  7. #7
    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
    Cool ... (Pas toujours facile a manipuler ce composant, ceci dit.On dirait qu'il a été fait pour casser les pieds a certains moments, non ?)

  8. #8
    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
    (Pas toujours facile a manipuler ce composant, ceci dit.On dirait qu'il a été fait pour casser les pieds a certains moments, non ?)
    Je suis d'accord avec toi.

    Encore une petite question:

    Saurais-tu comment supprimer la surbrillance quand tu navigues avec les touches fléchées dans ce ListView ?
    Il y a toujours le texte de la premiere colonne qui s'affiche en surbrillance, malgré que je redessine avec CustomDraw.
    Si j'applique true à HideSelection, je n'ai plus les cases avec les couleurs dans mon ListView, et la sélection est toujours en surbrillance.

  9. #9
    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
    Bonsoir,

    Hummmm ... une petite modif:
    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
     
    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 = clRed;
    	cnv->Font->Color = clGreen;
    	cnv->Font->Style = TFontStyles() << fsBold << fsUnderline;
    	Item->Selected = false; //<- astuce 'brico-loisir'
    }
    else
    {
    	cnv->Brush->Color = clCream;
    	cnv->Font->Color = clBlack;
    	cnv->Font->Style = TFontStyles();
    }
    }
    Dis moi si ca te permets d'obtenir l'effet escompté...
    @+

  10. #10
    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
    J'ai rajouté
    Item->Selected = false;
    et aucun changement.
    Par contre je viens d'essayer ceci, juste en début de la procédure OnCustomDrawItem
    this->ListView1->ItemFocused = NULL;
    this->ListView1->Selected = NULL;
    et maintenant ca marche.

    Merci.

+ 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