Salut tt le monde,
Comment récupérer l'image contenue dans le contrôle "Picture" ds 1 FormV ? J'essaye la méthode
Mais ça ne marche pas.Code:
1
2 CStatic* ControleQuiContientImage (CStatic*) GetDlgItem(ControleID);
Version imprimable
Salut tt le monde,
Comment récupérer l'image contenue dans le contrôle "Picture" ds 1 FormV ? J'essaye la méthode
Mais ça ne marche pas.Code:
1
2 CStatic* ControleQuiContientImage (CStatic*) GetDlgItem(ControleID);
Salut
Apparemment tu peux tester le type d'image
Code:
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");
Merci ! :D
Si celà te convient, pense au tag [Resolu] en bas à gauche de l'écran je crois.
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.
En principe, le contrôle d'ID IDC_STATIC appartient bien à ma FormView, donc il semble que l'application ne le trouve pas.Code:
1
2 CStatic* wndImageHolder = (CStatic *) GetDlgItem(IDC_STATIC);
:?:
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)
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.
Peux-tu poster le code complet de la fonction où tu fais ce test, as-tu plusieurs boîtes de dialogues dans ton projet ?
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:
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; }
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 :D , mais par contre je n'arrive pas à récupérer l'image :( .Citation:
Envoyé par Trap D
Code:
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);
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 ?
[/edit]Code:
1
2
3
4
5 HBITMAP hBitmap = wndImageHolder->GetBitmap(); LPBITMAP lpBitmap = (LPBITMAP) hBitmap; m_bitmapImage.CreateBitmapIndirect(lpBitmap); BITMAP pBitMap; m_bitmapImage.GetBitmap(&pBitMap);
Oui. Je vais essayer avec 1 Dialog. J'ai utilisé la fonctionCitation:
Envoyé par Trap D
Ensuite, j'essaye d'initialiser 1 objet CBitmap à partir du handle obtenu. Mais l'initialisation plante.Code:HBITMAP CStatic::GetBitmap( ) const;
Pareil avec 1 CDialog, ça plante aussi. Je me demande où peut être le pb. :?
Je pense que ça vient de ta conversion LPBITMAP lpBitmap = (LPBITMAP) hBitmap;
Fouille de ce côté là, moi je ne connais pas bien.
Je crois que j'ai trouvé. :D
C'est 1 peu compliqué, mais bon ça marche...Code:
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); /*...*/ }
Tu as raison, cette conversion est foireuse.Citation:
Envoyé par Trap D
J'étais sur la même piste mais tu as été plus vite :bravo:
:chin:Citation:
Envoyé par Trap D