Mon image s'efface!!!

cs_tdeco Messages postés 53 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 27 mai 2005 - 25 déc. 2004 à 04:31
cs_tdeco Messages postés 53 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 27 mai 2005 - 26 déc. 2004 à 20:09
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

cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
25 déc. 2004 à 10:03
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)
0
cs_tdeco Messages postés 53 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 27 mai 2005
25 déc. 2004 à 17:28
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
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
25 déc. 2004 à 20:23
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)
0
cs_tdeco Messages postés 53 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 27 mai 2005
26 déc. 2004 à 20:09
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;
0
Rejoignez-nous