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 :

Problème CFileDialog et copie d'écran


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 10
    Par défaut Problème CFileDialog et copie d'écran
    Bonjour à tous, je vous solicite au sujet d'un problème que je rencontre sur mon appli de simulation numérique (MFC/C++/OpenGL).

    Quand j'essaie de capturer l'image de ma scène OpenGL après avoir demandé via un CFileDialog le chemin d'enregistrement de l'image, ma boite de dialogue apparait sur l'image :



    Ci-joint le code fautif :

    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
           CGLDoc* pDoc = GetDocument();
    		CFileDialog save(FALSE,"bmp",pDoc->GetPathName(),OFN_OVERWRITEPROMPT |OFN_HIDEREADONLY,"BMP files (*.bmp)|*.bmp||");
    		save.m_ofn.lpstrTitle="Exporter BMP vers ...";
    		save.m_ofn.lpstrInitialDir=Working_Path;
     
    		if(save.DoModal() == IDOK)
    		{
    			FIBITMAP *bitmap;
    			CImage anImage;
    			CRect rcClient,rcClient_out;
    			CString Path;
     
    			this->GetClientRect(&rcClient); 
     
    			anImage.GetDibScreen(m_pDC,&rcClient);
     
    			LPBITMAPINFOHEADER BmInfo=(LPBITMAPINFOHEADER)GlobalLock(anImage.m_hDib);			
    			CGLDoc* pDoc = GetDocument();
    			Path=save.GetPathName();
    			DWORD dwColor;
    			anImage.SetTransparentColor(dwColor,FALSE);
    			anImage.SaveFile(Path,IMG_FORMAT_BMPWIN);
    			bitmap=FreeImage_Load(FIF_BMP,Path,BMP_DEFAULT);
    			FreeImage_SwapColors(bitmap,&NOIR,&BLANC,TRUE);
    			bitmap=FreeImage_ConvertTo24Bits(bitmap);
    			FreeImage_Save(FIF_BMP,bitmap,Path,0);
    			AfxMessageBox("OpenGL : Rendu HD non supporté.\nExport basse définition.",MB_ICONINFORMATION);
    			chdir(Working_Path);
    			return;
     
    		}
    En fait c'est comme si la lecture de la zone de pixel commençait avant la fermeture de la fenêtre.

    J'ai déjà essayé pas mal de manip pour forcer la fermeture de la fenêtre ou temporiser l'acquisition de l'image :
    - Forcer le focus sur la vue courante
    - Utiliser des Sleep() pour forcer la temporisation des actions
    - Forcer la vue courante avec SetActiveWindow()
    - Etc..

    Et hélas rien n'y fait, trois jours que je tourne en rond, à chercher sur le net en vain et j'ai 10 utilisateurs dépourvus de carte graphique dédié qui font le pied de grue devant mon bureau pour exporter leurs modèles en low def!

    Si vous avez une idée, faites le moi savoir, merci !

    ++Tyra

  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
    Par défaut
    salut,
    ton problème viens du fait que après domodal l'application n'a pas eu le temps de repeindre la surface cachée par la boîte de dialogue.
    après ton domodal rajoute une pompe a message pour permettre à l'application de traiter les messages en attentes ...
    voir faq: http://cpp.developpez.com/faq/vc/ind...rk#PumpMessage
    ça devrait régler le problème ...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 10
    Par défaut
    J'ai récupéré ta méthode PumpMessage() et je l'ai implémenté dans ma classe de rendu OpenGL, son appel après DoModal() résout le problème. Un grand merci. Ci-joint un petit screen de remerciement !(...sans overlay de CDialog grâce à toi !)



    ++TyraMerci Farscape !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de copie d'écran
    Par Lalanne dans le forum C++Builder
    Réponses: 4
    Dernier message: 16/07/2007, 09h10
  2. Problème d'affichage en plein écran
    Par kurul1 dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/11/2005, 14h43
  3. Faire une copie d'écran d'un Panel
    Par Wilco dans le forum Langage
    Réponses: 2
    Dernier message: 19/10/2005, 17h28
  4. Reformatter un doc word pour en faire des copies d'écran
    Par titouille dans le forum VBA Word
    Réponses: 4
    Dernier message: 22/09/2005, 18h21
  5. Copie d'écran dans un fichier
    Par angsthase dans le forum Autres Logiciels
    Réponses: 12
    Dernier message: 17/08/2005, 00h45

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