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 :

Récupérer 1 image insérée ds 1 contrôle "Picture"


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 14
    Points
    14
    Par défaut Récupérer 1 image insérée ds 1 contrôle "Picture"
    Salut tt le monde,

    Comment récupérer l'image contenue dans le contrôle "Picture" ds 1 FormV ? J'essaye la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CStatic* ControleQuiContientImage (CStatic*) GetDlgItem(ControleID);
    Mais ça ne marche pas.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut

    Apparemment tu peux tester le type d'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
    18
    19
    20
    21
    22
    23
    DWORD st = ((CStatic *)GetDlgItem(IDC_STATIC))->GetStyle();
    if ((st & SS_ICON)    == SS_ICON   )
    {
      AfxMessageBox("SS_ICON");
      HICON icon = ((CStatic *)GetDlgItem(IDC_STATIC))->GetIcon();
      ......................
    }
    else
    if  ((st & SS_BITMAP) == SS_BITMAP)
    {
      AfxMessageBox("SS_BITMAP");
      HBITMAP bitmap = ((CStatic *)GetDlgItem(IDC_STATIC))->GetBitmap();
      ............................................
    }
    else
    if  ((st & SS_ENHMETAFILE) == SS_ENHMETAFILE)
    {
      AfxMessageBox("SS_ENHMETAFILE");
      HENHMETAFILE mtf = ((CStatic *)GetDlgItem(IDC_STATIC))->GetEnhMetaFile( );
      ............................................
    }
    else
      AfxMessageBox("pas une image");

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Merci !

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Si celà te convient, pense au tag [Resolu] en bas à gauche de l'écran je crois.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    J'ai 1 petit pb. L'appel de la méthode GetDlgItem() me renvoie 1 pointeur nul. Pourtant, j'ai bien vérifié l'existence du contrôle CStatic.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CStatic* wndImageHolder = (CStatic *) GetDlgItem(IDC_STATIC);
    En principe, le contrôle d'ID IDC_STATIC appartient bien à ma FormView, donc il semble que l'application ne le trouve pas.

    :

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    L'id IDC_STATIC n'identifie pas forcement ton control.
    Alors conseil: change l'id de ton control static de manière à lui donner quelque chose de plus expressif (particulier)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    J'ai associé dans l'éditeur de ressources la valeur numérique IDC_IMAGE_CONTAINER à mon contrôle statique, mais la fonction GetDlgItem me renvoie toujours 1 pointeur nul.

    J'ai pensé à surcharger la fonction DoDataExchange(), mais je ne trouve pas 1 DDX_Image.

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Peux-tu poster le code complet de la fonction où tu fais ce test, as-tu plusieurs boîtes de dialogues dans ton projet ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    En gros, j'ai créé 1 projet MFC avec AppWizard. Dans ma FormView, j'ajoute 1 image, c'est tout. Dans la méthode OnCreate(), j'essaye de récupérer 1 pointeur sur l'image.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int CEssaiView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
       if (CFormView::OnCreate(lpCreateStruct) == -1) return -1;
     
      // TODO: Add your specialized creation code here 
     
      // Je récupère le contrôle statique :
      CStatic* wndImageHolder = 
          (CStatic *) GetDlgItem  (IDC_IMAGE_CONTAINER);
     
      return 0;
    }

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    C'est peut-être un peu tôt dans le OnCreate, tu ne peux pas essayer "plus tard" ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Trap D
    C'est peut-être un peu tôt dans le OnCreate, tu ne peux pas essayer "plus tard" ?
    Je vois ce que tu veux dire. J'ai essayé dans la fonction OnInitialUpdate() : j'obtient 1 pointeur non NULL , mais par contre je n'arrive pas à récupérer l'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
    18
     
    CStatic* wndImageHolder = 
      (CStatic *) GetDlgItem(IDC_IMAGE_CONTAINER);
    if (NULL == wndImageHolder) return true;
     
    // Jusqu'ici tout (semble aller) va bien
     
    DWORD st = wndImageHolder->GetStyle();
    if  ((st & SS_BITMAP) != SS_BITMAP) return true;
    HBITMAP hBitmap = wndImageHolder->GetBitmap();       
    LPBITMAP lpBitmap = (LPBITMAP) hBitmap;    
    m_bitmapImage.CreateBitmapIndirect(lpBitmap);
    BITMAP pBitMap;
    m_bitmapImage.GetBitmap(&pBitMap);
    // J'obtient 1 taille nulle (0,0), donc pb 
    m_sizeImage.cx = pBitMap.bmWidth;
    m_sizeImage.cy = pBitMap.bmHeight;
    CFormView::SetScrollSizes(MM_TEXT, m_sizeImage);

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    J'ai fait le test (de mon bout de programme) avec un "DialogBased" programme, et ça fonctionne bien dans le OnInitDialog().

    [edit]
    Tu es sûr de ces lignes de code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HBITMAP hBitmap = wndImageHolder->GetBitmap();       
    LPBITMAP lpBitmap = (LPBITMAP) hBitmap;   
    m_bitmapImage.CreateBitmapIndirect(lpBitmap);
    BITMAP pBitMap;
    m_bitmapImage.GetBitmap(&pBitMap);
    [/edit]

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Trap D
    J'ai fait le test (de mon bout de programme) avec un "DialogBased" programme, et ça fonctionne bien dans le OnInitDialog().

    [edit]
    Tu es sûr de ces lignes de code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HBITMAP hBitmap = wndImageHolder->GetBitmap();       
    LPBITMAP lpBitmap = (LPBITMAP) hBitmap;   
    m_bitmapImage.CreateBitmapIndirect(lpBitmap);
    BITMAP pBitMap;
    m_bitmapImage.GetBitmap(&pBitMap);
    [/edit]
    Oui. Je vais essayer avec 1 Dialog. J'ai utilisé la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HBITMAP CStatic::GetBitmap( ) const;
    Ensuite, j'essaye d'initialiser 1 objet CBitmap à partir du handle obtenu. Mais l'initialisation plante.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Pareil avec 1 CDialog, ça plante aussi. Je me demande où peut être le pb.

  15. #15
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je pense que ça vient de ta conversion LPBITMAP lpBitmap = (LPBITMAP) hBitmap;
    Fouille de ce côté là, moi je ne connais pas bien.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Je crois que j'ai trouvé.

    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
     
    void CEssaiView::OnInitialUpdate() {
     
    /*...*/
     
    // Donc là, je récupère 1 handle de l'image contenue ds le contrôle 
    // statique :
    HBITMAP hBitmap = wndImageHolder->GetBitmap();       
     
    // Je récupère 1 pointeur sur 1 objet de type CBitmap à l'aide de la 
    // méthode FromHandle() :
    CBitmap bitmap;
    CBitmap *pbitmap = bitmap.FromHandle(hBitmap);
     
    // Je récupère 1 structure BITMAP à partir du pointeur obtenu 
    // précédemment :
    BITMAP BitMap;	
    pbitmap->GetBitmap(&BitMap);
     
    m_sizeImage.cx = BitMap.bmWidth;
    m_sizeImage.cy = BitMap.bmHeight;
     
    // A partir de la structure obtenue, j'initialise mon objet CBitmap :
    m_bitmapImage.CreateBitmapIndirect(&BitMap);
     
    /*...*/
    }
    C'est 1 peu compliqué, mais bon ça marche...

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Trap D
    Je pense que ça vient de ta conversion LPBITMAP lpBitmap = (LPBITMAP) hBitmap;
    Fouille de ce côté là, moi je ne connais pas bien.
    Tu as raison, cette conversion est foireuse.

  18. #18
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    J'étais sur la même piste mais tu as été plus vite

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Trap D
    J'étais sur la même piste mais tu as été plus vite

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

Discussions similaires

  1. [auto-incrémentation] récupérer la valeur insérée
    Par laffreuxthomas dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 16/01/2005, 16h53
  2. [Swing] récupérer une image d'un composant
    Par klemouf dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 16/09/2004, 11h24

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