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
    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 [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
    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
    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 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�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    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 295
    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
    Par d�faut
    salut,
    voir cet exemple tres simple fait d'apres la faq:
    http://farscape.developpez.com/Sampl...tomListBox.zip


  6. #6
    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 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
    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
    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
    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
    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
    c'est exactement ca,

    merci tu me rassures,

    ouf!

  10. #10
    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
    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
    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
    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 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
    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'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
    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
    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
    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
    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
    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�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    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 295
    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
    Par d�faut
    salut,
    tu peux essayer un SetRedraw(FALSE);
    puis a la fin SetRedraw(); suivit d'un UpdateWindow();

  19. #19
    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
    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
    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 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