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

MFC Discussion :

VS 6 + MFC -CListCtrl-Surlignage ligne


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut VS 6 + MFC -CListCtrl-Surlignage ligne
    Bonjour,
    Je veux sélectionner une ligne entière par programme dans un ListCtrl
    La sélection manuelle fonctionne bien .
    La fonction .. EnsureVisible(....) fonctionne bien mais pas de surlignage de la ligne.
    Ci joint extraits de code qui pourraient être en cause:
    Pouvez-vous me donner la solution?
    A l'avance merci.


    Dans InitDialog:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // mode report.edit ,
        m_ListPoints.ModifyStyle(0,LVS_REPORT | LVS_EDITLABELS );
    //Select ligne entière
       m_ListPoints.SetExtendedStyle(m_ListPoints.GetExtendedStyle() | LVS_EX_FULLROWSELECT);


    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
     
    void COutilsDAT::SelectionnerItem(int NumPOINT)
    {
     m_ListPoints.SetItemState(NumPOINT, LVIS_SELECTED, LVIS_SELECTED); 
     m_ListPoints.EnsureVisible(NumPOINT, FALSE); 
    }
     
    void COutilsDAT::TrouverEtSelectionnerLaLigne()
    {
    	int numPOINT;
    	int X=XYPointCourbeSelectionne.x;
    	int Y=XYPointCourbeSelectionne.y;
    	DeselectionnerTout();
    	numPOINT=TouverItemListe(X,Y);
    	if (numPOINT!=-1)
    		SelectionnerItem(numPOINT);
    }

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    je dirais comme ça que ta méthode TouverItemListe ne donne pas le bonne indice .
    un petit tour en mode trace debug devrait permettre de statuer.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    Merci pour ta réponse rapide mais l'item doit être bon , (tracé en mode DEBUG sa valeur paraît correcte..) d'ailleurs la fonction ..EnsureVisible(..) déplace bien les lignes de la liste de façon à ce que l'item en question soit bien affiché...

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    inverse l'ordre de tes deux lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     m_ListPoints.SetItemState(NumPOINT, LVIS_SELECTED, LVIS_SELECTED); 
     m_ListPoints.EnsureVisible(NumPOINT, FALSE);

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    J'avais essayé et je viens de le refaire.
    En inversant l'ordre même résultat: l'item est bien affiché en tête de la zone de liste par .. EnsureVisible(..) mais la ligne ne paraît pas en surbrillance.

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    Puisque la sélection marche en mode manuel est-ce qu'il y a un moyen d'envoyer un message simulant un LBUTTONDOWN sur cet item ?

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    J'ai essayé ça mais toujours le même mauvais résultat:
    pas de surlignage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void COutilsDAT::SelectionnerItem(int NumPOINT)
    {	
    	CRect  Rect;
    	#define GET_X_LPARAM(lp)   ((int)(short)LOWORD(lp))
    	#define GET_Y_LPARAM(lp)   ((int)(short)HIWORD(lp))	
    	//m_ListPoints.SetItemState(NumPOINT, LVIS_SELECTED, LVIS_SELECTED); 
    	m_ListPoints.GetSubItemRect(NumPOINT,0,0,Rect); 
    	m_ListPoints.SendMessage(WM_LBUTTONDOWN,GET_X_LPARAM((Rect.right-Rect.left)/2),GET_Y_LPARAM((Rect.bottom-Rect.top)/2));
           m_ListPoints.EnsureVisible(NumPOINT, FALSE); 
    }

  8. #8
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void COutilsDAT::SelectionnerItem(int NumPOINT)
    {	
        m_ListPoints.SetFocus();
        m_ListPoints.SetItemState(NumPOINT, LVIS_SELECTED, LVIS_SELECTED); 
        m_ListPoints.EnsureVisible(NumPOINT, FALSE); 
    }

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    OK ça marche! Merci encore.
    PS Il faut bien déselectionner avant sinon les dernières lignes sélectionnées restent surlignées.
    Code qui marche bien :
    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
     
    void COutilsDAT::SelectionnerItem(int NumPOINT)
    {	
    	m_ListPoints.SetFocus();
        m_ListPoints.SetItemState(NumPOINT, LVIS_SELECTED, LVIS_SELECTED); 
        m_ListPoints.EnsureVisible(NumPOINT, FALSE); 
     
    }
     
    void COutilsDAT::TrouverEtSelectionnerLaLigne()
    {
    	int numPOINT;
    	int X=XYPointCourbeSelectionne.x;
    	int Y=XYPointCourbeSelectionne.y;
    	DeselectionnerTout();
    	numPOINT=TouverItemListe(X,Y);
    	if (numPOINT!=-1)
    		SelectionnerItem(numPOINT);
    }

  10. #10
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    PS Il faut bien déselectionner avant sinon les dernières lignes sélectionnées restent surlignées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_ListPoints.ModifyStyle(0, LVS_REPORT | LVS_EDITLABELS  | LVS_SINGLESEL);

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    Merci pour cette nouvelle précision mais dans mon cas je veux garder la possibilité de sélectionner plusieurs lignes manuellement à d'autres endroits du programme.
    J'ai essayé ça :
    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 COutilsDAT::SelectionnerItem(int NumPOINT)
    {	
    	m_ListPoints.SetFocus();
    	m_ListPoints.ModifyStyle(0, LVS_REPORT | LVS_EDITLABELS  | LVS_SINGLESEL);
        m_ListPoints.SetItemState(NumPOINT, LVIS_SELECTED, LVIS_SELECTED ); 
        m_ListPoints.EnsureVisible(NumPOINT, FALSE); 
    	m_ListPoints.ModifyStyle(0, LVS_REPORT | LVS_EDITLABELS  );
     
    }
     
    void COutilsDAT::TrouverEtSelectionnerLaLigne()
    {
    	int numPOINT;
    	int X=XYPointCourbeSelectionne.x;
    	int Y=XYPointCourbeSelectionne.y;
    	//DeselectionnerTout();
    	numPOINT=TouverItemListe(X,Y);
    	if (numPOINT!=-1)
    		SelectionnerItem(numPOINT);
    }
    Je constate alors qu'il devient impossible de sélectionner plusieurs lignes manuellement après un passage par ..SelectionnerItem(..).
    Le deuxième ModifyStyle(...) de SelectionnerItem(...) n'a pas rétabli la possibilité de sélection multiple.
    Donc je vais continuer à utiliser ..DeselectionneTout() ..

    Puis-je encore profiter de ton savoir pour te demander s'il est possible de conserver la sélection surlignée lorsque la fenêtre de la liste perd le Focus.
    Je constate en effet que lorsque je clique en dehors de la liste qui est dans une boîte "modeless" le surlignage disparaît et ca me gêne.

  12. #12
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    C'est un comportement standard des objets fenêtrés windows (GUI). Un seul objet ou un groupe d'objet d'un parent direct commun est mis en surbrillance à la fois. L'explorateur des fichiers sous Windows en est un exemple. Si le parent des objets perd le focus alors le ou les objets enfants sélectionnés perdent leurs surbrillance mais restent sélectionnés

    Arrange toi par tout les moyens à redonner le focus à ta CListCtrl, par exemple la perte de focus d'un contrôle de ta boite modeless la renvoie aussitôt à la liste. Ou un clique sur ta boite en dehors de tout contrôle la renvoie automatique à ta liste. Il y a les Kill Focus comme event...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/07/2006, 08h51
  2. Réponses: 13
    Dernier message: 12/07/2005, 10h14
  3. [MFC] surbrillance de ligne dans une CListCtrl
    Par Yoshette dans le forum MFC
    Réponses: 4
    Dernier message: 15/04/2005, 16h09
  4. [MFC] Retour à la ligne dans un CEdit
    Par Kant dans le forum MFC
    Réponses: 7
    Dernier message: 18/02/2004, 08h58
  5. Réponses: 3
    Dernier message: 18/11/2003, 13h22

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