Bonjour,
Je réalise actuellement un projet de traitement d'image. Je travaille sur l'interface graphique et utilise Visual Sutudio 2005 et ses MFCs (projet boite de dialogue).
L'interface doit affiché deux images (origine et résultat), pour cela j'ai utilisé deux "Picture Control" ou CStatic.
En suivant la FAQ et des exemples que j'ai trouvés, je suis arrivé à afficher les 2 images dans mon interface, mais lors d'un refresh (diminution puis réagrandissement) les deux cstatics affichent la dernière image solicitée.
En essayant de débuger mon code, je m'appercois que ma fonction OnDraw() ne sauvegarde pas les bons paramètres pour la mise en mémoire de l'image non solicitée.
Si vous aviez des suggestions sur les modifications qu'il faut que j'effectue pour avoir un affichage correcte.
Voici un des evenements sur lequel j'appelle la fonction OnDraw(), les deux étant similaire :
et ma fonction OnDraw() :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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 void CTEST_BDDDlg::OnCbnSelchangeCombo() { // TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle // Récupère le nom du fichier ouvert int nIndex = m_cImage.GetCurSel(); //pour l'affichage de l'Image dans la Dlg if((nIndex != LB_ERR)) { m_cImage.GetLBText( nIndex,m_sPathImage ); //AfxMessageBox(m_sPathImage); // Vérification que le chemin est bien retourné CImageBMP XXX (m_sPathImage); // Chargement de l'image dans le handle du bitmap HBITMAP hBitmapInit; //Handle sur un bitmap (Adresse) HINSTANCE hinst = AfxGetInstanceHandle(); hBitmapInit = (HBITMAP)LoadImage(hinst, m_sPathImage, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // Récupération if( hBitmapInit == NULL) { CString ERR("Erreur codage, est ce un fichier au format BMP ?"); AfxMessageBox(ERR,MB_ICONERROR | MB_OK); } else { //Recupere la taille de l'image SIZE size = GetDimensionBMP(hBitmapInit); m_iWidthImageBMP = size.cx; m_iHeightImageBMP = size.cy; //Recupére la taille de la fenetre d'affichage pour dimensionner l'image a celle ci CRect rectWinAffichage; m_OpenImage.GetWindowRect(rectWinAffichage); int iLargeurS = rectWinAffichage.Width(); int iHauteurS = rectWinAffichage.Height(); //Charge l'image avec redimensionnement à la taille de la zone d'affichage m_hBitmapOrigine = (HBITMAP)LoadImage(hinst, m_sPathImage, IMAGE_BITMAP, iLargeurS, iHauteurS, LR_LOADFROMFILE); //recupere le bitmap depuis un fichier //Recupere le DC de la zone d'affichage CDC* pDC = m_OpenImage.GetDC(); m_dcMem.DeleteDC(); //Supprime le DC si il a deja été selectionné avant m_dcMem.CreateCompatibleDC(pDC); // Sélection du bitmap dans le DC mémoire et sauvegarde de l'ancien m_dcMem.SelectObject(m_hBitmapOrigine); //Dessine dans la zone d'affichage OnDraw(pDC); //m_cTraitements.ResetContent(); m_cTraitements.EnableWindow(TRUE); } } }
Merci pour votre aide.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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 void CTEST_BDDDlg::OnDraw(CDC* pDC) { ASSERT_VALID(pDC); // Pour l'image d'ORIGINE // ---------------------- //Recupére la taille de la fenetre d'affichage pour dimensionner l'image a celle ci CRect rectImageORG; m_OpenImage.GetWindowRect(rectImageORG); int iWidthORG = rectImageORG.Width(); int iHeightORG = rectImageORG.Height(); // Crée un DC en mémoire compatible avec celui d'affichage CDC dcMemoryORG; dcMemoryORG.CreateCompatibleDC(pDC); CBitmap bmpORG; bmpORG.CreateCompatibleBitmap(pDC, iWidthORG, iHeightORG); // Selectionne le bitmap dans le DC mémoire CBitmap* pOldBitmapORG = dcMemoryORG.SelectObject(&bmpORG); if (m_hBitmapOrigine != NULL) { //Recopie dans le DC en mémoire le DC de l'image BMP dcMemoryORG.BitBlt(0,0, iWidthORG, iHeightORG, &m_dcMem, 0, 0, SRCCOPY); // Copie les bits depuis le DC en mémoire vers // le DC d'affichage où on doit dessiner. pDC->BitBlt(0,0, iWidthORG, iHeightORG, &dcMemoryORG, 0, 0, SRCCOPY); dcMemoryORG.SelectObject(pOldBitmapORG); } // Pour l'image RESULTAT // --------------------- // Recupére la taille de la fenetre d'affichage pour dimensionner l'image a celle ci CRect rectImageRES; m_ResultatImage.GetWindowRect(rectImageRES); int iWidthRES = rectImageRES.Width(); int iHeightRES = rectImageRES.Height(); // Crée un DC en mémoire compatible avec celui d'affichage CDC dcMemoryRES; dcMemoryRES.CreateCompatibleDC(pDC); CBitmap bmpRES; bmpRES.CreateCompatibleBitmap(pDC, iWidthRES, iHeightRES); // Selectionne le bitmap dans le DC mémoire CBitmap* pOldBitmapRES = dcMemoryRES.SelectObject(&bmpRES); if (m_hBitmapOrigine != NULL) { //Recopie dans le DC en mémoire le DC de l'image BMP dcMemoryRES.BitBlt(0,0, iWidthRES, iHeightRES, &m_dcMem, 0, 0, SRCCOPY); // Copie les bits depuis le DC en mémoire vers // le DC d'affichage où on doit dessiner. pDC->BitBlt(0,0, iWidthRES, iHeightRES, &dcMemoryRES, 0, 0, SRCCOPY); dcMemoryRES.SelectObject(pOldBitmapRES); } }