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 / Exemple :


#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.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.