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 :

Manipulation d'une CImageList


Sujet :

MFC

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Par défaut Manipulation d'une CImageList
    Bonjour,
    J'ai besoin d'afficher des thumbnails dans une liste.
    Voici mon code qui pour l'instant est censé afficher une simple image :
    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
    		CBitmap *bmp1;
    		CxImage image;
    		CString bmpPath;
    		bmpPath.Format(file_name);
    		bmpPath.Format("%s.bmp",bmpPath.Left(bmpPath.ReverseFind('.')));
    		bmpPath = GetFilePath(bmpPath.GetBuffer(bmpPath.GetLength()));
    		image.Load(bmpPath.GetBuffer(bmpPath.GetLength()), CXIMAGE_FORMAT_BMP);
    		HBITMAP handlebitmap = NULL;
    		handlebitmap = image.MakeBitmap(m_ListFiles.GetDC()->m_hDC);
    		bmp1 = bmp1->FromHandle(handlebitmap);
     
     
    		CImageList imageList;
    		imageList.Create(105,143,ILC_COLOR16,1,5);
    		int imgP=imageList.Add(bmp1,RGB(0,0,0));
     
    		m_ListFiles.SetImageList(&imageList,LVSIL_STATE);
    Tout semble bien se dérouler depuis le débogueur (imageList.Add renvoie bien 0), cependant l'image n'apparait pas dans la liste.
    Je n'arrive pas à trouver la source du problème.

    Faut-il obligatoirement travailler avec une liste vierge, ou ayant certaines caractéristiques spéciales permettant l'insertion d'une imageList ?
    Y'a-t-il une fonction qui m'a échappé qui force l'affichage ?

    J'ai lu dans une discussion que la classe CImageList contenait des bugs, qu'en pensez vous ?

    Merci d'avance pour vos suggestions.

  2. #2
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    quelle est la valeur de imgP après le CImageList::Add ??

    si imgP<0 c'est que ton bitmap n'est pas valide.

    @+

    EDIT: oups j'avais pas tout lu imgP=0

  3. #3
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Comment sais tu que l'image n'apparait pas dans la liste ?

    Si imgP=0 c'est qu'elle a bien été insérée en premiere position.

    Il n'y a pas de bug a ma connaissance, je m'en sers souvent

    @+

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Par défaut
    Hmm je me suis mal exprimé.
    En fait mon problème est que la liste apparait vide. Je ne vois pas d'image lorsque je lance le programme.

    Serait-il possible que tu partages ton code où tu initialises une CListCtrl et CImageList puis remplit tout ça ?

  5. #5
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Ton probleme vient plutot alors de ta CListCtrl ...

    Le code que tu as publié ici est truffé de petites erreurs (ex: GetDC() ou est ReleaseDC()??? = memory leak ; mais c'est hors sujet ), mais il devrait fonctionner ...

    Je ne vois qu'un soucis de CListCtrl après, concernant le paramétrage de tes éléments de la liste.

    @+

  6. #6
    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,
    imageList doit être persistant, et donc devrait être déclaré en tant que donnée membre de la classe fenêtre parent de la ClistCtrl.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Par défaut
    C'est fait farscape, toujours pas de fenêtre pour autant.

    Je vais suivre ton instinct stephdim, et jouer avec les paramètres de la CListCtrl jusqu'à ce que je voie quelque chose. Et oui, j'imagine que mon code n'est pas top, je suis encore débutant et ne me soucie pas trop de la propreté pour l'instant. Je crois que je vais avoir le droit de nettoyer tout mon code lorsque le prog sera (enfin) fonctionnel..

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Par défaut
    Gagné !!!

    Thumbs apparaissent avec le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    //meme code pour  charger bmp1
     
    m_ImageList.Create(150,130, ILC_COLOR24, 0, 1);
    	m_ListFiles.SetImageList(&m_ImageList,LVSIL_NORMAL);
     
    	m_ListFiles.SetRedraw(FALSE);
    	m_ListFiles.DeleteAllItems();
    	m_ImageList.SetImageCount(1);
     
    	m_ImageList.Replace(0, bmp1, NULL);
    	m_ListFiles.InsertItem(0, "thumb1", 0);
    	m_ListFiles.SetRedraw();
    *cogite profondément*

    Si je comprends bien, il ne suffisait pas d'attacher la CImageList a la CListCtrl ? Il faut aussi ajouter des entrées dans la CListCtrl avec InsertItem ? Ensuite à chaque entrée correspond l'image présente dans la ImageList de meme index ?

  9. #9
    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
    oui ,
    tu dois indiquer le numéro de l'index correspondant à l'image et préciser LVIF_IMAGE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nItem=m_ListFilesCtrl.InsertItem(LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM,i,find.GetFileName(),0,0,nImage,n);// stock l'info 0:repertoire 1:fichier

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Par défaut
    Ok merci pour la précision.
    Ca marche tout de suite bien mieux quand on comprend le fonctionnement...

    Maintenant je suis face à un autre problème d'autant plus étrange : mon compilateur m'assure que la classe CListCtrl n'a pas la méthode SetView() alors que celle ci figure dans la MSDN..
    Faut-il que je fasse une mise à jour ?

  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
    tu te trompes de doc, tu regardes la doc de WFC.
    cherches CListCtrl et non ListCtrl dans l'index.

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Par défaut
    Bof je crois que c'est la MSDN online qui raconte n'importe quoi.
    -----> http://msdn2.microsoft.com/en-us/lib...8k(VS.80).aspx

    (Et oui il y a encore des gens qui doivent aller online pour accéder a la msdn...)

    D'après ce que j'ai compris il faut utiliser la fonction win32 SetWindowLong.

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Par défaut
    Bon je met la solution, ça pourra éventuellement servir à quelqu'un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //Pour passer la CListCtrl en mode vue "détail" depuis le mode vue "icone"
     
    LONG zob = SetWindowLong( m_ListFiles.m_hWnd, GWL_STYLE,(::GetWindowLong(m_ListFiles.m_hWnd,GWL_STYLE)&~LVS_ICON)|LVS_REPORT);
    Et inversement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Pour passer en vue "icone" depuis la vue "détail"
    LONG zob = SetWindowLong( m_ListFiles.m_hWnd, GWL_STYLE, (::GetWindowLong(m_ListFiles.m_hWnd,GWL_STYLE)&~LVS_REPORT)|LVS_ICON);
    Pas ce qu'il y a de plus évident, surtout au vu des explications fournies..

  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
    salut,
    la fonction :
    ModifyStyle( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 );
    est plus facile d'utilisation...

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

Discussions similaires

  1. Conseil sur la manipulation d'une string?
    Par Jayceblaster dans le forum Delphi
    Réponses: 6
    Dernier message: 13/07/2006, 14h29
  2. [VB6]Accès et manipulation d'une BD Access sur réseau
    Par moi_leila dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 04/04/2006, 18h48
  3. manipulation d'une liste chainé
    Par sorari dans le forum C++
    Réponses: 1
    Dernier message: 16/03/2005, 12h32
  4. [XSLT] Manipulation d'une String
    Par Eskarina43 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/06/2004, 11h52
  5. Réponses: 2
    Dernier message: 08/10/2002, 18h26

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