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. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut [MFC] parametrage d'une listbox
    bonjour,

    j'ai parcouru la faq VC++ et j'ai trouvé ce que je cherchais, ca: http://c.developpez.com/faq/vc/?page...istBoxDrawItem

    j'ai donc créé une classe dérivé, surcharger la fonction comme c'est dit. la ok.
    je dessine ma listbox sur ma boite de dialogue, clique droit, "properties". je selectionne "has strings" , je selectionne "variable"dans la categorie "owner draw" (c'est quoi la difference entre variable et fixed pour cette option??).

    je ne fais rien avec ma listbox et je lance mon appli et là
    theliste.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru.
    je ne comprend pas, de quoi ca vien???
    j'ai pourtant fait comme dans la faq!



    j'ai essayer de créer dynamiquement ma listbox dans OnInitDialog() avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CMyListBox *pmyListBox= new CMyListBox();
    	CRect myRect;
    	myRect.bottom=GetPrivateProfileInt("screen","Y",480, "./Config.ini" );
    	myRect.top=0;
    	myRect.left=0;
    	myRect.right=GetPrivateProfileInt("screen","X",640, "./Config.ini" );
    	pmyListBox->Create(
          WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|
          LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE,
          myRect, this, 1);
     
     
    	pmyListBox->AddString("toto");
    	pmyListBox->AddString("toto2");
    mais ca plante au deuxieme addstring avec un debug assertion failed , file winctrl1.cpp.
    mais par contre avec cette deuxieme methode ca marche si je ne met qu'un seul addstring("toto")

    je suis a court d'idée.
    help parce que la je sens que je vais partir en weekend plus tot que prevu :p

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    dans le cas de la creation dynamique tu as oublié :
    // si le style est <> de LBS_HASSTRINGS on considère que la valeur à afficher
    //est dans ItemData.
    LBS_HASSTRINGS.
    dans ton premier test le plus simple est de mettre l'application en debug.
    et sur l'assertion de remonter la pile context pour voir quelle partie du code cause un probleme.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    oula je suis un peu largué.
    // si le style est <> de LBS_HASSTRINGS
    ca veu dir quoi ?? en gros c'est juste si on est avec l'option "has strings", c'est ca?

    mais comment j'accede a ce itemdata?
    il est censé etre dans un objet LPDRAWITEMSTRUCT mais je ne trouve rien ladessus dans la ma msdn

    comment simplement rajouter un item, et deplacer la selection sur mes items de ma list box.

    merci

    je continu de chercher de mon coté

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    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 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Bon, reprenons depuis le début:
    Citation Envoyé par mandagor
    je lance mon appli et là
    theliste.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru.
    Ca, ça signifie que tu est en mode release. Mets-toi en mode debug, et sers-toi des break points. Le debugger de visual est une pure merveille, ce serait dommage de ne pas s'en servir.

    Citation Envoyé par mandagor
    // si le style est <> de LBS_HASSTRINGS
    ca veu dir quoi ?? en gros c'est juste si on est avec l'option "has strings", c'est ca?
    Ca veut dire "si le style est différent de LBS_HASSTRINGS", donc qu'il n'a pas l'option "has string".

    Citation Envoyé par mandagor
    mais comment j'accede a ce itemdata?
    MaListeBox.GetItemData();
    Citation Envoyé par mandagor
    comment simplement rajouter un item,
    MaListBox.AddString(), ou InsertString(), selon où tu veux l'insérer; et eventuellement SetDatas(), mais je ne pense pas que tu en aies besoin ;
    Citation Envoyé par mandagor
    et deplacer la selection sur mes items de ma list box.
    MaListBox->SetCurSel(). La MSDN est ton amie

    reprends ton code calmement et ça ira tout seul :p

  5. #5
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    voir cet exemple tres simple fait d'apres la faq:
    http://farscape.developpez.com/Sampl...tomListBox.zip


  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    merci pour vos reponses et les precieuse information que vous m'avez fourni.
    dès que je me remet a mon code je vous dirais si j'ai enfin réussi cette listbox. normalement avec vos conseil je devrai m'en sortir.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    bon je m'y suis remis et là j'avoue que visual a un comportement bizard.
    je m'explique.
    je suis en mode debug depuis le debut.
    moi j'avais des erreur comme ce que j'ai dis dans mes precedents posts.
    j'ai essayer le programme d'exemple de Farscape et sans rien toucher, ca compile mais ca plante aussi assez aléatoirement.
    -->
    debug asserion failed , file cWinhand.cpp ligne 199.
    le plus louche pour moi dans tout ca c'est que en release ca marcher tres bien....

    si en debug je fait ignorer j'arrive apres sur ma fenetre avec la liste box.

  8. #8
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    en fait ça ne plante pas ,
    ce pb est frequent en debug il suffit de faire retry pour continuer.
    (lié au ressources non pretes)
    d'ailleurs je suis etonné que personne n'en fasse etat sur le forum.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    c'est exactement ca,

    merci tu me rassures,

    ouf!

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    c'est encore moi,

    je m'y suis remis ce matin et ca avance bien mais j'ai encore quelque souci de parametrages.

    ma listbox n'est plus créée dynamiquement, je la dessine dans visual, je lui affecte une variable membre,
    je parametre la police avec :
    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
    //---------changement de la police de caractere------------------------------
    	//défini la police
    	CWnd *pWnd = GetDlgItem(IDC_LISTBOX1);
    	CFont* pFont = pWnd->GetFont();
    	if(pFont)
    	{
    		//parametrage police de texte:
    		LOGFONT lfFont;
    		pFont->GetLogFont(&lfFont);
    		lfFont.lfWeight=FW_BOLD;//gras
    		lfFont.lfHeight=45;
    		lfFont.lfWidth = 0;
    		lfFont.lfEscapement = 0;
    		lfFont.lfOrientation = 0;
    		lfFont.lfItalic = FALSE;
    		lfFont.lfUnderline = FALSE;
    		lfFont.lfStrikeOut = 0;
    		lfFont.lfCharSet = ANSI_CHARSET;
    		lfFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
    		lfFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    		lfFont.lfQuality = DEFAULT_QUALITY;
    		lfFont.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
    		lstrcpy(lfFont.lfFaceName, _T("Bienvenue TT"));
    		m_font.DeleteObject();
    		m_font.CreateFontIndirect(&lfFont);
     
    		//affecte la police aux textes :
    		pWnd->SetFont(&m_font);
    	}
    //-----------------------------------------------------------------------------
    j'ajoute des éléments avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_MyListBox.AddString("toto");
    dans la classe CMyListBox, je parametre les couleurs de police, et de surlignage (j'ai quelque souci sur le background qui ne veu pas changer de couleur avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dc.SetBkColor(RGB(255,0,0)
    )

    mais le probleme c'est: comment réglé l'espace de l'interligne???
    si j'ecris en gros dans ma listebox, les lignes se chevauchent!
    ca se regle avec les parametre de la list box? si oui lequel?
    ou alors avec les parametre de la police?

    ps: au passage, un grand bravo pour ce site et ce forum que j'utilise de plus en plus. y a pas a dir, je sais pas ce que je ferais sans!

  11. #11
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    implemente cette fonction:
    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
     
    //.h :
    virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
    // voir avec classwizard sinon a rajouter manuellement.
    // .cpp
    //-------------------------------------------------------------------
    void MyListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
    {
    	// TODO: Add your code to determine the size of specified item
    	CDC *pDC = GetDC();	
    	if(m_bFont)
    	{
    		CFont* pOldFont = pDC->SelectObject(m_pFont);		
        	TEXTMETRIC tm;
        	pDC->GetTextMetrics(&tm);
        	lpMeasureItemStruct->itemHeight = tm.tmHeight + tm.tmExternalLeading;
    	    lpMeasureItemStruct->itemHeight += lpMeasureItemStruct->itemHeight / 2;    
    		pDC->SelectObject(pOldFont);
    	}
    	ReleaseDC(pDC);		
    }
    m_pFont est la fonte utilisée pour la listbox (CFont *).

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    merci pour la fonction, mais j'ai quelques question.

    - a quoi correspond la variable m_bfont dans le if ? (ou alors c'est plutot m_pfont, non?)

    - comment je lui passe la font utilisée dans ma list box? je l'ai définie dans la classe de ma boite de dialog où je crée ma listbox pas dans la classe CMyListBox.

    - et enfin comment j'appelle cette fonction virtual ? je doit créer un objet MEASUREITEMSTRUCT et l'appeler manuellement dans ma classe de ma boite de dialogue?

    désoler pour toutes ces question plus ou moins bete pour certaines mais je suis loin d'avoir un bon niveau en c++ windows meme si je m'améliore de jour en jour

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    j'y arrive pas
    est-ce que deja cette methode est la bonne:

    j'ai deux classe, une pour ma boite de dialogue (CIHMDjg) une autre pour ma listBox (CMyListBox)
    -je crée un constructeur dans CMyListBox avec un parametre pour lui passer le CFont* de ma list box codé dans CIHMDlg.
    -je crée un objet LPMEASUREITEMSTRUCT dans CIHMDlg
    -jappel la fonction CMyListBox::MeasureItem(...)

    c'est ok ca?

  14. #14
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    non ,
    Bon on reprend, pour fixer la fonte de la listox il suffit de faire un SetFont sur le contrôle.
    La listbox tiendra compte de la nouvelle fonte pour le dessin.
    Si tu veux gérer la hauteur de la ligne il faut implémenter la fonction MeasureItem avec l’aide de classe wizard..
    Et mettre la propriété owner draw variable dans les ressources.
    J’ai mis a jour mon exemple sur mon domaine.


  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    mille merci!!!!

    tu peux pas savoir comme je suis content que cela marche. je commencai a désespérer.

    encore merci, merci, merciiiiiiiiiiiii

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    c'est encore moi avec ma list box

    j'ai un petit soucis daffichage pas tres beau.
    ma liste box a le fond bleu et le bandeau de selection, bleu clair.
    quand je descend dans ma list en continu en gardant le bouton fleche bas appuyé, je fais le traitement suivant:
    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 CIHMListeDlg::OnSelchangeListbox() 
    {
    	// TODO: Add your control notification handler code here
     
    	m_iCurrentselection=m_MyListBox.GetCurSel( );
    	if(m_iCurrentselection>m_iPrecSelection)//on descend dans la liste
    	{
    		m_MyListBox.SetCurSel(m_iCurrentselection+2);
    		m_MyListBox.SetCurSel(m_iCurrentselection-2);
    		m_iPrecSelection=m_iCurrentselection;
    		m_MyListBox.SetCurSel(m_iCurrentselection);
    	}else//on monte
    	{
    		m_MyListBox.SetCurSel(m_iCurrentselection-2);
    		m_MyListBox.SetCurSel(m_iCurrentselection+2);
    		m_iPrecSelection=m_iCurrentselection;
    		m_MyListBox.SetCurSel(m_iCurrentselection);
    	}	
    }
    ca sert juste a avoir deux éléments visibles en haut et en bas quand je me deplace dans la liste (histoire de voir les prochains choix en avance).

    mais seulement on appercoit le sintillement créé par ses allées retour

    ce que j'aimerai faire c'est :
    quand je detecte un changement de selection, je fait mes déplacements sans les afficher et une fois que c'est fini j'affiche ma list box dans son etat final. ca eviterai de voir ces flash.

    je sais pas si du double buffering c'est possible ici car je n'utilise pas de dessin ou de bitmap mais un composant listbox perso...

    ou alors si quelqu'un a une idée pour toujour laisser deux éléments de libre en haut et en bas de ma liste box... sachant que si on arrive au bout de la liste on doit pouvoir selectionner les deux derniers éléments.

    merci.

  17. #17
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    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 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Je pense que le plus efficace serait de poster le message OnVScroll() sur ta listBox, mais je ne sais quels effets de bords ça peut engendrer. Faut tester...

  18. #18
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu peux essayer un SetRedraw(FALSE);
    puis a la fin SetRedraw(); suivit d'un UpdateWindow();

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    hello a tous,

    l'idée du SetRedraw a l'air tres bien mais le defilement ne se fait plus correctement au nivo graphique:
    si je descend dans ma list box, c'est juste les elements en surbrillance en bas qui change.
    en gros ca affiche:

    • 4
      5
      6
      7
      8
      15
      16


    au lieu de

    • 10
      11
      12
      13
      14
      15
      16


    pourtant les premiere lignes devraient changer aussi meme si le bandeau de selection ne les survole pas

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Points : 26
    Points
    26
    Par défaut
    j'ai remplacé la fonction UpdateWindow() par redrawWindow()
    j'ai bien l'affichage de ma liste correctement mais helas j'ai des clignotement a chaque changement d'objet dans ma liste :/

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 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