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

C++ Discussion :

Encore besoin d'aide avec GDI+


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 36
    Par défaut Encore besoin d'aide avec GDI+
    Bonjour,

    Jes usi en train de programmer une interface graphique en me basats ru GDI+, et j'ai un bug qui a l'air de se produire aléatoirement. Pendant quelques secondes ou minutes d'utilisation, le comportement est normal, comme sur l'image suivante :
    http://www.macrocosm.0rg.fr/rendunormal.png

    Apres quelques temps, j'ai l'impression que mon application perd la main sur sa fenetre, ou quelque chose dans le genre. Toujours est-il que voila un exemple de résultat :
    http://www.macrocosm.0rg.fr/rendubug.png

    C'est comme si l'affichage ne se rafraichissait pas. Ce qui est encore plus étrange, c'est que de temps à autres, l'image revient... je suis assez perdu là.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Comme beaucoup de monde, j'ai envoyé ma boulle de cristal en réparation, et il nous est donc difficile de dire d'où vient le problème sans disposer du code que tu as utilisé...

    La première idée que tu dois avoir en tête est "aide nous à t'aider".

    Plus tu pourras nous donner de précisions, plus tu auras de chances d'obtenir une aide efficace et rapide.

    Cela passe, entre autre, bien souvent par le fait de fournir un code minimal compilable qui permette de reproduire le problème
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 36
    Par défaut
    Je comprends bien que ma question est un peu floue. Mais c'est un peu dificile de fournir un code, quand on ne sait pas dans quel coin du code ça ne va pas... je ne vais quand même pas envoyer des milliers de lignes là au milieu.
    De plus, au debugger, tout se passe normalement (quand je dis normalement, c'est que le comportement, les appels de fonctions... que j'observe lorsque le rendu se fait bien ou lorsqu'il est buggé est le même).

    Je vais investiguer un peu plus, et fournirai du code si je trouve l'endroit du délit.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 36
    Par défaut
    Au passage, il me semble que ce genre de bugs d'affichages m'arrivaient quand je déclarais mal certains Graphics associés à un HDC qui venait d'être clipé... je suis en train de me demander si c'est pas un problème de thread, avec une fonction qui serait appelée deux fois trop vite pour qu'elle ait le temps de finir la première, d'où un chevauchement possible de rendu graphique... je vais partir là-desus.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 36
    Par défaut
    Ca y est, j'ai du code à fournir !
    Dans la fonction de gestion des evenements :

    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
     
    case WM_PAINT:
    	{
    		PAINTSTRUCT ps;
    		HDC hdc = BeginPaint(hwnd, &ps);
    		if(hdc==NULL)
    			break;
    AUTREPASSE:
    		Rendu(hWnd, &ps);
    		if(ModificationPendantRendu)
    		{
    			ModificationPendantRendu=false;
    			FinModification();
    			goto AUTREPASSE;
    		}
    		EndPaint(hwnd,&ps);
    		break;
    	}

    et dans celle du rendu:

    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
     
    // Initialisation du rendu
    	// Récupération de la taille de la fenetre
    	RECT rc;
    	GetClientRect(hWnd, &rc);
    	// Creation d'un device compatible
    	HDC hdcMem = CreateCompatibleDC(ps->hdc);
    	if(hdcMem==NULL)
    		MessageBox(NULL, L" Erreur a la creation d'un Device compatible", L"Erreur CreateCompatibleDC", MB_OK);
    	// Creation d'un bitmap qui fait office de backbuffer
    	HBITMAP hbmMem = CreateCompatibleBitmap(ps->hdc, rc.right-rc.left, rc.bottom-rc.top);
    	if(hbmMem==NULL)
    		MessageBox(NULL, L" Erreur a la creation du BackBuffer", L"Erreur CreateCompatibleBitmap", MB_OK);
    	// Sauvegarde de l'ancien buffer
    	HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hbmMem);
    Lorsque j'arrive dans ma fonction de rendu, hdcMem recupere NULL...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 36
    Par défaut
    Il me semble avoir trouvé la solution : j'avais en fait une fuite de mémoire sur la déclaration d'une de mes RegionData, du coup, j'imagine qu'à un moment donné, il devait y avoir un conflit...

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Euh, attention: Surtout pas de MessageBox() dans le code de traitement d'un message sensible comme WM_PAINT!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    En plus, c'est quoi cet horrible goto en plein millieu du code...

    Pourquoi ne pas faire
    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
    case WM_PAINT:
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
        if(hdc!=NULL)
        {
            Rendu(hWnd, &ps);
            while(ModificationPendantRendu)
            {
                ModificationPendantRendu=false;
                FinModification();
                Rendu(hWnd, &ps);
            }
            EndPaint(hwnd,&ps);
        }
        break;
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Besoin d'aide avec Regexp::Assemble
    Par mobscene dans le forum Modules
    Réponses: 5
    Dernier message: 11/04/2007, 12h39
  2. [ASA] J'ai besoin d'aide avec sybase et vb6 svp !!
    Par tibo830 dans le forum SQL Anywhere
    Réponses: 7
    Dernier message: 12/05/2006, 10h09
  3. Besoin d'aide avec TinyXML
    Par Clad3 dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 15/08/2005, 18h20
  4. Réponses: 2
    Dernier message: 29/08/2003, 17h52
  5. Besoin d'aide avec postgresql sous windows NT
    Par Chihuahua dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 18/07/2003, 08h29

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