Gestionnaire de fenêtres avec menu code source en langage C
Cet article propose en détaille un programme en langage C de gestionnaire de fenêtres. Il permet de créer des fenêtres, les déplacer, les dimensionner, les réduire ...
Vous pourrez télécharger le fichier au format zip il contient le code source complet.
Extrait du code source :
//Unit‚s utilis‚es
#include <Types2.h>
#include <Time.h>
TMsg Msg;
char c,T;
Bool test,Quit=false;
Entier X,Y,A,M;
int i;
Entier Fois=0; Bool Compter=false,Relache=true;
unsigned long Compteur=0;
clock_t start, end;
TMsg IDLE();
/* PROGRAMME PRINCIPAL */
int main()
{ Init();
Appuye=false;
Fois=0;
Compteur=0;
do /* Boucle infinie */
{
Msg=IDLE();
if (Msg.Type==E_EXIT) break;
TMenu &PMenu=*Menu;
if ( Msg.Y>=20 && Selection==false &&
PMenu.GestionMessage(Msg)==true ) ;
else
if (NAct>0) //il y a au moins une fenetre active
for(i=NAct-1;i!=-1;i--)
{ TFenetre &Fen=*Fenetres[ File[i] ];
if ( Fen.GestionMessage(Msg)==true ) break;
}
}
while ( Msg.Type!= E_EXIT && QUIT!=true );
delete(Menu);
asm {mov ax,02;int 0x33};//masquer le curseur de la souris
return(0);
}
TMsg IDLE()
{
TMsg Msg;
Msg.Type=E_RIEN;
signed int Dx,Dy;
TEVENT T;
Bool D,F;
while (Msg.Type==E_RIEN)
{
/*if (Compter==false) Compteur=0;else
if (Compteur>100000) Compter=false;*/
/*if (Compter) start=clock();
else start=0;*/
if ( OnClicGauche(X,Y)==true ) { Msg.Type=E_CLIC;
if (Msg.Type==E_DOUBLECLIC) Msg.Type=E_RIEN;
Msg.X=X;
Msg.Y=Y;
if (Fois==1) {Compter=true;Compteur=0;
start=clock();}
//D=true;Compter=true;
Relache=true;
} else
if (Appuye==true) //if (Relache)
{
Msg.Type=E_APP;
Msg.X=X; Msg.Y=Y;
if ( OnMouseMove(X,Y,Dx,Dy)==true ) {
Msg.DepX=Dx;
Msg.DepY=Dy;
Msg.Deplaced=true;
}
else Msg.Deplaced=false;
if (Relache) { Fois++;
if (Fois==2) {end=clock(); F=true;
float Attente= (end - start)/CLK_TCK;
if (Attente< 0.2 ) Msg.Type=E_DOUBLECLIC;
Compter=false;
Fois=0;
}
}else if (Fois!=1) Fois=0;
/*if ( Relache ) {
Fois++;
//cprintf("appuye");
if (Fois==2) {
if ( Compteur<30000) {
if (Compter)
Msg.Type=E_DOUBLECLIC; /*else
Erreur("Plus de comptage");
Compter=false;
}
else Erreur("Compteur>30000");
Fois=0; }
else if (Fois!=1) Fois=0;
} }*/
Relache=false;
} else
//Doit ˆtre apr‚s ClicGauche et Appuye
if ( OnMouseMove(X,Y,Dx,Dy)==true ) { Msg.Type=E_MOVE;
Msg.X=X; Msg.DepX=Dx;
Msg.Y=Y; Msg.DepY=Dy;
//ShowMessage(Msg);
}else
if ( kbhit() ) { Msg.Type=E_TOUCHE;
Msg.Touche=getch();
if (Msg.Touche==27) Msg.Type=E_EXIT;
}
Compteur++;
}
return Msg;
}
void CreerFenetre()
{
Entier i=0;
Bool Trouve=false;
//chercher une place vide dans la liste de pointeurs
while ( i<MAX && Trouve==false )
if (Fenetres[i]==nil) Trouve=true; else i++;
if (Trouve) { TFenetre* Fenetre=new TFenetre;
Fenetres[i]=Fenetre;
(*Fenetre).index=i;
(*Menu).ChangeMenu(indexAct+1,WHITE);
Entier num =i+1;
(*Menu).AddMenu(num);
MessageInterface(i,M_Act);
}
}
void MessageInterface(Entier i,TMessage DMessage)
{
TFenetre &Fenetre=*Fenetres[i];
if (Fenetres[i]!=nil)
switch(DMessage)
{
case M_Act: {Fenetre.Activer(); break;}
case M_Hide: {Fenetre.Cacher();
if (NAct==0) _setcursortype(_NOCURSOR);
break;};
case M_NotAct:{if (NAct>0) Fenetre.Desactiver(); break;}
case M_Paint: {Fenetre.Dessiner(); break;};
case M_Close:{ delete Fenetres[i]; Fenetres[i]=nil; break;};
}
else Erreur("Erreur de fenetre");
}
void ToutDessiner()
{
//dessiner toutes les fenetres visibles sauf celle Active
for (Entier i=0;i<NAct-1;i++) MessageInterface(File[i],M_Paint);
};