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 :

[CImageList] Problème avec GetImageInfo


Sujet :

MFC

  1. #1
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut [CImageList] Problème avec GetImageInfo
    Salut !

    J'utilise un CImageList pour afficher des images dans une CComboBox : ça permets à l'utilisateur de mon application de sélectionner une image.

    Cette image je veux par la suite pouvoir la récupérer et l'afficher en réajustant dynamiquement sa taille. Je n'ai malheureusement pas trouvé de méthode de CImageList la permettant. Sachant comment le faire avec un CBitmap je suis donc parti sur une solution durant laquelle je construirai un CBitmap connaissant la CImageList et l'index de l'image qui m'intéresse.
    J'ai donc utiliser la fonction GetImageInfo qui est sensée me permettre de remplir la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct _IMAGEINFO {
       HBITMAP hbmImage;
       HBITMAP hbmMask;
       int Unused1;
       int Unused2;
       RECT rcImage;
    } IMAGEINFO, *LPIMAGEINFO;
    A partir de là je récupére hbmImage pour créer un CBitmap avant de l'afficher comme je le souhaite.

    J'ai donc tenté de faire comme ça, cependant bien que le CRect rempli dans la stucutre soit cohérent avec ce que je peux attendre, hbmImage contient (selon Visual) "Expression cannot be evaluated" ... moi pas comprendre ...

    Voici mon code (même si je ne pense pas que ça puisse trop aider) :
    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
            IMAGEINFO Info;
     
            this->m_listeimage.GetImageInfo(this->idPicto, &Info);
     
            //get a memory dc object
            CDC dcMem2;
            //create a compatible dc
            dcMem2.CreateCompatibleDC(dc);    // Select the bitmap into the in-memory DC
            //Select the bitmap into the dc
            CBitmap * bm;
            bm = CBitmap::FromHandle(Info.hbmImage);
            CBitmap* pOldBitmap = dcMem2.SelectObject(bm);
     
            dc->TransparentBlt(
                lpDrawItemStruct->rcItem.left+2,
                lpDrawItemStruct->rcItem.top+6,
                (Info.rcImage.right-Info.rcImage.left)*3/5,
                (Info.rcImage.right-Info.rcImage.left)*3/5,
                &dcMem2,
                Info.rcImage.left,
                Info.rcImage.top,
                Info.rcImage.right-Info.rcImage.left,
                Info.rcImage.bottom-Info.rcImage.top,
                NULL);
    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    HBITMAP est un handle donc une structure opaque. C'est pour ça que le debugger ne peut te dire ce qu'il y a à l'intérieur.
    Que te retourne CBitmap::FromHandle(Info.hbmImage); ? Si c'est nul, tu peux peut être essayé avec un Attach/Detach ?

  3. #3
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Que te retourne CBitmap::FromHandle(Info.hbmImage); ? Si c'est nul, tu peux peut être essayé avec un Attach/Detach ?
    justement il ne me retourne pas de valeur nulle :s

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par TheGzD Voir le message
    justement il ne me retourne pas de valeur nulle :s
    Salut,
    Je ne comprend pas alors quel est ton problème ? bm est un pointeur valide ? dcMem2.SelectObject(bm) retourne un pointeur valide ?

  5. #5
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    bm est un pointeur valide ?
    oui

    dcMem2.SelectObject(bm) retourne un pointeur valide ?
    oui

    Je ne comprend pas alors quel est ton problème ?
    justement il ne devrait pas y en avoir, mais dès que je veux dessiner le bitmap il ne se produit rien ...

    J'ai trouvé un post de quelqu'un qui a vraisemblablement le même problème :
    http://www.programmersheaven.com/mb/...list/?S=B20000

    sans réponses ...

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Commençons par la base...
    1/Les coordonnées sont bonnes ? (zone affichable, top-left<bottom-right, etc...).
    2/Qu'est ce que dc ? C'est à dire dans quelle fonction tu te trouves pour le rendu ?

  7. #7
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    1/ oui, si j'utilise ces coordonnés pour tracer un rectangle il met bien en évidence la zone dans laquelle je souhaite afficher l'image.

    2/je fais ça dans DrawItem d'un bouton, et je le récupère de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CDC * dc = CDC::FromHandle(lpDrawItemStruct->hDC);

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Ton bouton a bien le style BS_OWNERDRAW ?

  9. #9
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Oui d'ailleurs tous les autres constituants de ce bouton s'affichent très bien. En particuliers d'autres images, mais ces dernières ne proviennent pas d'un CImageList

    D'ailleurs je précise que les coordonnées correctes d'affichages sont bien celles fournies par IMAGEINFO ...

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Pas sur que ça vienne de là, mais tu as une erreur sur la hauteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
           dc->TransparentBlt(
                lpDrawItemStruct->rcItem.left+2,
                lpDrawItemStruct->rcItem.top+6,
                (Info.rcImage.right-Info.rcImage.left)*3/5,
    //            (Info.rcImage.right-Info.rcImage.left)*3/5,
                (Info.rcImage.bottom-Info.rcImage.top)*3/5,
                
                &dcMem2,
                Info.rcImage.left,
                Info.rcImage.top,
                Info.rcImage.right-Info.rcImage.left,
                Info.rcImage.bottom-Info.rcImage.top,
                NULL);

  11. #11
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Héhé bien vu, mais ça n'a en effet rien changé sur le problème premier.

    Après de nombreux essais j'ai finalement réussi à pondre le code tordu suivant qui fait bien ce que je veux :
    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
            IMAGEINFO Info;
     
            this->m_listeimage.GetImageInfo(this->idPicto, &Info);
     
            //get a memory dc object
            CDC dcMem2;
            //create a compatible dc
            dcMem2.CreateCompatibleDC(dc);    // Select the bitmap into the in-memory DC
     
            CBitmap bm;
            bm.CreateCompatibleBitmap (dc, ((CRect)(Info.rcImage)).Width(), ((CRect)(Info.rcImage)).Height());        
            CBitmap* pOldBitmap = dcMem2.SelectObject(&bm);
     
            this->m_listeimage.DrawIndirect(&dcMem2, this->idPicto, CPoint(0, 0), CSize(((CRect)(Info.rcImage)).Width(), ((CRect)(Info.rcImage)).Height()), CPoint(0, 0));
     
            dc->TransparentBlt(
                lpDrawItemStruct->rcItem.left+2,
                lpDrawItemStruct->rcItem.top+6,
                (Info.rcImage.right-Info.rcImage.left)*3/5,
                (Info.rcImage.bottom-Info.rcImage.top)*3/5,
                &dcMem2,
                0,
                0,
                (Info.rcImage.right-Info.rcImage.left),
                (Info.rcImage.bottom-Info.rcImage.top),
                RGB(255,255,255));
     
            dcMem2.SelectObject(pOldBitmap);
    CImageList dont la création avait été la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->m_listeimage.Create(nID,30,ILC_MASK,RGB(0,0,0));
    Merci pour le soutien psychologique

  12. #12
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Je marque le sujet comme étant résolu, mais si quelqu'un a une solution plus élégante je suis preneur

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    A titre d'info, ton imagelist est supposée avoir combien de vignettes individuelles ? Car, tu demandais à copier TOUTES les vignettes vers ton bouton. Ce qui veut dire un stretch éventuel et peut être plus rien à afficher ?

  14. #14
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    J'en ai actuellement une 12ène et j'en aurais beaucoup plus dans l'avenir.
    Pour l'instant je ne pense pas qu'il y ait de soucis de ce côté.

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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