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 :

[MFC] parametrage d'une listbox


Sujet :

MFC

  1. #21
    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,
    il y a un probleme a ton code c'est qu'il est reentrant .
    la logique est placéee sur OnSelchangeListbox()
    et dans le traitement on provoque a nouveau ce message .
    essaye de placer un booleen pour empecher la reentrance.

  2. #22
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    oula, en effet j'y avait pas pensé, je comprend meme pas comment ca peut faire le bon traitement vu que je devrai réentrer indéfiniment dans cette fonction...

    j'ai modifier le code pour essayer de faire comme tu as dis.
    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
    void CIHMListeDlg::OnSelchangeListbox() 
    {	
    	if(m_bSelChange==false)
    	{
    		m_bSelChange=true;
    		SetRedraw(FALSE);
    		m_iCurrentselection=m_MyListBox.GetCurSel();
     
    		if(m_iCurrentselection>m_iPrecSelection)
    		{	
    			m_MyListBox.SetCurSel(m_iCurrentselection+2);
    			m_iPrecSelection=m_iCurrentselection;
    			m_MyListBox.SetCurSel(m_iCurrentselection);
    		}else
    		{
    			m_MyListBox.SetCurSel(m_iCurrentselection-2);
    			m_iPrecSelection=m_iCurrentselection;
    			m_MyListBox.SetCurSel(m_iCurrentselection);
    		}
    		SetRedraw();
    		RedrawWindow();
    		m_bSelChange=false;
    	}	
    }
    mais ca n'a pas supprimer le clignotement

  3. #23
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    j'ai débuggué la fonction OnSelchangeListbox() et il semble qu'elle ne soit pas réentrante de toute facon.
    sinon j'ai toujours pas reussi à supprimer ce clignotement.

  4. #24
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    pas d'idées pour supprimer ce clignotement?

  5. #25
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    ou sinon pour eviter le clignotement, comment je peu fair pour fair defiler ma liste box sans faire defiler ma selection???

  6. #26
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    help, tout mon projet avance (j'ai tres bientot fini) mais c'est toujour aussi moche...

  7. #27
    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
    Bon je reviens,
    Essaye de faire ça sur ta listbox :
    Au lieu de toucher à setcursel tu vas déplacer l'ascenseur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_MyListBox.PostMessage(WM_VSCROLL,SB_LINEDOWN,1);

  8. #28
    r0d
    r0d est actuellement connecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    8)

  9. #29
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    vous allez dire "mais il est chiant celui la!!" mais desoler ca ne marche pas a 100%
    j'ai essayer plein de methode pour eviter de voir ma selection osciller entre le moment ou elle change et le moment ou j'affiche.

    maintenant j'arrive a eviter tout ces clignotement mais mon ascenceur n'est plus actualisé.

    voila ma methode:
    dans initdialog je bloque l'affichage de ma listbox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_MyListBox.SetRedraw(false);
    je ne fait rien dans OnSelChangeListBox()

    et je detecte l'appui sur les touche up & down (obliger pour le reste de mon projet) en faisant:
    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
    BOOL CIHMListeDlg::PreTranslateMessage(MSG* pMsg) 
    {
      if(pMsg->message == WM_KEYDOWN)//si il s'agit de l'appui sur une touche
      {
        if(pMsg->wParam == 8)  //touche backspace
    	{
    		...
    	}else if (pMsg->wParam == VK_DOWN)	//on descend dans la liste
    	{
    		int iIndex=m_MyListBox.GetTopIndex();//n° de l'item tout en haut
    		m_iCurrentselection=m_MyListBox.GetCurSel();//n° de l'item selectionné
    		m_MyListBox.SetRedraw(true);//on autorise l'affichage
     
    		if(	m_iCurrentselection==iIndex+12)//si l'item selectionné est parmi les deux item a laissé libre en bas de la liste
    		{	
    			m_MyListBox.PostMessage(WM_VSCROLL,SB_LINEDOWN,1);//on fait monter la liste
    		}		
    		m_MyListBox.RedrawWindow();//on actualise l'affichage
    		m_MyListBox.SetRedraw(FALSE);//on rebloque l'affichage
    	}else if (pMsg->wParam == VK_UP)	
    	{
    		int iIndex=m_MyListBox.GetTopIndex();
    		m_iCurrentselection=m_MyListBox.GetCurSel();
    		m_MyListBox.SetRedraw(true);
     
    		if(	m_iCurrentselection<=iIndex+2)
    		{
    			m_MyListBox.PostMessage(WM_VSCROLL,SB_LINEUP,1);
    		}		
    		m_MyListBox.RedrawWindow();
    		m_MyListBox.SetRedraw(FALSE);
    	}
      }
      return CDialog::PreTranslateMessage(pMsg);
    }
    existe-t-il un moyen (un postmessage ou autre) pour dir d'actualiser l'ascenseur car le m_MyListBox.RedrawWindow(); ne le fait pas.
    un moyen serait d'utiliser la fonction RedrawWindow() de la cdialog mais dans ce cas tout ce met a clignoter.

    désoler de vous prendre la tete avec ma listbox, surtout que apres j'ai encore deux autre question dessus.

  10. #30
    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
    c'est bien compliqué tout ça lol,
    essaye un Invalidate au lieu de RedrawWindow.

  11. #31
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    edit: oops desoler... double post

  12. #32
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    oui c'est compliqué... surtout pour une simple list box... et encore t'a pas vu tout le traitemement d'enregistrement des evenements sur ma list box (les aller retour, les pause, les selection.....)

    le invalidate n'a rien changé. l'ascenseur est toujour figé. j'ai l'inpression que cet ascenseur est mis a jour à la modification de la selection dans la list box mais comme je bloque l'affichage lors de cette modification je bloque aussi l'ascensseur.
    si je debloque l'affichage pour debloquer l'ascensseur on voit la selection qui oscille... ca se mort la queue.
    l'ideal serai de pouvoir dir a l'ascenseur de se rafraichir. peu etre en passant par la classe mere de la listbox avec un getparent-quelque-chose. et si la classe parent decompose la fenetre en une clistbox et un ascensseur indépendant, lui passer le message pour le rafraichir...
    c'est tordu et je sais pas si je suis clair (c'est deja pas tres clair dans ma tete :/ )

    sinon on va dir que c'est pas possible et j'abandonne ce probleme...

    et la je pose mes deux autres questions qui sont:
    -comment, lors de la validation de ma selection dans ma listbox, réaliser un clignotement du bandeau de selection (par inversion video en inversant la couleur de la police avec celle du bandeau)??
    -et enfin comment mettre des images a la place du texte dans ma listbox?

    non pas taper sur la tete

  13. #33
    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
    pour le raffraichissement essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Invalidate();  
    // Update Window to cause View to redraw.
    UpdateWindow();
    sur la listobox.
    pour changer l'apparence d'une listbox il faut la customiser :listbox owner draw + classe heritée de CListBox :
    voir faq :
    http://c.developpez.com/faq/vc/?page...istBoxDrawItem
    +
    http://farscape.developpez.com/Sampl...tomListBox.zip



  14. #34
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    ok cool, ben je sais pas ou tu va chercher tout ca mais chapeau a toi.
    le rafraichissement marche avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    m_MyListBox.SetRedraw(TRUE);
    Invalidate(); 
    // Update Window to cause View to redraw.
    m_MyListBox.UpdateWindow(); 
    m_MyListBox.SetRedraw(FALSE);
    me reste plus qu'a gérer le fait que ca me cause un temp de retard quand je bloque l'affichage mais je devrai pas avoir de souci (quand je fait bas bas haut lui il fait bas bas bas et apres il fait haut ).


    ma listbox est deja customisée grace à la faq et a ton .zip (c'etait mon probleme initiale dans ce topic et tu m'as super aidé)
    je change la police, la couleur de fond, la couleur du bandeau de selection... mais ce que je n'arrive pas a faire c'est lui dir que quand je valide ma selection je fait un clignotement.
    et puis cette CMylistBox ne me permet pas non plus de mettre des images à la place du texte ou alors j'ai pas tout compris.

  15. #35
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    je crois que je vien de comprende ce qu igene pour fair clignoter lors de la validation de la selection.

    dans le drawitem je travaille avec la selection pour faire mes couleur.
    je pense qu'il faudrai que je traivaille avec le focus plutot et que jutilise la selection uniquement lorsque je valide un item de ma list box.

    seulement le CListBox na pas de fonction equivalente a SetCurSel et GetCurSel pour le focus.
    comment changer le focus pour le faire passer d'un item a un autre?

  16. #36
    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,
    (bon j'espere avoir bien compris la demande ,mais la je suis plus sur )
    pour gerer un clignotement sur la listbox il faut utiliser un timer .
    j'ai rajouté cette fonctionnalité dans l'exemple sur la listbox custom du debut.
    voir les differentes fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void SetBlink(int nElapse,bool bActivate=false);// regle le temps et active si bActivate==true
    void StopBlink(); // arrete le clignotement.
    void StartBlink();// demarre le clignotement.
    http://farscape.developpez.com/Sampl...tomListBox.zip

    il suffit de faire entrer sur le bandeau des 2 premieres listbox.


  17. #37
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    salut,

    merci pour l'info et le source. par contre je ne trouve pas les fonctions que tu me donnes ci dessus dans ton source, je les trouve ou?
    ca doit pas etre le bon source car les fichiers date du 22/6.

  18. #38
    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
    bon je ne sais pas ce que j'ai foutus avec mon .zip
    et evidemment je n'ai pas le source avec moi ..
    je vais attendre mon collegue bigboom qui l'avait telechargé avant ma boulette ,pour voir si il a gardé le projet...

    je te tiens au courant.

  19. #39
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    merci c'est super.

  20. #40
    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
    pense a mettre resolu sur le post si c'est ok

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Réponses: 16
    Dernier message: 13/07/2007, 16h26
  2. [MFC] clic droit sur une listbox ?
    Par julien.nasser dans le forum MFC
    Réponses: 1
    Dernier message: 07/06/2006, 14h53
  3. [MFC] initialisation d'une Listbox
    Par kitsune dans le forum MFC
    Réponses: 6
    Dernier message: 15/11/2005, 14h26
  4. [MFC] Probleme d'actualisation d'une listbox
    Par Robleplongeur dans le forum MFC
    Réponses: 5
    Dernier message: 13/05/2004, 14h15
  5. [MFC] CPropertySheet dans une CFormView ???
    Par Lofwyr dans le forum MFC
    Réponses: 2
    Dernier message: 30/07/2003, 16h49

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