IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC] probleme de rafraichissement d'une image


Sujet :

MFC

  1. #1
    Membre régulier Avatar de Vestaproman
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2003
    Messages : 95
    Points : 84
    Points
    84
    Par défaut [MFC] probleme de rafraichissement d'une image
    Bonjour,

    Je vous envoie un extrait de code pour ma fonction d'affichage d'une bitmap.
    J'arrive a charger la bitmap et à l'afficher, par contre des que je modifie les propriétés de taille de la fenetre (agrandir...) ou que je mets une fenetre par dessus, l'image n'est pas rafraichie.
    C'est sans doute tout bête mais je ne vois pas bien.

    Merci beaucoup, ce forum est super util

    Jérôme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    void CMainWindow::OnPaint()
    {
       CBitmap *OldBitmap;
       CBitmap *Bitmap;
       CPaintDC dc(this);
     
       CDC *dcMem;
     
       dcMem = new CDC();
       dcMem->CreateCompatibleDC(&dc);
       CBitmap * pOldBitmap=(CBitmap*) dcMem->SelectObject(m_bmpBitmap);
       dc.SetStretchBltMode(HALFTONE);  // ou COLORONCOLOR
       dc.StretchBlt(0,0,1280,1024,dcMem,0,0,1280,1024,SRCCOPY);
    }
     
    void CMainWindow::OnFichierOuvrir() 
    {
       // TODO: Add your command handler code here
       OuvrirImage=TRUE;
       //this->Invalidate(false);
       // Crée un filtre pour la boite de dialogue Ouverture 
       static char BASED_CODE szFilter[]="Fichiers Bitmap (*.bmp)|*.bmp||";
     
       //Cree la boite de dialogue Ouverture
       CFileDialog m_ldFile(TRUE, ".bmp", m_sBitmap, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter);
     
       // Affiche la boite de dialogue Ouverture et capture le résultat
       if(m_ldFile.DoModal()==IDOK)
       {
          // Recupère le nom de fichier sélectionner
          m_sBitmap=m_ldFile.GetPathName();
          //Charge le fichier Bitmap
          HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),   m_sBitmap, IMAGE_BITMAP, 0,0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
     
          //AVons nous un handle valide pour l'image chargé
          if(hBitmap)
          {
             //Supprime le bitmap courant
             if(m_bmpBitmap.DeleteObject())
             {
                m_bmpBitmap.Detach();}
                m_bmpBitmap.Attach(hBitmap);
             }
       }
    }
    [Balises [CODE] ajoutées par gl, merci d'y penser à l'avenir]

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    c'est quoi la classe de base de CMainWindow?
    il est preferable d'utiliser la fonction virtuelle OnDraw pour le mecanisme d'affichage dans une view surtout si tu veux editer par la suite ton image.

  3. #3
    Membre régulier Avatar de Vestaproman
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2003
    Messages : 95
    Points : 84
    Points
    84
    Par défaut
    Rebonjour,

    J'ai retravaillé mon code
    J'ai crée une appli SDI
    dans EFSViewerVCDoc, j'ai ma fonction d'ouverture de fichier
    dans EFSViewerVCView, j'ai la fonction ONDraw

    Quand j'ouvrir une image, au départ elle n'apparait pas, je suis obliger de bouger la fenêtre pour la voir apparaitre.
    Par contre une fois qu'elle a bien voulu apparaitre, elle se redessine bien quand j'agrandi la fenêtre ou autre. Seul souci la barre de tache ne se redessine plus.
    Pouvez m'aider

    Merci beaucoup

    Jérôme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    void CEFSViewerVCView::OnDraw(CDC* pDC)
    {
       CEFSViewerVCDoc* pDoc = GetDocument();
       ASSERT_VALID(pDoc);
       // TODO: add draw code for native data here
       if (pDoc->m_OuvrirImage)
       {
          BITMAP bm;
          pDoc->m_bmpBitmap.GetBitmap(&bm);
     
          CDC dcMem;
     
          dcMem.CreateCompatibleDC(pDC);
          CBitmap * pOldBitmap=(CBitmap*)dcMem.SelectObject(pDoc->m_bmpBitmap);
          CRect lRect;
          GetClientRect(lRect);
          lRect.NormalizeRect();
          pDC->SetStretchBltMode(HALFTONE);  
          pDC->StretchBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
     
          this->Invalidate(false);
       }
    }
     
    void CEFSViewerVCDoc::OnFileOpen() 
    {
       // TODO: Add your command handler code here
     
       // Crée un filtre pour la boite de dialogue Ouverture 
       static char BASED_CODE szFilter[]="Fichiers Bitmap (*.bmp)|*.bmp||";
     
       //Cree la boite de dialogue Ouverture
       CFileDialog m_ldFile(TRUE, ".bmp", m_sBitmap, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter);
     
       // Affiche la boite de dialogue Ouverture et capture le résultat
     
       if(m_ldFile.DoModal()==IDOK)
       {
          // Recupère le nom de fichier sélectionner
          m_sBitmap=m_ldFile.GetPathName();
          //Charge le fichier Bitmap
          HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), m_sBitmap, IMAGE_BITMAP, 0,0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
     
          //AVons nous un handle valide pour l'image chargé
          if(hBitmap)
          {
             //Supprime le bitmap courant
             if(m_bmpBitmap.DeleteObject())
             {
                m_bmpBitmap.Detach();
             }
             m_bmpBitmap.Attach(hBitmap);
             m_OuvrirImage=true;
          }
       }
    }
    [Balises [CODE] ajoutées par gl, merci d'y penser à l'avenir]

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    il te manque juste un updateAllview ou un invalidate de la fenetre apres lecture du fichier .

  5. #5
    Membre régulier Avatar de Vestaproman
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2003
    Messages : 95
    Points : 84
    Points
    84
    Par défaut
    OK super, ca marche impécable

    Une autre question un peu plus technique concernant la gestion de l'affichage. Je dois vraiment paraitre chiant.

    Mon appli doit pouvoir ouvrir une image (c'est le cas, ça marche, merci beaucoup) et faire d'autre traitement sur cette image mais aussi doit également pouvoir réaliser la visualisation d'images à partir d'une caméra (acquisition temps réel). J'ai du code qui marche mais séparement
    Est -il possible de créer deux classes Doc, une EFSViewerVCDoc qui gère l'affichage d'image et une autre classe style EFSViewerCameraDoc qui permet de gérer les images venant de la caméra ?

    Ou comment architecturer mon appli?

    Merci beaucoup pour votre aide

    Jérôme

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    bonsoir ,
    moi je verrais plutot un worker thread (AfxBeginThread) pour traiter les images en temps reel
    avec un lien sur la view pour de temps en temps la rafraichir .


  7. #7
    Membre régulier Avatar de Vestaproman
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2003
    Messages : 95
    Points : 84
    Points
    84
    Par défaut
    Salut,
    J'ai un callback qui permet de dire si une image est prete à etre lu ou pas.
    J'aurai voulu savoir si je doit creer une autre classe doc ou alors tout faire dans la meme classe

    Merci beaucoup
    Jérôme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    void CALLBACK Timer(UINT, UINT, DWORD dwUser, DWORD, DWORD) 
    {
       // mmtimer (wm_timer blocks messaging)
       CMainWindow* d;                    // pointer to main
       d = (CMainWindow*) dwUser;   // dwUser is the 'this' pointer from main
       d->CMainWindowTimer();         // call Timerfunction
    }
     
    void CMainWindow::CMainWindowTimer() 
    { 
       if((bSerie)&&(!bTimerAktiv)&&(!bShouldPaint))
       {
          MessageBox("Dans CMainWindowTimer","nouvelle fenetre",MB_OK);
          bTimerAktiv = TRUE;          // flags are used for primitiv synchronisation
          if((!bShow)&&(!bChangeLut))       // and to avoid to much messages
          {                                               // or image interference.
             if(Cam->PicReady())                // get image without drawing
             {
                ::InvalidateRect(this->GetSafeHwnd(), NULL, FALSE);
                bShouldPaint = TRUE;           // avoid new message before paint is ready (W95)
                if(bChangeCam)
                   bNewPic = TRUE;
                else
                   bNewPic = FALSE;
             }
          }                                  // trigger paint
          bTimerAktiv = FALSE;
       }
    }
    [Balises [CODE] ajoutées par gl, merci d'y penser à l'avenir]

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/01/2015, 00h41
  2. [MFC] probleme de rafraichissement d'une fenetre
    Par jiraya43 dans le forum MFC
    Réponses: 5
    Dernier message: 18/05/2006, 16h50
  3. [MFC]déplacement des pixels d'une image
    Par hagui dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2006, 16h51
  4. [MFC] Probleme d'actualisation d'une listbox
    Par Robleplongeur dans le forum MFC
    Réponses: 5
    Dernier message: 13/05/2004, 14h15
  5. [MFC ]Probleme de linkage d'une dll
    Par Lysis dans le forum MFC
    Réponses: 9
    Dernier message: 22/01/2004, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo