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

OpenGL Discussion :

Fermer la fentre sans quitter le programme?


Sujet :

OpenGL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 82
    Points : 43
    Points
    43
    Par défaut Fermer la fentre sans quitter le programme?
    Bonjour,
    j'aimerais savoir si c'est possible de fermer la fenetre en openGL (via la petite croix ou par un appui sur une touche du clavier), mais sans quitter le programme en C qui tourne.
    en fait j'ai un petit menu dans mon terminal, quand je choisis une certaine option ca m'affiche une fenetre openGL, et j'aimerais pouvoir recuperer la main sur mon terminal.
    merci d'avance

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Normalement oui, c'est possible.
    A la limite, peux-tu nous montrer ton code ?

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 82
    Points : 43
    Points
    43
    Par défaut
    oki je vais essayer d'etre le + clair possible alors

    dans ma fonction pour afficher la fenetre:

    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
    	/* affichage de l'image en openGL */
    	glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
      	glutInitWindowSize (imgFin.largeur+imgOrigine.largeur+30, imgFin.hauteur); 
      	glutInitWindowPosition (0, 0);
      	/* Creation de la fenetre et d'un contexte graphique OpenGL associe */
      	glutCreateWindow ("Image Résultat");
     
      	initGL(); // Initialisation du contexte OpenGL
     
      	/* Definition des evenement utilises */ 
      	glutDisplayFunc(affImage); // l'affichage (obligatoire !)
      	glutReshapeFunc(monCadrage); // le redimensionnement
      	glutKeyboardFunc(clavier); // interruption clavier (ascii uniquement)
     
      	/* Lance la boucle d'evenement */
      	glutMainLoop();
    ensuite les autres fonctions d'affichages d'opengl:

    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
     
    void affImage()
    { 
      glClear(GL_COLOR_BUFFER_BIT) ;
      /* positionnement de l'origine pour glDrawPixels */
      glRasterPos2i(0, 0);
      /* trace de l'image */
      glDrawPixels(imgOrigine.largeur, imgOrigine.hauteur, GL_LUMINANCE, GL_UNSIGNED_BYTE, imgOrigine.buffer);
      glutSwapBuffers();
     
      /* affichage d'1 petit triangle */
      glColor3f(1.0, 0,0);
      glBegin(GL_TRIANGLES);
    	glVertex2i(imgOrigine.largeur+10, imgOrigine.hauteur/2-10);
    	glVertex2i(imgOrigine.largeur+10, imgOrigine.hauteur/2+10);
    	glVertex2i(imgOrigine.largeur+20, imgOrigine.hauteur/2);
      glEnd();
     
      /* positionnement de l'origine pour glDrawPixels */
      glRasterPos2i(imgOrigine.largeur+30, 0);
      /* trace de l'image */
      glDrawPixels(imgFin.largeur, imgFin.hauteur, GL_LUMINANCE, GL_UNSIGNED_BYTE, imgFin.buffer);
      glutSwapBuffers();
    }
     
     
    void monCadrage(int l, int h)
    { 
      glViewport(0,0,l,h); // cadre d'affichage dans la fenetre
      glMatrixMode(GL_PROJECTION);  
        glLoadIdentity();
        gluOrtho2D(0.0,l, 0.0,h);
      glMatrixMode(GL_MODELVIEW); 
      glLoadIdentity();
    }
     
     
    void clavier(unsigned char touche, int x, int y)
    { 
       switch (touche)
       { 
          case 27  : 
    	  case 'q' :
    	  case 'Q' :  exit(0);  
          break ;
    	  default: affiche_Menu_Principal();
        }
    }
     
    void initGL()
    { 
      glPixelStorei(GL_UNPACK_ALIGNMENT,1);
    }
    merci!

  4. #4
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Apparemment ce code
    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
     
    /* affichage de l'image en openGL */
       glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
         glutInitWindowSize (imgFin.largeur+imgOrigine.largeur+30, imgFin.hauteur);
         glutInitWindowPosition (0, 0);
         /* Creation de la fenetre et d'un contexte graphique OpenGL associe */
         glutCreateWindow ("Image Résultat");
     
         initGL(); // Initialisation du contexte OpenGL
     
         /* Definition des evenement utilises */
         glutDisplayFunc(affImage); // l'affichage (obligatoire !)
         glutReshapeFunc(monCadrage); // le redimensionnement
         glutKeyboardFunc(clavier); // interruption clavier (ascii uniquement)
     
         /* Lance la boucle d'evenement */
         glutMainLoop();
    Tu le met dans une fonction que tu appelles dans le main. Ce qui m'interesserais c'est de voir ton main. Car, tout depend de la maniere dont tu appelles ta fonction dans le main.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 82
    Points : 43
    Points
    43
    Par défaut
    voici mon main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /************************/
    /*! Fonction principale. */
    void main(int argc, char **argv)
    {
    	seuilGlobal = 0;
     
    	/* initialisation de la fenetre */
      	glutInit(&argc, argv);
     
    	affiche_Menu_Principal();
    }
    ma fonction "affiche_menu_principal" fait des "printf" pour afficher un menu en mode texte dans le terminal.
    l'une des options est l'affichage d'une image dans la fenetre en openGL.

    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
     
    void affiche_Menu_Principal()
    {
    	char *saisie;
    	saisie = (char *)malloc(sizeof(char)*10);
    	do {
    	    printf("\nMenu Principal:\n");
            printf("1 -> Charger une image\n");
            printf("2 -> Sauvegarder une image\n");
           	printf("3 -> Detection de contours\n");
           	printf("4 -> Seuillage\n");
           	printf("5 -> Affinage des contours\n");
           	printf("6 -> Affichage de l'image résultat\n");
           	printf("0 -> Quitter le programme\n");
           	scanf("%d", saisie);
     
           	switch(saisie[0])
           	{
    	       	case 0: printf("\nA bientot!\n\n");
    			       	break;
    	       	case 1: free(saisie);
    	       	         affiche_Charger();
    	       	         break;
             case 2: affiche_Sauvegarder();
    			  break;
    		case 3: affiche_Detection();
    			  break;
    		case 4: affiche_Seuillage();
    			  break;
    		case 5: affiche_Affinage();
    			  break;
    		case 6: affiche_Affichage();
    			  break;
    		default: printf("Erreur dans le choix!\n");
    			 break;
    	}
    	} while(saisie[0]!=0);
    }
    et donc la fonction "affiche_Affichage()" (le cas 6) c la 1ere fonction que j'ai mis, avec le "glutMainLoop".

    merci!

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 40
    Points : 48
    Points
    48
    Par défaut
    j ai pas compris a quoi sert ton char[10] pour saisie puisque t utilises que le 1er char
    dapres ton code le programm devrait continuer apres la fermeture de la fenetre puisque sur le main seule le fin de la fonction affiche_Menu_Principal(); quitte le prog ce qui n est realisé que pour saisie[0]==0
    une autre possibilité (tres tres tres tres improbable) un autre scanf ou quelque chose qui modifie la file du scanf et donne 0 lors du scanf suivant

    une question: est il possible de fermer un programme en dehors de la fonction main() (par une dll ou une fonction speciale)?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 82
    Points : 43
    Points
    43
    Par défaut
    merci pour tes reponses.

    en ce qui concerne le char[10] c 1 ptite erreur de ma part

    sinon je viens de tester: lorsque je ferme la fenetre en cliquant sur la croix, le programme se termine.
    je ne suis pas (encore) un expert d'opengl, mais je pense qu'il y a un probleme avec le "glutMainLoop()", car une fois la fenetre lancée, je n'ai plus la main dans la console.
    quand je tape sur une touche du clavier autre que 'q' ou echap, je reprend bien la main dans la console avec affichage du menu (grace a ma fonction de gestion du clavier), mais ma fenetre opengl est planté, et finit par tout me planter...

    en fait il faudrait que je trouve un moyen de fermer la fenetre, mais sans terminer le programme! et j'ai cherche sur le net, mais je trouve pas de solution...

    merci en tt cas de vous interesser à mon probleme [/list][/list]

  8. #8
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    normal que tu n'ai plus la main sur la console, car comme son nom l'indique, le glutMainLoop est une boucle sans fin (c'est la boucle principale). normaleme,t il existe une fonction pour stopper cette boucle mais je ne la connait pas...
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 82
    Points : 43
    Points
    43
    Par défaut
    c effectivement une fonction dans ce genre la que je cherche, qui puisse m'arreter la boucle ou encore fermer la fenetre et donner la main a la console...

    mais je trouve pas...

    alors si qq1 a une idee merci d'avance!

  10. #10
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 40
    Points : 48
    Points
    48
    Par défaut
    moi g une idée
    vire glut trouve un boutd code pour loader une fenetre windows y en a tellment
    sinon j ai fait une librairie dans le genre glut mais en bcp plus simple si tu veu j peu t envoyer un truc tout fait

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 82
    Points : 43
    Points
    43
    Par défaut
    je veux bien ta lib, pasq visiblement on m'a dit qu'il etait impossible d'arreter la glutMainLoop()...
    c 1 des problemes de glut.
    sinon j'espere que ta lib est "portable" Windows/Linux

  12. #12
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    lib portable pour openGL qui n'est pas GLUT -> SDL http://www.libsdl.org/index.php
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  13. #13
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 40
    Points : 48
    Points
    48
    Par défaut
    euh..non elle ne l est pas
    je veux dire pas portable
    elle ne fonctionne que sous windows pour l instant (peut etre plus tard, quand je saurais faire de l opengl sous linux)
    de plus j ai trouvé un petit bug que j arrive pas a resoudre : une fois que je ferme la fenetre, impossible d en ouvrir une autre! je comprend vraiment pas
    personellement je te conseillerais la sdl si elle correspond a tes besoins
    sinon si tu utilises dev-c++, windows, et que tu n as besoin de ta fenetre qu'une seule fois par execution du programme, donne moi ton mail je t enverrai une version (je n ai rien uploadé puisq le developpement n est pas encore fini)

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 82
    Points : 43
    Points
    43
    Par défaut
    merci, mais je ne vais pas en avoir besoin vu que je developpe sous linux...
    en ce qui concerne la SDL, je vais regarder.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/04/2010, 12h06
  2. Fermer la Console sans quitter le processus
    Par eTill dans le forum Windows Forms
    Réponses: 15
    Dernier message: 08/08/2008, 12h03
  3. lire du clavier sans quitter le programme
    Par lastrecrue dans le forum MATLAB
    Réponses: 4
    Dernier message: 25/03/2008, 00h59
  4. Réponses: 3
    Dernier message: 01/05/2007, 12h03
  5. Fermer une fenêtre sans confirmation
    Par ZACKX dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 30/04/2007, 09h55

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