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

WinDev Discussion :

Classe OpenGL : quelques soucis avec un champ image


Sujet :

WinDev

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut Classe OpenGL : quelques soucis avec un champ image
    Bonjour,
    j'essaye de créer une classe OpenGL digne de ce nom que je mettrais en source, mais j'ai un petit soucis si jamais j'initialise un champ image.

    En gros j'ai repris la classe fournie dans l'exemple mais j'ai commencé à la mettre à ma sauce. Le but étant de pouvoir créer un champ OpenGL avec sa propre configuration. Chose qui n'est possible de faire avec la classe de l'exemple qu'en modifiant des valeurs dans la classe
    Si je ne m'abuse le but quand même c'est d'envoyer des paramètres à la classe ou à ses méthodes pour instancier l'objet de nos désirs (et mine de rien y en a des états en OpenGL !!!).

    Mon soucis vient du fait d'instancier un champ image. Si j'instancie une fenêtre de ma classe, tout se passe bien, ça s'initialise, si je change la taille de la fenêtre je n'ai pas de soucis, j'ai toujours mon image de fond sans scintillement.
    D'ailleurs à ce niveau il y a un pbm avec la classe de l'exemple car lorsque l'on perd le focus de la fenêtre (ouvrez l'explorateur par dessus la fenêtre par exemple), le champ devient blanc (on le retrouve lorsqu'un évènement est déclenché). A voir donc mais plus tard.

    Mon soucis vient du fait d'instancier un champ image de ma classe.
    Quand j'ancre mon champ à ma fenêtre (là j'appelle la méthode de redimensionnement de la fenêtre identique à celle de l'exemple ":InitScene()") il va y avoir un scintillement de ma couleur de fond mais le champ au final restera blanc. Le genre de scintillement que l'on a avec un buffer simple, alors que dans mon PFD j'ai bien mis un double.
    De toute façon j'ai le même problème avec l'exemple de Windev.

    Si jamais vous avez des petites idées je suis preneur ...

    Et puis d'ici là Bonne année
    Mieux vaut un petit lien qu'un long discours.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Bonjour,

    bon je suis toujours en lute avec Windev pour initialiser proprement OpenGL.
    Visiblement il y a 2 conflits d'affichage :

    - le premier est interne à Windev. Si on a un champ image ancré à la fenêtre, quand on modifie par exemple la taille de la fenêtre, il y a un scintillement car Windows ne doit pas savoir lors de la modification de l'affichage si c'est le champ image ou la fenêtre qui est prioritaire.
    Il doit bien y avoir une fonction dans Windev qui permette de définir la priorité d'affichage quand même ?!?

    - le second est un problème de priorité de fenêtre mais dans Windows. J'ai essayé de reprendre la Fonction SetForegroundWindow de User32.dll pour ma fenêtre (comme dans le tuto de Nehe) mais rien n'y fait.

    Comme toujours je suis en attente de précieux conseils ou même d'une toute petite piste.

    PS : le même problème existe sous XP et W7.
    Mieux vaut un petit lien qu'un long discours.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Bon j'ai une petite piste.

    Dans la classe OpenGL, on fait appel à une procédure lors d'un WM_PAINT, c'est-à-dire lorsque la fenêtre doit être redessinée par Windows. Que ce soit pour une perte de focus, redimensionnement, etc ...

    J'ai juste fait un test avec une fenêtre vide et cet évènement est en fait appelé tout le temps, à chaque modification de l'affichage de la fenêtre.

    Du coup je pense qu'avec la classe OpenGL on a plusieurs fois des méthodes qui sont appelées lorsque l'on reçoit le message WM_PAINT et qu'il y a par conséquent un conflit d'affichage à ce niveau là. Il y a la méthode de la classe OpenGL et les méthodes par défaut comme par exemple celle de redimensionnement de la fenêtre.
    Faites un test juste en faisant une fenêtre vide et en mettant dans la partie "modification de la fanêtre" : Vous verrez que l'on obtient 2 fois le message.

    Bon je pars manger je vois ça après ...
    Mieux vaut un petit lien qu'un long discours.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Alors pour les quelques curieux qui suivent mes aventures (je vais finir par faire un blog ) j'ai trouvé une solution rustine.

    Pour ceux qui veulent reprendre l'exemple WD OpenGL, dans la méthode InitChamp() de la classe COpenGL, il y a la fameuse ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Evénement(": Dessine", :m_sChamp, 15)  // WM_PAINT
    En gros on appelle la fonction dessine lorsque on redessine le champ OpenGL. Oui mais voilà, windev (ou windows, j'ai encore quelques lacunes dans ce domaine) redessine tous les champs et fenêtres. La solution est de simplement lancer la méthode : Dessine partout soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Evénement(": Dessine", "*.*", 15)  // WM_PAINT
    Ca fonctionne. MAIS !!!
    Avec cette solution on appelle : Dessine pour chaque repaint de chaque champ et chaque fenêtre (ce qui n'est pas utile si on est pas dans le champ OpenGL). Pour un bon PC avec cet exemple ça peut aller mais avec un PC moyen avec 50 ou 100 champs et plusieurs fenêtres, je vous laisse imaginer la cata.

    J'ai donc plusieurs questions :

    - Est-il possible de savoir à quel moment un évènement se termine ? (il y a bien une fonction pour les arrêter mais moi je veux juste savoir quand il n'y a plus de WM_PAINT envoyé)

    - Est-il possible de connaitre à l'avance l'ordre des champs et fenêtres qui sont récupérés par l'évènement dans le cas où je met une ligne de code du type "Evénement([nom_procédure], "*.*", [message_windows]) ?
    Est-il possible de modifier cet ordre ?
    Si la réponse était positive, le but serait que WM_PAINT soit déclenché en dernier dans le champ OpenGL, et donc à n'avoir qu'à déclencher la méthode : Dessine qu'une seule fois.

    Merci
    Mieux vaut un petit lien qu'un long discours.

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 329
    Points : 3 841
    Points
    3 841
    Par défaut
    Salut à toi,

    Pour le scintillement, j'ai eu le cas sur des grilles de planning (tout en image).

    La solution que j'ai trouvé est de faire une copie de l'image principale dans un champ image tampon, qui se retrouve au premier plan le temps du changement de taille/redimensionnement de la fenêtre.

    Donc en gros, si j'ai suivi ton "blog" , il faudrait gérer la copie dans la méthode Dessine().

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Ça peut être une bonne solution mais comment fais-tu pour savoir que l'évènement est fini pour repasser à l'affichage normal ?
    Mieux vaut un petit lien qu'un long discours.

  7. #7
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 329
    Points : 3 841
    Points
    3 841
    Par défaut
    Je suppose que ta méthode Dessine() est appelée quand la fenêtre est redimensionnée, donc tu copies l'image source dans l'image tampon au début de la méthode et à la fin, tu rebascules l'image source au premier plan.

    Attention, quand je parle de la méthode Dessine(), je parle d'une méthode qui ne s'occupe que du contenu de l'image source.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Alors le soucis du jour c'est que le champ image n'est pas un champ image Windev puisqu'il est initialisé à partir de l'API de Windows (c'est bien pour ça que j'ai autant de soucis et que c'est pas fini).
    J'ai un tampon mais qui contient les données à afficher dans le champ. Enfin j'ai plutôt un double tampon (à ce qu'il parait c'est pour éviter les scintillements, si si c'est marqué dans le tuto de NeHe ).

    Bref j'ai glané quelques exemples sur le net et j'ai 50 pages msdn ouvertes, avec ça je devrais bien réussir à faire qq chose.
    Mieux vaut un petit lien qu'un long discours.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Bon j'ai regardé certaines sources et pour faire un champ en OpenGL, certains n'hésitent pas à passer par un CreateWindoEX.
    En fait je pense tout simplement que dans l'utilisation actuelle, on a un champ image actif et visible. Je pense donc qu'il y a un conflit quand il doit se redessiner puisque si dans le programme on redessine notre champ OpenGL, Windev lui redessine son champ image de son côté.

    Mais si on rend le champ inactif et invisible forcément ...

    PS : quand y aura ce topic en résolu je paye ma tournée aux lecteurs
    Mieux vaut un petit lien qu'un long discours.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut


    Bon ça fonctionne pas de manière optimale, il subsiste quelques problèmes (lors de redimensionnement ou bien parfois lorsque la fenêtre chevauche une autre petite fenêtre) mais j'ai réussi.

    En fait dans l'exemple de Windev OpenGL il suffit de faire un appel à un TimerSys dans l'initialisation de la fenêtre et d'appeler la méthode Dessine de la classe (via une fonction locale de la fenêtre).

    En tout cas le principale c'est lorsque l'on reprend le focus de la fenêtre, le champ OpenGL réapparait correctement.

    Bon chose promis chose due, amenez vos verres ...
    Mieux vaut un petit lien qu'un long discours.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par sphynxounet Voir le message
    PS : quand y aura ce topic en résolu je paye ma tournée aux lecteurs
    Je suis un fidèle lecteur

    J'espère que tu mettras a dispo ton code car j'ai tenté de faire une classe correcte pour utiliser OpenGL mais je me suis vite arrêté mes connaissances en OpenGL étant trop limitées.
    Ça m'intéresserait de voir comment tu as fait.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 96
    Points : 104
    Points
    104
    Par défaut
    Santé
    Thierry Balderacchi

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Oui je vais donner la source mais je dois refaire la classe. J'avais tout bien fait mais avec ce problème de scintillement et de rafraichissement du champ j'ai un peu massacré ma classe (et du coup impossible d'afficher quelque chose de correct).
    Au début je vais faire une classe avec peu de paramètres car je ne connais pas encore toutes les constantes ni leur utilité (ça fait que 3 semaines que je me suis mis à OpenGL).
    Mieux vaut un petit lien qu'un long discours.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Et voilà juste avant d'aller casser la croute (et le temps de chausser mes skis), la classe est disponible : http://www.developpez.net/forums/d85...e/#post4902439
    Mieux vaut un petit lien qu'un long discours.

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci je vais y jeter un oeil

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/03/2008, 17h09
  2. Réponses: 7
    Dernier message: 24/03/2007, 16h47
  3. quelques soucis avec l'url rewriting
    Par romain_paris dans le forum Apache
    Réponses: 10
    Dernier message: 17/09/2006, 16h51
  4. Quelques soucis avec un lecteur MP3
    Par Guesh13 dans le forum Audio
    Réponses: 3
    Dernier message: 20/02/2006, 14h57
  5. quelques soucis avec word 2000
    Par ramchou dans le forum Word
    Réponses: 3
    Dernier message: 06/09/2004, 18h13

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