|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
GENERATION DE FENETRE TYPE WINDOWS EN OPENGL
Description
Ce prog affiche une fenetre type windows avec differents boutons, qui eux memes peuvent ouvrir une autre fenetre. Ca ne sert pas a grand choise, c'est seulement pour le fun et pour impressionner les pots.
Source
- #include <gl\glut.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <string.h>
-
- #define nb_fenetre 6
-
- int xmouse,ymouse,souris_gauche=0,souris_droite=0,souris_milieu=0,tailley=599,taillex=799;
-
- //Gestion des clique de la souris
- void Souris_clique(int button,int state,int x,int y)
- {
- xmouse=x;
- ymouse=tailley-y;
-
- if((button==GLUT_LEFT_BUTTON)&&(state==GLUT_DOWN))
- souris_gauche=1;
- if((button==GLUT_LEFT_BUTTON)&&(state==GLUT_UP))
- souris_gauche=0;
- if((button==GLUT_RIGHT_BUTTON)&&(state==GLUT_DOWN))
- souris_droite=1;
- if((button==GLUT_RIGHT_BUTTON)&&(state==GLUT_UP))
- souris_droite=0;
- if((button==GLUT_MIDDLE_BUTTON)&&(state==GLUT_DOWN))
- souris_milieu=1;
- if((button==GLUT_MIDDLE_BUTTON)&&(state==GLUT_UP))
- souris_milieu=0;
- }
-
- //Gestion des coordonnees de la souris
- void Souris_position(int x,int y)
- {
- xmouse=x;
- ymouse=tailley-y;
- }
-
- void Clavier_standart(unsigned char key,int x,int y)
- {
- if(key==27) exit(0);
- }
-
- typedef struct
- {
- int xbas;
- int ybas;
- int largeur;
- int hauteur;
- char *texte;
- int etat;
- int dep;
- int place;
- int flag_quitter;
- int flag_reduction;
- }FENETRE;
-
- int depl1x,depl1y,depl2x,depl2y;
- int x2,y2;
- int flag_bouton1=0,flag_bouton2=0,flag_bouton3=0,flag_bouton4=0,flag_bouton5=0;
- int fac1=1,fac2=1,fac3=1,fac4=1,fac5=1;
-
- void Tri_fenetres(FENETRE *,int);
- void Menu(FENETRE &,int,FENETRE *,int);
- void Bouton_quitter(int,int,FENETRE &,int);
- void Bouton_reduction(int,int,FENETRE &,int,int);
- void Gere_boutons_reduits(FENETRE *,int);
- void Deplace_fenetre(FENETRE &);
- void bouton(char *,int,int,int,float,FENETRE &,FENETRE *,int &,int);
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // Affichage des fenetres //
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void Fenetre(FENETRE *fen,int nb)
- {
- int i,j,modif;
-
- Tri_fenetres(fen,nb);
-
- for(i=0;i<nb;i++)
- {
- for(j=0;j<nb;j++)
- {
- if(fen[j].place==nb-i)
- {
- if(fen[j].etat!=0)
- {
- if((fen[j].flag_quitter==0)&&(fen[j].flag_reduction==0))
- {
- Deplace_fenetre(fen[j]);
- }
-
- Gere_boutons_reduits(fen,nb);
-
- if(fen[j].place==1) modif=1;
- else modif=0;
- Menu(fen[j],modif,fen,nb);
-
- if(fen[j].flag_quitter==1) modif=1;
- else modif=0;
- Bouton_quitter(fen[j].xbas+fen[j].largeur-25,fen[j].ybas+fen[j].hauteur+2,fen[j],modif);
-
- if(fen[j].flag_reduction==1) modif=1;
- else modif=0;
- Bouton_reduction(fen[j].xbas+fen[j].largeur-45,fen[j].ybas+fen[j].hauteur+2,fen[j],modif,nb);
- }
- }
- }
- }
- }
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // Bouton quitter de la fenetre //
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void Bouton_quitter(int x,int y,FENETRE &fen,int modif)
- {
- //Initialisation du flag pour le clique sur le bouton
- if((xmouse>=x)&&(xmouse<=x+15)&&(ymouse>=y)&&(ymouse<=y+15)&&(souris_gauche==1)&&(fen.place==1))
- {
- fen.flag_quitter=1;
- }
-
- //Fermeture de la fenetre du bouton_quitter
- if((xmouse>=x)&&(xmouse<=x+15)&&(ymouse>=y)&&(ymouse<=y+15)&&(souris_gauche==0)&&(fen.flag_quitter==1))
- {
- fen.etat=0;
- fen.flag_quitter=0;
- }
-
- //Annulation si la souris est relachee a cote du bouton
- if(((xmouse<x)||(xmouse>x+15)||(ymouse<y)||(ymouse>y+15))&&(fen.flag_quitter==1))
- {
- fen.flag_quitter=0;
- }
-
- glBegin(GL_QUADS);
- glColor3f(0.5,modif,modif);
- glVertex2d(x,y);
- glColor3f(fabs(modif-0.8),modif,modif);
- glVertex2d(x+15,y);
- glColor3f(0.5,modif,modif);
- glVertex2d(x+15,y+15);
- glColor3f(1-modif,1-modif,1-modif);
- glVertex2d(x,y+15);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glColor3f(fabs(modif-0.6),fabs(modif-0.1),fabs(modif-0.3));
- glVertex2d(x,y);
- glVertex2d(x+15,y);
- glVertex2d(x+15,y+15);
- glVertex2d(x,y+15);
- glEnd();
- glBegin(GL_LINES);
- glColor3f(1-modif,1-modif,1-modif);
- glVertex2d(x,y);
- glVertex2d(x+15,y+15);
- glVertex2d(x,y+15);
- glVertex2d(x+15,y);
- glEnd();
- }
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // Gere la reduction des fenetres //
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void Bouton_reduction(int x,int y,FENETRE &fen,int modif,int nb)
- {
- //Initialisation de la reduction pour le clique sur le bouton
- if((xmouse>=x)&&(xmouse<=x+15)&&(ymouse>=y)&&(ymouse<=y+15)&&(souris_gauche==1)&&(fen.place==1))
- {
- fen.flag_reduction=1;
- }
-
- //Reduction ou agrandissement de la fenetre
- if((xmouse>=x)&&(xmouse<=x+15)&&(ymouse>=y)&&(ymouse<=y+15)&&(souris_gauche==0)&&(fen.flag_reduction==1))
- {
- fen.etat=3-fen.etat;
- fen.flag_reduction=0;
- }
-
- //Annulation si la souris est relachee a cote du bouton
- if(((xmouse<x)||(xmouse>x+15)||(ymouse<y)||(ymouse>y+15))&&(fen.flag_reduction==1))
- {
- fen.flag_reduction=0;
- }
-
- glBegin(GL_QUADS);
- glColor3f(0.5,modif,fabs(modif-0.8));
- glVertex2d(x,y);
- glColor3f(modif,modif,fabs(modif-0.8));
- glVertex2d(x+15,y);
- glColor3f(0.5,modif,fabs(modif-0.8));
- glVertex2d(x+15,y+15);
- glColor3f(1-modif,1-modif,1-modif);
- glVertex2d(x,y+15);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glColor3f(fabs(modif-0.6),fabs(modif-0.1),fabs(modif-0.3));
- glVertex2d(x,y);
- glVertex2d(x+15,y);
- glVertex2d(x+15,y+15);
- glVertex2d(x,y+15);
- glEnd();
- glBegin(GL_LINES);
- glColor3f(1-modif,1-modif,1-modif);
- glVertex2d(x+2,y+4);
- glVertex2d(x+13,y+4);
- glEnd();
- }
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // Affiche du texte en OpenGL //
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void Ecrire(int x,int y,char *texte)
- {
- unsigned int i;
- glRasterPos2d(x,y);
-
- for (i = 0; i < strlen (texte); i++)
- glutBitmapCharacter (GLUT_BITMAP_HELVETICA_10, texte[i]);
- }
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // Reoganisation de la place des fenetres //
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void Tri_fenetres(FENETRE *fen,int nb)
- {
- int i,j,num_proche=nb,num_eloigne=-1;
-
- //num_proche est le numero de la fenetre a placer au 1er plan apres un clique
- for(i=0;i<nb;i++)
- {
- if(fen[i].etat==1)
- {
- if((xmouse>=fen[i].xbas)&&(xmouse<=fen[i].xbas+fen[i].largeur)&&(ymouse>=fen[i].ybas)&&(ymouse<=fen[i].ybas+fen[i].hauteur+20)&&(souris_gauche==1))
- {
- if(num_proche==nb) num_proche=i;
- if(fen[num_proche].place>fen[i].place) num_proche=i;
- }
- }
-
- if(fen[i].etat==2)
- {
- if((xmouse>=fen[i].xbas)&&(xmouse<=fen[i].xbas+fen[i].largeur)&&(ymouse>=fen[i].ybas+fen[i].hauteur)&&(ymouse<=fen[i].ybas+fen[i].hauteur+20)&&(souris_gauche==1))
- {
- if(num_proche==nb) num_proche=i;
- if(fen[num_proche].place>fen[i].place) num_proche=i;
- }
- }
- }
-
- //mise a jour des places en fonction de la fenetre mise en 1er plan
- if(num_proche!=nb)
- {
- for(i=0;i<nb;i++)
- if(fen[i].place<fen[num_proche].place) fen[i].place+=1;
- fen[num_proche].place=1;
- }
-
- //num_eloigne est le numero de la fenetre la plus eloigne
- for(i=0;i<nb;i++)
- {
- if(num_eloigne==-1) num_eloigne=i;
- if(fen[num_eloigne].place<fen[i].place) num_eloigne=i;
- }
-
- //mise a jour des places en fonction des fenetres supprimees
- if(num_eloigne!=-1)
- {
- for(i=0;i<nb;i++)
- {
- if(fen[i].etat==0)
- {
- for(j=0;j<nb;j++)
- if(fen[j].place>fen[i].place) fen[j].place-=1;
- fen[i].place=nb;
- }
- }
- }
- }
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // Cadre de la fenetre //
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void Menu(FENETRE &fen,int modif,FENETRE *fen_global,int nb)
- {
- int epaisseur=3;
-
- if(fen.etat!=2)
- {
- glBegin(GL_POLYGON);
- glColor3f(0,0,0.8);
- glVertex2d(fen.xbas,fen.ybas);
- glVertex2d(fen.xbas+fen.largeur,fen.ybas);
- glVertex2d(fen.xbas+fen.largeur-epaisseur,fen.ybas+epaisseur);
- glVertex2d(fen.xbas+epaisseur,fen.ybas+epaisseur);
- glEnd();
-
- glBegin(GL_POLYGON);
- glColor3f(0,0,0.8);
- glVertex2d(fen.xbas,fen.ybas+fen.hauteur);
- glVertex2d(fen.xbas+fen.largeur,fen.ybas+fen.hauteur);
- glVertex2d(fen.xbas+fen.largeur-epaisseur,fen.ybas+fen.hauteur-epaisseur);
- glVertex2d(fen.xbas+epaisseur,fen.ybas+fen.hauteur-epaisseur);
- glEnd();
-
- glBegin(GL_POLYGON);
- glColor3f(0,0,0.8);
- glVertex2d(fen.xbas,fen.ybas);
- glVertex2d(fen.xbas,fen.ybas+fen.hauteur);
- glVertex2d(fen.xbas+epaisseur,fen.ybas+fen.hauteur-epaisseur);
- glVertex2d(fen.xbas+epaisseur,fen.ybas+epaisseur);
- glEnd();
-
- glBegin(GL_POLYGON);
- glColor3f(0,0,0.8);
- glVertex2d(fen.xbas+fen.largeur,fen.ybas);
- glVertex2d(fen.xbas+fen.largeur,fen.ybas+fen.hauteur);
- glVertex2d(fen.xbas+fen.largeur-epaisseur,fen.ybas+fen.hauteur-epaisseur);
- glVertex2d(fen.xbas+fen.largeur-epaisseur,fen.ybas+epaisseur);
- glEnd();
-
- glBegin(GL_POLYGON);
- glColor3f(0.8,0.7,0.6);
- glVertex2d(fen.xbas+epaisseur,fen.ybas+epaisseur);
- glVertex2d(fen.xbas+fen.largeur-epaisseur,fen.ybas+epaisseur);
- glColor3f(0.5,0.4,0.3);
- glVertex2d(fen.xbas+fen.largeur-epaisseur,fen.ybas+fen.hauteur-epaisseur);
- glVertex2d(fen.xbas+epaisseur,fen.ybas+fen.hauteur-epaisseur);
- glEnd();
- if(fen.texte=="Fenetre principale.")
- {
- bouton("Fenetre1",fen.xbas+5,fen.ybas+fen.hauteur-40,120,fac1,fen,fen_global,flag_bouton1,nb);
- bouton("Fenetre2",fen.xbas+5,fen.ybas+fen.hauteur-40-50,120,fac2,fen,fen_global,flag_bouton2,nb);
- bouton("Fenetre3",fen.xbas+5,fen.ybas+fen.hauteur-40-100,120,fac3,fen,fen_global,flag_bouton3,nb);
- bouton("Fenetre4",fen.xbas+5,fen.ybas+fen.hauteur-40-150,120,fac4,fen,fen_global,flag_bouton4,nb);
- bouton("Fenetre5",fen.xbas+5,fen.ybas+fen.hauteur-40-200,120,fac5,fen,fen_global,flag_bouton5,nb);
- }
- }
-
- glBegin(GL_POLYGON);
- glColor3f(modif,modif,fabs(modif-0.8));
- glVertex2d(fen.xbas,fen.ybas+fen.hauteur);
- glVertex2d(fen.xbas,fen.ybas+fen.hauteur+10);
- glVertex2d(fen.xbas+10,fen.ybas+fen.hauteur+20);
- glColor3f(fabs(modif-0.2),fabs(modif-0.7),fabs(modif-0.9));
- glVertex2d(fen.xbas+fen.largeur-10,fen.ybas+fen.hauteur+20);
- glVertex2d(fen.xbas+fen.largeur,fen.ybas+fen.hauteur+10);
- glVertex2d(fen.xbas+fen.largeur,fen.ybas+fen.hauteur);
- glEnd();
-
- glColor3f(1,0,0);
- Ecrire(fen.xbas+10,fen.ybas+fen.hauteur+5,fen.texte);
- }
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // Deplacement de la fenetre et activation //
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void Deplace_fenetre(FENETRE &fen)
- {
- if((xmouse>=fen.xbas)&&(xmouse<=fen.xbas+fen.largeur)&&(ymouse>=fen.ybas+fen.hauteur)&&(ymouse<=fen.ybas+fen.hauteur+20)&&(souris_gauche==1)&&(fen.dep==0)&&(fen.place==1))
- {
- depl1x=xmouse;
- depl1y=ymouse;
- fen.dep=1;
- }
-
- if((souris_gauche==1)&&(fen.dep==1)&&(fen.place==1))
- {
- depl2x=xmouse;
- depl2y=ymouse;
- fen.xbas+=(depl2x-depl1x);
- fen.ybas+=(depl2y-depl1y);
-
- if(fen.xbas<0) fen.xbas=0;
- if(fen.xbas>taillex-fen.largeur) fen.xbas=taillex-fen.largeur;
-
- if(fen.ybas+fen.hauteur<0) fen.ybas=-fen.hauteur;
- if(fen.ybas>tailley-fen.hauteur-20) fen.ybas=tailley-fen.hauteur-20;
-
- depl1x=depl2x;
- depl1y=depl2y;
- }
-
- if(souris_gauche==0)
- {
- depl1x=depl1y=depl2x=depl2y=fen.dep=0;
- }
- }
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // Tri des fenetres reduites //
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void Gere_boutons_reduits(FENETRE *fen,int nb)
- {
- int i,nb_reduit=0;
-
- for(i=0;i<nb;i++)
- {
- if(fen[i].etat==2)
- {
- nb_reduit+=1;
- fen[i].ybas=tailley-fen[i].hauteur-20*nb_reduit;
- fen[i].xbas=0;
- }
- }
- }
-
- //Bouton
- void bouton(char *text,int x,int y,int lg,float fac,FENETRE &fen,FENETRE *fen_global,int &flag_bouton,int nb)
- {
- int i;
-
- if((xmouse>=x)&&(xmouse<=x+200)&&(ymouse>=y)&&(ymouse<=y+25)&&(souris_gauche==1)&&(fen.place==1))
- {
- flag_bouton=1;
- fac=0.5;
- }
-
- if((xmouse>=x)&&(xmouse<=x+200)&&(ymouse>=y)&&(ymouse<=y+25)&&(souris_gauche==0)&&(flag_bouton==1))
- {
- flag_bouton=0;
-
- for(i=1;i<nb;i++)
- if(text==fen_global[i].texte) fen_global[i].etat=2;
- }
-
- //Annulation si la souris est relachee a cote du bouton
- if(((xmouse<x)||(xmouse>x+200)||(ymouse<y)||(ymouse>y+25))&&(flag_bouton==1))
- {
- flag_bouton=0;
- fac=1;
- }
-
- int lettres;
- lettres=strlen(text);
- glColor3f(fac*0.4,fac*0.4,fac*0.4);
- glBegin(GL_POLYGON);
- glVertex2f(x,y);
- glColor3f(fac*0.3,fac*0.7,fac*0.9);
- glVertex2f(lg+x,y);
- glColor3f(fac*0.3,fac*0.8,fac*0.8);
- glVertex2f(lg+x,y+25);
- glColor3f(fac*0.8,fac*0.2,fac*0.8);
- glVertex2f(x,y+25);
- glEnd();
-
-
- glBegin(GL_POLYGON);
- glColor3f(0,fac*0.6,0);
- glVertex2f(lg+x,y+25);
- glVertex2f(lg+2+x,y+30);
- glColor3f(0,fac*0.3,0);
- glVertex2f(x+2,y+30);
- glVertex2f(x,y+25);
- glEnd();
-
- glBegin(GL_POLYGON);
- glColor3f(0,fac*0.6,0);
- glVertex2f(x+lg,y+25);
- glVertex2f(lg+2+x,y+30);
- glColor3f(0,fac*0.8,0);
- glVertex2f(lg+2+x,y+2);
- glVertex2f(lg+x,y);
- glEnd();
-
- glColor3f(fac*0.1,fac*0.3,fac);
- Ecrire(x+lg/2-4.5*lettres/2,y+10,text);
- }
-
- void Draw(void);
-
- // xbas | ybas| largeur | hauteur | titre | etat(0:supprime 1:active 2:reduite) | deplacement_en_cours(0 ou 1) |
- // plan(1 jusqua nb_fenetre) | flag_quitter(0 ou 1) | reduction(0 ou 1)
-
- //La hauteur de la fenetre sera de hauteur+20 pour le titre.
- FENETRE liste[nb_fenetre]={
- {400,180,400,400,"Fenetre principale.",1,0,1,0,0},
- {100,200,300,300,"Fenetre1",0,0,2,0,0},
- {100,200,300,300,"Fenetre2",0,0,3,0,0},
- {100,200,300,300,"Fenetre3",0,0,4,0,0},
- {100,200,300,300,"Fenetre4",0,0,5,0,0},
- {100,200,300,300,"Fenetre5",0,0,6,0,0}
- };
-
- //Fonction de rafraichissement d'une fenêtre OpenGL
- void Reshape(int width, int height)
- {
- tailley=height;
- taillex=width;
- glViewport(0,0,width,height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0,width,0,height,1,-1);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
-
- int main()
- {
- glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
- glutInitWindowSize(800,600);
- glutCreateWindow("seb");
- glutReshapeFunc(Reshape);
- glutDisplayFunc(Draw);
- glutKeyboardFunc(Clavier_standart);
- glutMotionFunc(Souris_position);
- glutMouseFunc(Souris_clique);
- glutMainLoop();
- return 0;
- }
-
- void Draw()
- {
- glutSetWindowTitle("Fenetre principale.");
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- //Mise en place des fenetres
- Fenetre(liste,nb_fenetre);
-
- //Forcage de l'affichage
- glutPostRedisplay();
- glutSwapBuffers();
- }
#include <gl\glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define nb_fenetre 6
int xmouse,ymouse,souris_gauche=0,souris_droite=0,souris_milieu=0,tailley=599,taillex=799;
//Gestion des clique de la souris
void Souris_clique(int button,int state,int x,int y)
{
xmouse=x;
ymouse=tailley-y;
if((button==GLUT_LEFT_BUTTON)&&(state==GLUT_DOWN))
souris_gauche=1;
if((button==GLUT_LEFT_BUTTON)&&(state==GLUT_UP))
souris_gauche=0;
if((button==GLUT_RIGHT_BUTTON)&&(state==GLUT_DOWN))
souris_droite=1;
if((button==GLUT_RIGHT_BUTTON)&&(state==GLUT_UP))
souris_droite=0;
if((button==GLUT_MIDDLE_BUTTON)&&(state==GLUT_DOWN))
souris_milieu=1;
if((button==GLUT_MIDDLE_BUTTON)&&(state==GLUT_UP))
souris_milieu=0;
}
//Gestion des coordonnees de la souris
void Souris_position(int x,int y)
{
xmouse=x;
ymouse=tailley-y;
}
void Clavier_standart(unsigned char key,int x,int y)
{
if(key==27) exit(0);
}
typedef struct
{
int xbas;
int ybas;
int largeur;
int hauteur;
char *texte;
int etat;
int dep;
int place;
int flag_quitter;
int flag_reduction;
}FENETRE;
int depl1x,depl1y,depl2x,depl2y;
int x2,y2;
int flag_bouton1=0,flag_bouton2=0,flag_bouton3=0,flag_bouton4=0,flag_bouton5=0;
int fac1=1,fac2=1,fac3=1,fac4=1,fac5=1;
void Tri_fenetres(FENETRE *,int);
void Menu(FENETRE &,int,FENETRE *,int);
void Bouton_quitter(int,int,FENETRE &,int);
void Bouton_reduction(int,int,FENETRE &,int,int);
void Gere_boutons_reduits(FENETRE *,int);
void Deplace_fenetre(FENETRE &);
void bouton(char *,int,int,int,float,FENETRE &,FENETRE *,int &,int);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Affichage des fenetres //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Fenetre(FENETRE *fen,int nb)
{
int i,j,modif;
Tri_fenetres(fen,nb);
for(i=0;i<nb;i++)
{
for(j=0;j<nb;j++)
{
if(fen[j].place==nb-i)
{
if(fen[j].etat!=0)
{
if((fen[j].flag_quitter==0)&&(fen[j].flag_reduction==0))
{
Deplace_fenetre(fen[j]);
}
Gere_boutons_reduits(fen,nb);
if(fen[j].place==1) modif=1;
else modif=0;
Menu(fen[j],modif,fen,nb);
if(fen[j].flag_quitter==1) modif=1;
else modif=0;
Bouton_quitter(fen[j].xbas+fen[j].largeur-25,fen[j].ybas+fen[j].hauteur+2,fen[j],modif);
if(fen[j].flag_reduction==1) modif=1;
else modif=0;
Bouton_reduction(fen[j].xbas+fen[j].largeur-45,fen[j].ybas+fen[j].hauteur+2,fen[j],modif,nb);
}
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Bouton quitter de la fenetre //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Bouton_quitter(int x,int y,FENETRE &fen,int modif)
{
//Initialisation du flag pour le clique sur le bouton
if((xmouse>=x)&&(xmouse<=x+15)&&(ymouse>=y)&&(ymouse<=y+15)&&(souris_gauche==1)&&(fen.place==1))
{
fen.flag_quitter=1;
}
//Fermeture de la fenetre du bouton_quitter
if((xmouse>=x)&&(xmouse<=x+15)&&(ymouse>=y)&&(ymouse<=y+15)&&(souris_gauche==0)&&(fen.flag_quitter==1))
{
fen.etat=0;
fen.flag_quitter=0;
}
//Annulation si la souris est relachee a cote du bouton
if(((xmouse<x)||(xmouse>x+15)||(ymouse<y)||(ymouse>y+15))&&(fen.flag_quitter==1))
{
fen.flag_quitter=0;
}
glBegin(GL_QUADS);
glColor3f(0.5,modif,modif);
glVertex2d(x,y);
glColor3f(fabs(modif-0.8),modif,modif);
glVertex2d(x+15,y);
glColor3f(0.5,modif,modif);
glVertex2d(x+15,y+15);
glColor3f(1-modif,1-modif,1-modif);
glVertex2d(x,y+15);
glEnd();
glBegin(GL_LINE_LOOP);
glColor3f(fabs(modif-0.6),fabs(modif-0.1),fabs(modif-0.3));
glVertex2d(x,y);
glVertex2d(x+15,y);
glVertex2d(x+15,y+15);
glVertex2d(x,y+15);
glEnd();
glBegin(GL_LINES);
glColor3f(1-modif,1-modif,1-modif);
glVertex2d(x,y);
glVertex2d(x+15,y+15);
glVertex2d(x,y+15);
glVertex2d(x+15,y);
glEnd();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Gere la reduction des fenetres //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Bouton_reduction(int x,int y,FENETRE &fen,int modif,int nb)
{
//Initialisation de la reduction pour le clique sur le bouton
if((xmouse>=x)&&(xmouse<=x+15)&&(ymouse>=y)&&(ymouse<=y+15)&&(souris_gauche==1)&&(fen.place==1))
{
fen.flag_reduction=1;
}
//Reduction ou agrandissement de la fenetre
if((xmouse>=x)&&(xmouse<=x+15)&&(ymouse>=y)&&(ymouse<=y+15)&&(souris_gauche==0)&&(fen.flag_reduction==1))
{
fen.etat=3-fen.etat;
fen.flag_reduction=0;
}
//Annulation si la souris est relachee a cote du bouton
if(((xmouse<x)||(xmouse>x+15)||(ymouse<y)||(ymouse>y+15))&&(fen.flag_reduction==1))
{
fen.flag_reduction=0;
}
glBegin(GL_QUADS);
glColor3f(0.5,modif,fabs(modif-0.8));
glVertex2d(x,y);
glColor3f(modif,modif,fabs(modif-0.8));
glVertex2d(x+15,y);
glColor3f(0.5,modif,fabs(modif-0.8));
glVertex2d(x+15,y+15);
glColor3f(1-modif,1-modif,1-modif);
glVertex2d(x,y+15);
glEnd();
glBegin(GL_LINE_LOOP);
glColor3f(fabs(modif-0.6),fabs(modif-0.1),fabs(modif-0.3));
glVertex2d(x,y);
glVertex2d(x+15,y);
glVertex2d(x+15,y+15);
glVertex2d(x,y+15);
glEnd();
glBegin(GL_LINES);
glColor3f(1-modif,1-modif,1-modif);
glVertex2d(x+2,y+4);
glVertex2d(x+13,y+4);
glEnd();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Affiche du texte en OpenGL //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Ecrire(int x,int y,char *texte)
{
unsigned int i;
glRasterPos2d(x,y);
for (i = 0; i < strlen (texte); i++)
glutBitmapCharacter (GLUT_BITMAP_HELVETICA_10, texte[i]);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Reoganisation de la place des fenetres //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Tri_fenetres(FENETRE *fen,int nb)
{
int i,j,num_proche=nb,num_eloigne=-1;
//num_proche est le numero de la fenetre a placer au 1er plan apres un clique
for(i=0;i<nb;i++)
{
if(fen[i].etat==1)
{
if((xmouse>=fen[i].xbas)&&(xmouse<=fen[i].xbas+fen[i].largeur)&&(ymouse>=fen[i].ybas)&&(ymouse<=fen[i].ybas+fen[i].hauteur+20)&&(souris_gauche==1))
{
if(num_proche==nb) num_proche=i;
if(fen[num_proche].place>fen[i].place) num_proche=i;
}
}
if(fen[i].etat==2)
{
if((xmouse>=fen[i].xbas)&&(xmouse<=fen[i].xbas+fen[i].largeur)&&(ymouse>=fen[i].ybas+fen[i].hauteur)&&(ymouse<=fen[i].ybas+fen[i].hauteur+20)&&(souris_gauche==1))
{
if(num_proche==nb) num_proche=i;
if(fen[num_proche].place>fen[i].place) num_proche=i;
}
}
}
//mise a jour des places en fonction de la fenetre mise en 1er plan
if(num_proche!=nb)
{
for(i=0;i<nb;i++)
if(fen[i].place<fen[num_proche].place) fen[i].place+=1;
fen[num_proche].place=1;
}
//num_eloigne est le numero de la fenetre la plus eloigne
for(i=0;i<nb;i++)
{
if(num_eloigne==-1) num_eloigne=i;
if(fen[num_eloigne].place<fen[i].place) num_eloigne=i;
}
//mise a jour des places en fonction des fenetres supprimees
if(num_eloigne!=-1)
{
for(i=0;i<nb;i++)
{
if(fen[i].etat==0)
{
for(j=0;j<nb;j++)
if(fen[j].place>fen[i].place) fen[j].place-=1;
fen[i].place=nb;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Cadre de la fenetre //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Menu(FENETRE &fen,int modif,FENETRE *fen_global,int nb)
{
int epaisseur=3;
if(fen.etat!=2)
{
glBegin(GL_POLYGON);
glColor3f(0,0,0.8);
glVertex2d(fen.xbas,fen.ybas);
glVertex2d(fen.xbas+fen.largeur,fen.ybas);
glVertex2d(fen.xbas+fen.largeur-epaisseur,fen.ybas+epaisseur);
glVertex2d(fen.xbas+epaisseur,fen.ybas+epaisseur);
glEnd();
glBegin(GL_POLYGON);
glColor3f(0,0,0.8);
glVertex2d(fen.xbas,fen.ybas+fen.hauteur);
glVertex2d(fen.xbas+fen.largeur,fen.ybas+fen.hauteur);
glVertex2d(fen.xbas+fen.largeur-epaisseur,fen.ybas+fen.hauteur-epaisseur);
glVertex2d(fen.xbas+epaisseur,fen.ybas+fen.hauteur-epaisseur);
glEnd();
glBegin(GL_POLYGON);
glColor3f(0,0,0.8);
glVertex2d(fen.xbas,fen.ybas);
glVertex2d(fen.xbas,fen.ybas+fen.hauteur);
glVertex2d(fen.xbas+epaisseur,fen.ybas+fen.hauteur-epaisseur);
glVertex2d(fen.xbas+epaisseur,fen.ybas+epaisseur);
glEnd();
glBegin(GL_POLYGON);
glColor3f(0,0,0.8);
glVertex2d(fen.xbas+fen.largeur,fen.ybas);
glVertex2d(fen.xbas+fen.largeur,fen.ybas+fen.hauteur);
glVertex2d(fen.xbas+fen.largeur-epaisseur,fen.ybas+fen.hauteur-epaisseur);
glVertex2d(fen.xbas+fen.largeur-epaisseur,fen.ybas+epaisseur);
glEnd();
glBegin(GL_POLYGON);
glColor3f(0.8,0.7,0.6);
glVertex2d(fen.xbas+epaisseur,fen.ybas+epaisseur);
glVertex2d(fen.xbas+fen.largeur-epaisseur,fen.ybas+epaisseur);
glColor3f(0.5,0.4,0.3);
glVertex2d(fen.xbas+fen.largeur-epaisseur,fen.ybas+fen.hauteur-epaisseur);
glVertex2d(fen.xbas+epaisseur,fen.ybas+fen.hauteur-epaisseur);
glEnd();
if(fen.texte=="Fenetre principale.")
{
bouton("Fenetre1",fen.xbas+5,fen.ybas+fen.hauteur-40,120,fac1,fen,fen_global,flag_bouton1,nb);
bouton("Fenetre2",fen.xbas+5,fen.ybas+fen.hauteur-40-50,120,fac2,fen,fen_global,flag_bouton2,nb);
bouton("Fenetre3",fen.xbas+5,fen.ybas+fen.hauteur-40-100,120,fac3,fen,fen_global,flag_bouton3,nb);
bouton("Fenetre4",fen.xbas+5,fen.ybas+fen.hauteur-40-150,120,fac4,fen,fen_global,flag_bouton4,nb);
bouton("Fenetre5",fen.xbas+5,fen.ybas+fen.hauteur-40-200,120,fac5,fen,fen_global,flag_bouton5,nb);
}
}
glBegin(GL_POLYGON);
glColor3f(modif,modif,fabs(modif-0.8));
glVertex2d(fen.xbas,fen.ybas+fen.hauteur);
glVertex2d(fen.xbas,fen.ybas+fen.hauteur+10);
glVertex2d(fen.xbas+10,fen.ybas+fen.hauteur+20);
glColor3f(fabs(modif-0.2),fabs(modif-0.7),fabs(modif-0.9));
glVertex2d(fen.xbas+fen.largeur-10,fen.ybas+fen.hauteur+20);
glVertex2d(fen.xbas+fen.largeur,fen.ybas+fen.hauteur+10);
glVertex2d(fen.xbas+fen.largeur,fen.ybas+fen.hauteur);
glEnd();
glColor3f(1,0,0);
Ecrire(fen.xbas+10,fen.ybas+fen.hauteur+5,fen.texte);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Deplacement de la fenetre et activation //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Deplace_fenetre(FENETRE &fen)
{
if((xmouse>=fen.xbas)&&(xmouse<=fen.xbas+fen.largeur)&&(ymouse>=fen.ybas+fen.hauteur)&&(ymouse<=fen.ybas+fen.hauteur+20)&&(souris_gauche==1)&&(fen.dep==0)&&(fen.place==1))
{
depl1x=xmouse;
depl1y=ymouse;
fen.dep=1;
}
if((souris_gauche==1)&&(fen.dep==1)&&(fen.place==1))
{
depl2x=xmouse;
depl2y=ymouse;
fen.xbas+=(depl2x-depl1x);
fen.ybas+=(depl2y-depl1y);
if(fen.xbas<0) fen.xbas=0;
if(fen.xbas>taillex-fen.largeur) fen.xbas=taillex-fen.largeur;
if(fen.ybas+fen.hauteur<0) fen.ybas=-fen.hauteur;
if(fen.ybas>tailley-fen.hauteur-20) fen.ybas=tailley-fen.hauteur-20;
depl1x=depl2x;
depl1y=depl2y;
}
if(souris_gauche==0)
{
depl1x=depl1y=depl2x=depl2y=fen.dep=0;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Tri des fenetres reduites //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Gere_boutons_reduits(FENETRE *fen,int nb)
{
int i,nb_reduit=0;
for(i=0;i<nb;i++)
{
if(fen[i].etat==2)
{
nb_reduit+=1;
fen[i].ybas=tailley-fen[i].hauteur-20*nb_reduit;
fen[i].xbas=0;
}
}
}
//Bouton
void bouton(char *text,int x,int y,int lg,float fac,FENETRE &fen,FENETRE *fen_global,int &flag_bouton,int nb)
{
int i;
if((xmouse>=x)&&(xmouse<=x+200)&&(ymouse>=y)&&(ymouse<=y+25)&&(souris_gauche==1)&&(fen.place==1))
{
flag_bouton=1;
fac=0.5;
}
if((xmouse>=x)&&(xmouse<=x+200)&&(ymouse>=y)&&(ymouse<=y+25)&&(souris_gauche==0)&&(flag_bouton==1))
{
flag_bouton=0;
for(i=1;i<nb;i++)
if(text==fen_global[i].texte) fen_global[i].etat=2;
}
//Annulation si la souris est relachee a cote du bouton
if(((xmouse<x)||(xmouse>x+200)||(ymouse<y)||(ymouse>y+25))&&(flag_bouton==1))
{
flag_bouton=0;
fac=1;
}
int lettres;
lettres=strlen(text);
glColor3f(fac*0.4,fac*0.4,fac*0.4);
glBegin(GL_POLYGON);
glVertex2f(x,y);
glColor3f(fac*0.3,fac*0.7,fac*0.9);
glVertex2f(lg+x,y);
glColor3f(fac*0.3,fac*0.8,fac*0.8);
glVertex2f(lg+x,y+25);
glColor3f(fac*0.8,fac*0.2,fac*0.8);
glVertex2f(x,y+25);
glEnd();
glBegin(GL_POLYGON);
glColor3f(0,fac*0.6,0);
glVertex2f(lg+x,y+25);
glVertex2f(lg+2+x,y+30);
glColor3f(0,fac*0.3,0);
glVertex2f(x+2,y+30);
glVertex2f(x,y+25);
glEnd();
glBegin(GL_POLYGON);
glColor3f(0,fac*0.6,0);
glVertex2f(x+lg,y+25);
glVertex2f(lg+2+x,y+30);
glColor3f(0,fac*0.8,0);
glVertex2f(lg+2+x,y+2);
glVertex2f(lg+x,y);
glEnd();
glColor3f(fac*0.1,fac*0.3,fac);
Ecrire(x+lg/2-4.5*lettres/2,y+10,text);
}
void Draw(void);
// xbas | ybas| largeur | hauteur | titre | etat(0:supprime 1:active 2:reduite) | deplacement_en_cours(0 ou 1) |
// plan(1 jusqua nb_fenetre) | flag_quitter(0 ou 1) | reduction(0 ou 1)
//La hauteur de la fenetre sera de hauteur+20 pour le titre.
FENETRE liste[nb_fenetre]={
{400,180,400,400,"Fenetre principale.",1,0,1,0,0},
{100,200,300,300,"Fenetre1",0,0,2,0,0},
{100,200,300,300,"Fenetre2",0,0,3,0,0},
{100,200,300,300,"Fenetre3",0,0,4,0,0},
{100,200,300,300,"Fenetre4",0,0,5,0,0},
{100,200,300,300,"Fenetre5",0,0,6,0,0}
};
//Fonction de rafraichissement d'une fenêtre OpenGL
void Reshape(int width, int height)
{
tailley=height;
taillex=width;
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,width,0,height,1,-1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main()
{
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(800,600);
glutCreateWindow("seb");
glutReshapeFunc(Reshape);
glutDisplayFunc(Draw);
glutKeyboardFunc(Clavier_standart);
glutMotionFunc(Souris_position);
glutMouseFunc(Souris_clique);
glutMainLoop();
return 0;
}
void Draw()
{
glutSetWindowTitle("Fenetre principale.");
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//Mise en place des fenetres
Fenetre(liste,nb_fenetre);
//Forcage de l'affichage
glutPostRedisplay();
glutSwapBuffers();
}
Conclusion
Il faut que la librairie opengl soit installée.
Fichier Zip
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
Télécharger le zip
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Comparez les prix Nouvelle version
|