Charger un BMP avec une OpenFileDialog et l'afficher dans un pictureBox .

Signaler
Messages postés
3
Date d'inscription
dimanche 24 mars 2002
Statut
Membre
Dernière intervention
22 octobre 2003
-
Messages postés
2
Date d'inscription
samedi 5 février 2005
Statut
Membre
Dernière intervention
28 juin 2007
-
Bonjour à tous,

Je ne suis pas un spécialiste du C++ et des MFC et je souhaiterais comprendre ce qui ne va pas dans mon programme.
Je voudrais que celui-ci affiche une image BMP dans un picture box après que l'utilisateur l'ai choisi via une boite de type OpenFileDialog. Ceci ne doit, je pense, pas etre trop difficile à effectuer dans la mesure ou la meme chose en VB ou Csharp est simplissime.
Voici mon code :

void CGestionImageDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
// m_image = nomImage;
// UpdateData(FALSE);
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CGestionImageDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

/// Chargement de l'image

void CGestionImageDlg::OnButtonParcour()
{
// TODO: Add your control notification handler code here
// TODO: Add your control notification handler code here

UpdateData(TRUE); // Récup de l'état des autres zones de saisie
// Définition des filtres pour l'ouverture des fichiers

char szFilters[]= "Images Bitmap (*.bmp)|*.bmp,*.BMP|Tout les fichiers (*.*)|*.*||";

// Création de la boite de dialogue d'ouverture de fichiers
CFileDialog dialogOuvrir (TRUE, "", "*.bmp", OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);

// Affichage de la boite de dialogue
// Affichage du bitmap dans le PictureBox de la feuille
if( dialogOuvrir.DoModal ()==IDOK )
{
CString cheminImage = dialogOuvrir.GetPathName();

// Ouverture et lecture du fichier
// Récupération du handle de l'iamge chargée

CWnd * hWndViewer = this->GetDlgItem(IDC_STATIC_PICTURE);
CDC * dcControlePicture = hWndViewer->GetDC ();
CString nomImage = dialogOuvrir.GetFileName ();

// Chargement du bitmap

HBITMAP hBitmap = (HBITMAP)LoadImage( 0, dialogOuvrir.m_ofn.lpstrFileTitle, IMAGE_BITMAP, 0,0, LR_LOADFROMFILE| LR_CREATEDIBSECTION | LR_DEFAULTSIZE);

// Associer IMAGE au control PictureBox

hWndViewer->SendMessage( STM_SETIMAGE,
(WPARAM) IMAGE_BITMAP,
(LPARAM) hBitmap );

//On change le titre de la feuille avec le nom du Fichier

this->m_cheminImage= dialogOuvrir.m_ofn.lpstrFile;

SetWindowText(nomImage);

UpdateData (FALSE);
}
return;

}

Ceci ne créé aucun messages d'eereur, mais au final l'image ne s'affiche pas. Je pense que mon probleme se situe autour de la fonction LoadImage(...), mais je ne vois pas ou et ceux malgré mes recherches (MSDN, Livres, Forums...)

Si quelqu'un a une idée ou une explication, j'en serais très heureux.

A++ et merci d'avance
Dragoon

4 réponses

Messages postés
584
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
29 mai 2015

Plusieurs choses:
- d'abord évite d'envoyer un code dont la moitié ne sert à rien!

- pour ton prog, il faut que tu aies le type Bitmap à ton image (utilise l'interface de Visual C++ pour ça).

- De plus remplace ta déclaration de hWndViewer par :
CStatic * hWndViewer = (CStatic*) GetDlgItem(IDC_STATIC_PICTURE);


- Et SendMessage n'est pas utile dans ce cas là (c'est même pour les éviter qu'on utilise les MFC) :
remplace le par
hWndViewer->SetBitmap(hBitmap);


Voilà!
Messages postés
3
Date d'inscription
dimanche 24 mars 2002
Statut
Membre
Dernière intervention
22 octobre 2003

Merci beaucoup pour la réponse Garslouche.

Mon probleme reste pourtant le même, a savoir que mon BMP ne s'affiche pas, je pense que mon problème réside dans la ligne suivante

HBITMAP  hBitmap = (HBITMAP)LoadImage( 0, file.GetFileName(), IMAGE_BITMAP, 0,0,  LR_LOADFROMFILE| LR_CREATEDIBSECTION | LR_DEFAULTSIZE);


car quand je teste avec une clause if du type :

if (! hBitmap)
{
MessageBox ("Raté");
}


qui me permet de tester si le HBITMAP contient quelque chose , j'ai toujours mon messagebox qui s'affiche.

Ceci dit je ne comprends toujours pas pourquoi cela ne marche pas.

Merci beaucoup, a++.

A++
Dragoon
Messages postés
3
Date d'inscription
dimanche 24 mars 2002
Statut
Membre
Dernière intervention
22 octobre 2003

Ca Marche, ton truc etait parfait Garslouche. MERCI BEAUCOUP.
A++
Dragoon
Messages postés
2
Date d'inscription
samedi 5 février 2005
Statut
Membre
Dernière intervention
28 juin 2007

Par contre moi je n'y arrive toujours pas jai copier le code de dragoon et fait les modif demandé par garslouche ais rien a faire il n'y a pas d'erreur explicite mai ne m'affiche toujours pas l'image y'a tilm des headers a mettre ou otre chose a faire pouyr ke cela fonctionne