Cet article est le troisi�me dans notre s�rie sur la Boite � Outils pour OpenGL
(GLUT - GL Utility Toolkit) �crite par Mark Kilgard. GLUT est tr�s utile pour les
d�veloppeurs car elle encapsule dans une API simple � apprendre et simple �
utiliser, toute ce qui dans une application OpenGL, d�pend de la plate-forme.
Comme nous le disions dans les articles pr�c�dents, OpenGL � �t� con�ue pour �tre
une librairie graphique 3D de haut niveau totalement ind�pendante de la plate-forme.
Ouvrir des fen�tres, contr�ler le clavier, etc... sont fortement d�pendant de la plate-forme
et donc en-dehors des attributions d'OpenGL. GLUT nous permet d'�crire du code totalement portable
en offrant une interface commune � toutes les plates-formes pour g�rer les choses comme les fen�tres,
le double buffer, le rendu de texte, les �v�nements clavier et les menus.
Aujourd'hui nous allons explorer l'utilisation des menus � l'int�rieur de notre
application OpenGL. Les menus sont un des moyens de communications de l'utilisateurs.
Dans notre article pr�c�dent (
Gestion des Fenêtres ) nous avons fait la d�monstration d'une autre technique :
les �v�nements clavier. GLUT capture les �v�nements claviers et souris et nous permet
de d�finir la fonction de traitement associ�e (NDT : appel�es fonctions callback).
L'inconv�nient des raccourcis claviers, c'est qu'ils sont invisibles et que l'utilisateur doit
lire le manuel ou se rappeler quelle touche fait quoi. Les menus sont beaucoup plus pratiques et
flexibles car ils sont graphiques et montre � l'utilisateur les options disponibles.
Pour illustrer notre propos, voici un programme d'exemple (
../../common/May1998/example1.tar.gz ). Ce programme modifie l'exemple de notre pr�c�dent article sur la
Gestion des Fen�tres . Chargez le programme et compilez
le en utilisant le makefile fourni.
La compilation n�cessite une impl�mentation des librairies OpenGL (par exemple Mesa) et GLUT.
Ces deux librairies sont largement disponibles et inclus d'une mani�re ou d'une autre dans la plupart
des distributions Linux. Apr�s la compilation nous obtenons un ex�cutable, example1. Lancez le, vous
devriez voir un une nouvelle fen�tre avec un triangle aux ar�tes rouge - vert - bleu (cf. figure de gauche).
Le cadre contient une fen�tre principale avec un fond noir et un triangle au milieu et une sous-fen�tre
avec un fond gris et du texte � l'int�rieur. Notre exemple est en fait une animation temps-r�el aussi le compteur
de la zone de texte doit s'incr�menter.
Bougez le pointeur de la souris sur la fen�tre principale cliquez et maintenez
enfonc� le bouton gauche. Cet �v�nement est trait� par notre exemple et doit faire
appara�tre le menu suivant :
Le menu contient trois actions ( d�marrer/arr�ter la rotation, d�marrer/arr�ter la translation,
changer de couleur) et une derni�re option pour quitter l'application. Tout en maintenant enfonc� le bouton gauche bougez sur chaque action pour voir ce qui se passe.
En s�lectionnant "Rotation On", le triangle commencera � tourner autour de son centre de gravit�
, "Translation On" le fera se d�placer horizontalement en revenant au d�but quand le bord est atteint.
L'option "Change Color" d�clenchera un sous-menu avec ces nouvelles options:
- Red Dessine le triangle en rouge
- Blue Dessine le triangle en bleu
- Green Dessine le triangle en vert
- RGB Dessine le triangle en rouge, vert, bleu
C'est un exemple tr�s simple d'utilisation de menus dans une application OpenGL. L'aspect des menus et sous-menus d�pend de la plate-forme. L'apparence ci-dessus est celle obtenue avec GLUT sous Linux, compil� et lanc� sous Windows 95/NT les menus auraient un autre aspect. Ce qui compte c'est que la fonctionnalit� est portable aussi longtemps que vous utiliserez GLUT.
Vous remarquerez que le menu principal a deux types d'entr�es diff�rentes. Le premier type (Rotation On, Translation On) change apr�s que l'action demand�e est �t� ex�cut�e. ce qui veut dire qu'apr�s avoir lanc� le triangle en rotation, la prochaine fois que vous verrez le menu il y aura marqu� "Rotation Off". L'autre type d'entr�e reste constante c'est le cas de "Change Color", "Red", "Blue" et "Green".
Il y a deux ou trois choses int�ressantes dont je voudrais entretenir le lecteur
avant de continuer sur les menus. Est-ce que vous vous souvenez que ce programme �
deux touches de commandes ? (
Gestion des Fenêtres ). Ces touches sont "q" pour quitter et "i" pour activer/d�sactiver
la zone de texte. Essayez les maintenant, elles marchent encore.
Alors que la zone de texte est active (la sous-fen�tre) placez le pointeur de souris dans la r�gion grise et cliquez sur le bouton gauche? Surprise! Vous voyez un nouveau menu:
Ce qui d�montre que les menus ne sont pas uniquement attach�s aux �v�nements
mais qu'ils sont transmis au contexte courant. Nous avions d�j� mentionn� dans notre
article sur les sous-fen�tres qu'elles poss�dent le propre contexte OpenGL, nous
voyons ici une autre cons�quence de ce fait. Deux menus ont �t� attach�s au m�me
�v�nement (le click gauche) mais � diff�rents contextes. Le d�veloppeurs � maintenant
un main un outil puissant pour �crire une interface utilisateur graphique
sophistiqu�e � ses applications.
Encore plus int�ressant, si vous enlevez la zone de texte en pressant sur "i" et que vous placez votre souris sur le bord haut du cadre vous ne pourrez pas retrouver l'affichage "this is a dummy menu". Pourquoi ? Car en cachant la sous-fen�tre vous cachez son sous-contexte (les menus attach�s �galement).
Maintenant d�crivons le contenu du programme, Je supposerai dans ce qui
suit que le lecteur est familier avec les sujets trait�s dans les articles
pr�c�dents sur GLUT et OpenGL. La fonction main() contient plusieurs
sections distinctes, l'ordre est important ! :
- Initialisation de GLUT. Ouvre une fen�tre d'affichage, transmet les arguments de la ligne de commande, fixe le mode d'affichage et les options.
- Cr�ation de la fen�tre principale. Cr�e la fen�tre principale, fixe les fonctions callback associ�es � cette fen�tre, fixe la fonction callback idle.
- Cr�ation d'un sous-menu. C sous menu g�re l'action " Change Color " et sera inclus dans le menu principal qui suit.
- Cr�ation du menu principal.Cr�e le menu principal, ajoute les entr�es du menu ainsi que le sous-menu pr�c�dent. Enfin, attache ce menu � l'�v�nement clique gauche. Vous noterez que nous sommes toujours dans le contexte de la fen�tre principale.
- Cr�ation d'une liste d'appel GL. Ceci est une fonctionnalit� avanc�e d'OpenGL et ne sera pas trait�e compl�tement ici. Pour l'instant il vous suffit de savoir qu'une telle liste permet de construire et d'encapsuler des objets OpenGL duran,t l'�x�cution pour une utilisation ult�rieure. Utiliser un �l�ment d'une liste d'appel GL est plus efficace que de construire et reconstruire sans cesse les objets. Dans cet exemple il ya quatre �l�ments � notre liste : un triangle rouge, un bleu, un vert et un rouge - vert - bleu.
- Cr�ation d'une sous-fen�tre. Cr�e une sous-fen�tre, sauvegarde un identifiant de cette fen�tre [NDT : un "handle"], fixe les fonctions callback appropri�es. Apr�s que la sous-fen�tre est �t� cr�e, un nouveau contexte est activ�.
- Cr�ation du menu principal de la sous-fen�tre. Comme pr�c�demment nous cr�ons un nouveau menu, ajoutons les entr�es et nous le rattachons � l'�v�nements "clique gauche". Le menu sera attach� au contexte de la sous-fen�tre.
A part la cr�ation des menus, les autres sections devraient �tre famili�re au lecteur. Une rapide lecture du code source de l'exemple r�v�le combien cela est facile � r�aliser. Les Menus sont cr��s par la directive int glutCreateMenu( void (f*)(int) ) la fonction f est la fonction callback qui recois comme argument le num�ro identifiant l'entr�e du menu s�lectionn� et est charg� d'accomplir l'action associ�e. La valeur retourn�e par la fonction int glutCreateMenu( void (f*)(int) ) est un entier identifiant la nouvelle fen�tre cr��e.
La fonction callback utilis�e pour g�rer les �v�nements menus est simple.
Regardez la fonction void mainMenu(int) ou void subMenu(int) ,
elles sont essentiellement constitu�es d'une structure conditionnelle "switch" qui traite l'action choisie.
Apr�s la cr�ation du menu, notre code ajoute les entr�es du menu par l'appel de void glutAddMenuEntry(char*s,int nr), ou s est le texte � �crire dans le menu et nr un entier identifiant cette entr�e, c'est ce num�ro qui est pass� comme argument � la fonction callback lorsque cette option est choisie. Evidemment il ne vaut mieux pas utiliser deux fois le m�me identifiant.
Les sous-menus sont ajout�s de mani�re similaire en utilisant la fonction void glutAddSubMenu(char *s, int nr).
Enfin pour terminer la d�claration du menu, il est attach� � un �v�nement (le bouton gauche de la souris) en utilisant la fonction glutAttachMenu. Cette fonction peut �galement prender comme argument GLUT_RIGHT_BUTTON, GLUT_MIDDLE_BUTTON.
Les entr�es du menus peuvent �tre chang�es � l'ex�cution en utilisant la fonction void glutChangeToMenuEntry(int entry, char *s, int value), qui remplace l'entr�e "entry" de la fen�tre courante par un autre ayant le texte s et l'identifiant value. Dans notre exemple nous utilisons
glutChangeToMenuEntry(2, "Translation On", 2);
afin de changer le texte de la seconde entr�e du menu principal (de m�me pour les autres entr�es).
GLUT permet d'autre choses encore : transformer une entr�e en un sous-menu
et vice-versa, d�truire un menu, enlever des entr�es, etc. Nous ne d�taillerons
pas toutes ces fonctions ici car je crois que l'exemple pr�sent� est simple mais
suffit d�j� pour la plupart des utilisations. Si vous avez besoin d'autres fonctionnalit�s,
regardez dans les manuels de GLUT les plus r�cents.
|