Controles images en boucle

Gord21_cs Messages postés 20 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 27 mai 2008 - 25 mai 2004 à 12:57
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 9 juin 2004 à 11:12
Je souhaite créer une fenetre dans laquelle je positionne des images que je numérote IDC_Image_1, IDC_Image_2, ..., IDC_Image_n.
Est-il possible de créer dans mon code une boucle du type :

For (i=1, i<=n, i++)
{
IDC_Image_i.SetWindowPos(...);
}
dans lequel, i est une variable qui me permettra de modifier les propriétés de chaque image.

Merci

Note : je travail sous Visual C++ 6

d.rogo :)

12 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
25 mai 2004 à 13:20
non, faux mettre des IDC_Image_.. dans un tableau ou alors faire en sorte que les Id se suivent et faire :
(IDC_Image_1+i) avec i de 0 à n-1.
0
Gord21_cs Messages postés 20 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 27 mai 2008
26 mai 2004 à 12:20
Merci.

J'ai essayé de mettre (m_Image_1+i) mais l'image perd alors ses propriétés de structure. Comme je débute, c'est peut-être ma facon de faire qui ne va pas.

Je crée une fenetre IDD_FENETRE_DIALOG sur laquelle je positionne des images à la main (ID=IDC_IMAGE_1 (puis 2, 3, ...), TYPE=BITMAP, STYLE=NOTIFY).
Ensuite, à chaque image, j'ajoute une fonction BN_CLICKED ainsi qu'une variable m_IMAGE_1 CATEGORY=CONTROL, TYPE=CSTATIC.

Mon objectif est alors de pouvoir gérer les propriétés de chaque image à partir de mon code (dans des boucles ou dans des procédures).

d.rogo :)
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
26 mai 2004 à 15:43
c'est possible, mais sans utiliser le classwizard.

Dans le .h de la classe, tu défini un tableau de CStatic (dans la zone DialogData, mais en dehors des balises AFX_DIALOG8DATA. :
CStatic m_aImages[IMAGE_COUNT];
IMAGE_COUNT est une constante indiquant le nb d'image.

Ds la fct DoDataExcange, il faut faire le lien entre les Id et les mebres du tableau (en dehors des balise AFX_... également ) :
DDX_Control(pDX, IDC_IMAGES_0, m_aImages[0]);
...

ensuite, dans ton code du peus faire une boucle sur les images.

dans le resource.h", édite-le à la main pour que les Id des images se suivent.
0
Gord21_cs Messages postés 20 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 27 mai 2008
27 mai 2004 à 12:15
Merci pour ton aide. J'ai essayé et ça ne pose pas de pb pendant la compilation. Par contre, lorsque j'execute le .exe, j'ai le message d'ereur suivant "Debug Assertion Failed". Sais tu d'où ça peux venir ?

Quel est la différence entre déclarer en dehors et en dedans des balises AFX_DIALOG8DATA ?

Merci

d.rogo :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gord21_cs Messages postés 20 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 27 mai 2008
27 mai 2004 à 12:22
J'avais une autre question.

Pour résoudre mon pb, j'avais essayé avec une fonction du type :

CStatic Image (int numero)
{
switch(numero)
{
case 1 : return m_Image_1;
...
}
}

Mais j'ai une message lors de la compilation : CStatic ne demande aucun argument !
Pourquoi considere t il Image comme un argument ?

d.rogo :)
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
27 mai 2004 à 20:48
Je ne comprend pas trop l'erreur, mais je crois que tu peut pas retourner directement un CStatic dans une fonction ,faut retourner soit une référrence soit un pointeur.
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
27 mai 2004 à 20:52
déclarer en dehors des balises AFX_DIALOG8DATA évite au classwizard du visual Studio de dire qu'il y a une erreur (en fait il n'y en a pas mais il ne reconnait pas les variables stockées dans des tableaux).

En ce qui concerne le Debug Asseertion Failed, normalement il t'indique le fichier et la ligne de l'erreur. Donne-moi le code autour (si c'est un fichier core de MFC, donne simplement son nom et sa ligne)
0
Gord21_cs Messages postés 20 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 27 mai 2008
1 juin 2004 à 12:20
Merci, J'ai réussi à corriger le Debug Assertion Failed (une faute de frappe).
Par contre, je souhaiterai charger un Bitmap à partir d'un autre Bitmap en modifiant sa taille et son origine (c'est à dire la position du coin supérieur gauche) = prélever un échantillon d'une image.
Pour cela, je pensais utiliser la fonction :
StretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, unsigned long).
Mon problème est que la fonction Image_1.GetBitmap() retourne un HBITMAP et non un HDC (idem pour SetBitmap()).

Comment résoudre ce problème ?
(Quelle fonction retourne un HDC ou quelle fonction pourrait remplacer StretchBlt).

d.rogo :)
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
2 juin 2004 à 14:10
// créé des DC compataibles
HDC hdc = GetDC(NULL);
HDC hDCSrc = CreateCompatibleDC(hdc);
HDC hDCDst = CreateCompatibleDC(hdc);

// sélectionne le bmp source dedans
HBITMAP hOldBmpSrc = (HBITMAP)SelectObject(hDCSrc, hBmpSrc);

// créer le bmp dest
HBITMAP hBmpDst = CreateCompatibleBitmap(hdc, cx, cy);
HBITMAP hOldBmpDst = (HBITMAP)SelectObject(hDCDst, hBmpSrc);

// utiliser StrectBlt:
StretchBlt(hDCDst, xDst, yDst, xDst, yDst, hDCSrc, xSrc, ySrc, cxSrc, cySrc, SRCCOPY);

// libérer les ressources
SelectObject(hDCSrc, hOldBmpSrc);
SelectObject(hDCDst, hOldBmpDst);
DeleteDC(hDCSrc);
DeleteDC(hDCDst);
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
2 juin 2004 à 14:19
petiite erreur :
HBITMAP hOldBmpDst = (HBITMAP)SelectObject(hDCDst, hBmpDst);

et

StretchBlt(hDCDst, xDst, yDst, cxDst, cyDst, hDCSrc, xSrc, ySrc, cxSrc, cySrc, SRCCOPY);
0
Gord21_cs Messages postés 20 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 27 mai 2008
8 juin 2004 à 12:42
Merci,

J'ai essayé, il n'y a pas de problème à la compilation excepté
HDC hdc = GetDC(NULL); que j'ai remplacé par
HDC hdc = NULL;
Par contre, je n'arrive pas à utiliser les fonction GetBitmap() et SetBitmap par la suite.

Donc j'ai modifié mon programme en remplaçant le type des images par FRAME (au lieu de BITMAP) et j'affiche directement mes Bitmap dedans :

...
hdcSrc = IDC_Image_1.GetDC()->GetSafeHdc();
hdcDst = IDC_Image_0.GetDC()->GetSafeHdc();

StretchBlt(hdcDst, x0, y0, cx0, cy0,
hdcSrc, x1, y1, cx1, cy1, SRCCOPY);
...

Cette fonction est appelée lorsque je clique sur un bouton. Au premier clic, il ne se passe rien, par contre au deuxième, mon image source va bien dans mon image destination.
J'ai essayé de corriger ce problème en ajoutant un Invalidate() mais ça ne change rien.

Comment faire pour que l'affichage soit correct du premier coup ?

d.rogo :)
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
9 juin 2004 à 11:12
alors là je vois pas. le invalidate, tu le fais bien sur l'image dest ?
essaye de le faire sur le dialogue . Tu peut aussi essayer en mettant UpdateWindow juste après e Invalidate
0
Rejoignez-nous