Mon image s'efface!!!

Signaler
Messages postés
53
Date d'inscription
dimanche 23 février 2003
Statut
Membre
Dernière intervention
27 mai 2005
-
Messages postés
53
Date d'inscription
dimanche 23 février 2003
Statut
Membre
Dernière intervention
27 mai 2005
-
Bonjour
En fait, j'ai une boite de dialogue avec plusieurs boutons et une zone ou j'affiche une image bmp. Pour afficher l'image, je procède par la façon suivante:
HWND hBouton = GetDlgItem(hDlg_IHM_MAIN, IDC_IMAGE);
HDC hdc = GetDC(hBouton);
Dessiner_Image(hDlg_IHM_MAIN,hdc,&buffer);
ReleaseDC(hDlg_IHM_MAIN,hdc);

hDlg_IHM_MAIN est ma boite de dialogue principale,
IDC_IMAGE l'identifiant de ma zone d'affichage
Dans la fonction "Dessiner_Image" , j'utilise StretchBlt pour dessiner l'image dans le buffer.

Mon image s'affiche bien. J'appuis sur un bouton de l'IHM, je crée alors une autre boite de dialogue. Lorsque je ferme celle-ci , mon image s'est effacé

Quelqu'un peut il m'aider

Merci d'avance

4 réponses

Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Il te faut afficher cette image lorsk tu recois WM_PAINT.

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
Dessiner_Image(hDlg_IHM_MAIN,hdc,&buffer);
EndPaint(hwnd, &ps);
return 0;

Voila, bonnes fetes ;)

+2(p - n)
Messages postés
53
Date d'inscription
dimanche 23 février 2003
Statut
Membre
Dernière intervention
27 mai 2005

Le pb c'est que l'affiche de l'image est commandé par un thread extérieur à la boite de dialogue. Par défaut, au démarrage de l'application, le prog exécute le Cas WM_PAINT ,je px pas placer mon affichage ici, car au début, il n'y a rien dans mon buffer pour l'instant
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Dans ton buffer, il y a koi exactement ? Le chemin de l'image a charger ?
Dans ce cas la, il te suffit de placer 'buffer' en variable global, de modifier son contenu dans ton thread, pis de le charger automatiquement dans ton WM_PAINT, et dans le cas ou la chaine est vide, il te suffit de poser une condition (if (!buffer[0]) ne pas appeler la fonction) a la reception du msg, ou bien de faire ca dans ta fonction :

char buffer[256];

DWORD CALLBACK ThreadProc(..)
{
...
strcpy(buffer, "c:\\monimage.bmp");
...
}

BOOL CALLBACK DlgProc(..)
{
...
case WM_PAINT:
...
//Si tu places la condition a la reception du msg (ce ke je te conseille)
if (buffer[0]) Dessiner_Image(hDlg_IHM_MAIN,hdc,&buffer);
...
}

//Dans le cas ou tu veux placer la condition dans la fonction (ne fais pas ca a mon avis, ca t'evite un appel a une fonction inutil)
int Dessiner_Image(...)
{
...
if (!buffer[0]) return 0;
...
}

Voila, j'espere avoir repondu...

++

+2(p - n)
Messages postés
53
Date d'inscription
dimanche 23 février 2003
Statut
Membre
Dernière intervention
27 mai 2005

Merci de ta réponse, mais cela ne marche toujours pas.
En fait buffer c'est l'image bmp (pixels) ke j'ai stocké auparavant.
Comme tu le conseilles, j'ai ma fonction dessiner dans le cas WM_PAINT, et j'envois un message à l'IHM cycliquement à partir de mon thread, mais l'image s'efface toujours lorsque je clique sur un bouton. Cela vient peut etre de ma fonction dessiner elle-meme?

Voici le code:
case WM_PAINT:
IHM_PaintDialog(hDlg);
HWND hBouton = GetDlgItem(hDlg_IHM_MAIN, IDC_IMAGE);
HDC hdc = GetDC(hBouton);
Dessiner_Image(hDlg_IHM_MAIN,hdc,&buffer);
ReleaseDC(hDlg_IHM_MAIN,hdc);
break;

BOOL Dessiner_Image(HWND hDlg,HDC hDC,ClsEm_CVImage *Em_Img)
{
HDC hdcMem = NULL;
HGDIOBJ hbmOld = NULL;
HBITMAP hBmp_Mem;
BITMAPINFO * pMyBitmapInfo;
BYTE * pImage;

hBmp_Mem = CreateDIBSection(hDC, pMyBitmapInfo, DIB_RGB_COLORS, (void**)&Em_Img, NULL, 0);

hdcMem = CreateCompatibleDC(hDC);
hbmOld = SelectObject(hdcMem, hBmp_Mem); //selection du bitmap
BOOL test = StretchBlt(pdi->hDC,0,0, 0,0,
hdcMem,0,0,Em_Img->GetImageWidth(), Em_Img>GetImageHeight(), SRCCOPY);

DeleteObject(hBmp_Mem);
DeleteDC(hdcMem);
delete [] pMyBitmapInfo;
delete [] pImage;