PROGRAM TestWindow; BEGIN PREF IIUWGRAPH BLOCK (* -------------------- Limites de l'‚cran -------------------- *) CONST XTailleEcran=638, YTailleEcran=348; (* ================================================================== *) (* CLASSE Fenetre *) (* ================================================================== *) UNIT Fenetre : CLASS (x,y,largeur,hauteur,numero : INTEGER); VAR ArrierePlan : ARRAYOF INTEGER, BufferFenetre : ARRAYOF INTEGER, ContenuFenetre : ARRAYOF INTEGER, Buffer : ARRAYOF INTEGER, Titre : ARRAYOF CHAR, Active : BOOLEAN, CurseurX,CurseurY,x1,y1 : INTEGER; (* -------------------- PROCEDURE InitFenetre -------------------- *) UNIT InitFenetre : PROCEDURE; VAR Cx, Cy, i, k : INTEGER; BEGIN IF Active THEN Cx:=CurseurX; Cy:=CurseurY; CALL MettreCurseur(0,0); CALL OUTSTRING("Fenˆtre "); CALL HASCII(0); CALL HASCII(numero+48); CurseurX:=Cx; CurseurY:=Cy; k:=8*9; CALL COLOR(1); CALL STYLE(4); FOR i:=1 TO 7 DO CALL MOVE(x+k,y+i); CALL HFILL(x1-8); CALL MOVE(x1-i,y+1); CALL VFILL(y1-1); CALL MOVE(x+1,y1-i); CALL HFILL(x1-1); CALL MOVE(x+i,y+10); CALL VFILL(y1-1); OD; CALL STYLE(1); FI; END InitFenetre; (* -------------------- PROCEDURE MettreCurseur -------------------- *) UNIT MettreCurseur : PROCEDURE (ligne, colonne : INTEGER); BEGIN CurseurX:=x+8*colonne; CurseurY:=y+10*ligne; IF Active THEN CALL MOVE(CurseurX,CurseurY); FI; END MettreCurseur; (* -------------------- PROCEDURE SauveFenetre -------------------- *) UNIT SauveFenetre : PROCEDURE; BEGIN IF Active THEN CALL MOVE(x,y); BufferFenetre:=GETMAP(x1,y1); Active:=FALSE; FI; END SauveFenetre; (* -------------------- PROCEDURE CacheFenetre -------------------- *) UNIT CacheFenetre : PROCEDURE; BEGIN IF Active THEN CALL MOVE(x,y); BufferFenetre:=GETMAP(x1,y1); CALL XORMAP(BufferFenetre); CALL MOVE(x,y); CALL PUTMAP(ArrierePlan); KILL(ArrierePlan); Active:=FALSE; FI; END CacheFenetre; (* -------------------- PROCEDURE AfficheFenetre -------------------- *) UNIT AfficheFenetre : PROCEDURE; BEGIN IF NOT Active THEN CALL MOVE(x,y); ArrierePlan:=GETMAP(x1,y1); CALL XORMAP(ArrierePlan); CALL MOVE(x,y); CALL PUTMAP(BufferFenetre); KILL(BufferFenetre); Active:=TRUE; FI; END AfficheFenetre; (* -------------------- PROCEDURE EffaceFenetre -------------------- *) UNIT EffaceFenetre : PROCEDURE; BEGIN IF Active THEN CALL MOVE(x+8,y+8); ContenuFenetre:=GETMAP(x1-8,y1-8); CALL XORMAP(ContenuFenetre); KILL(ContenuFenetre); CALL MettreCurseur(1,1); FI; END EffaceFenetre; (* -------------------- PROCEDURE DeplaceFenetre -------------------- *) UNIT DeplaceFenetre : PROCEDURE (dx, dy : INTEGER); BEGIN IF x=0 AND dx<0 THEN EXIT FI; IF y=0 AND dy<0 THEN EXIT FI; IF x1=XTailleEcran AND dx>0 THEN EXIT FI; IF y1=YTailleEcran AND dy>0 THEN EXIT FI; IF x+dx<0 THEN dx:=-x FI; IF y+dy<0 THEN dy:=-y FI; CurseurX:=(CurseurX-x)/8; CurseurY:=(CurseurY-y)/10; IF Active THEN CALL MOVE(x,y); IF ContenuFenetre=/=none THEN KILL(ContenuFenetre) FI; BufferFenetre:=GETMAP(x1,y1); FI; IF x1+dx>XTailleEcran THEN dx:=XTailleEcran-x1 FI; IF y1+dy>YTailleEcran THEN dy:=YTailleEcran-y1 FI; x:=x+dx; y:=y+dy; x1:=x1+dx; y1:=y1+dy; IF Active THEN CALL XORMAP(BufferFenetre); CALL MOVE(x,y); CALL PUTMAP(BufferFenetre); KILL(BufferFenetre); FI; CALL MettreCurseur(CurseurY,CurseurX); END DeplaceFenetre; (* -------------------- PROCEDURE ChangeTaille -------------------- *) UNIT ChangeTaille : PROCEDURE (dc, dl : INTEGER); VAR x2,y2 : INTEGER; BEGIN IF Active THEN IF x1+8>XTailleEcran AND dc>0 THEN EXIT FI; IF y1+10>YTailleEcran AND dl>0 THEN EXIT FI; x2:=x1+8*dc; y2:=y1+10*dl; IF x2XTailleEcran THEN largeur:=(XTailleEcran-x)/8 ELSE largeur:=largeur+dc FI; FI; IF y2YTailleEcran THEN hauteur:=(YTailleEcran-y)/10 ELSE hauteur:=hauteur+dl FI; FI; x2:=x+8*largeur; y2:=y+10*hauteur; IF x20 THEN EXIT FI; OD; WHILE touche<>13 DO CALL HASCII(0); IF touche=8 THEN IF i>LOWER(chaine) THEN i:=i-1 FI; CALL MOVE(INXPOS-8,INYPOS); col:=col-1; IF col=0 THEN col:=largeur-2; lig:=lig-1; IF lig=0 THEN lig:=1; col:=1 FI; CALL MettreCurseur(lig,col); FI; CALL HASCII(0); CALL MettreCurseur(lig,col); ELSE CALL HASCII(touche); chaine(i):=CHR(touche); i:=i+1; IF i>UPPER(chaine) THEN EXIT FI; col:=col+1; IF col=largeur-1 THEN col:=1; lig:=lig+1; if lig=hauteur-1 THEN EXIT FI; CALL MettreCurseur(lig,col); ELSE CurseurX:=CurseurX+8; FI; FI; DO CALL HASCII(0); CALL HASCII(0); CALL HASCII(95); CALL MOVE(INXPOS-8,INYPOS); touche:=INKEY; IF touche<>0 THEN EXIT FI; OD; OD; IF touche=13 THEN CALL MOVE(INXPOS-8,INYPOS); CALL HASCII(32); chaine(touche):=CHR(13); long:=i; FI; FI; END SaisirChaine; (* -------------------- PROCEDURE AfficheChaine -------------------- *) UNIT AfficheChaine : PROCEDURE (chaine : ARRAYOF CHAR); VAR lig, col, i : INTEGER; BEGIN col:=(CurseurX-x)/8; lig:=(CurseurY-y)/10; FOR i:=LOWER(chaine) TO UPPER(chaine) DO CALL MOVE(CurseurX,CurseurY); IF chaine(i)=CHR(13) THEN EXIT FI; CALL HASCII(0); CALL HASCII(ORD(chaine(i))); col:=col+1; IF col=largeur-1 THEN col:=1; CurseurX:=x+8; CurseurY:=y+10; IF CurseurY>y1-12 THEN CurseurY:=y+10 FI; lig:=lig+1; IF lig=hauteur-1 THEN EXIT FI; ELSE CurseurX:=CurseurX+8; FI; OD; END AfficheChaine; (* -------------------- INITIALISATION Fenetre -------------------- *) BEGIN IF x<0 THEN x:=0; ELSE IF x>XTailleEcran THEN x:=0; FI; FI; IF y<0 THEN y:=0; ELSE IF y>YTailleEcran THEN y:=0; FI; FI; IF x+8*largeur>XTailleEcran THEN largeur:=ENTIER((XtailleEcran-x)/8); FI; IF y+10*hauteur>YTailleEcran THEN hauteur:=ENTIER((YTailleEcran-y)/10); FI; x1:=x+8*largeur; y1:=y+10*hauteur; CALL MOVE(x,y); ArrierePlan:=GETMAP(x1,y1); CALL XORMAP(ArrierePlan); Active:=TRUE; CALL InitFenetre; CurseurX:=x+8; CurseurY:=y+10; END Fenetre; (* ==================== PROGRAMME PRINCIPAL ==================== *) BEGIN PREF MOUSE BLOCK UNIT Coord : PROCEDURE (posx,posy : INTEGER); VAR tourx,toury,i : INTEGER, xx,yy : ARRAYOF INTEGER; BEGIN CALL COLOR(6); CALL MOVE(0,0); CALL OUTSTRING(" "); CALL MOVE(0,0); CALL OUTSTRING("COORDONNEES : "); ARRAY xx DIM (1:3); ARRAY yy DIM (1:3); IF posx<10 THEN tourx:=1; ELSE IF posx<100 THEN tourx:=2; ELSE tourx:=3; FI; FI; IF posy<10 THEN toury:=1; ELSE IF posy<100 THEN toury:=2; ELSE toury:=3; FI; FI; FOR i:=tourx DOWNTO 1 DO xx(i):=posx MOD 10; posx:= posx DIV 10; OD; FOR i:=toury DOWNTO 1 DO yy(i):=posy MOD 10; posy:=posy DIV 10; OD; FOR i:=1 TO tourx DO CALL HASCII(xx(i)+48); OD; CALL OUTSTRING(" "); FOR i:=1 to toury DO CALL HASCII(yy(i)+48); OD; END Coord; (* -------------------- PROCEDURE Deplace -------------------- *) UNIT Deplace : PROCEDURE (i : INTEGER); VAR touche : INTEGER; BEGIN DO touche:=INKEY; IF touche<>0 THEN EXIT FI; OD; WHILE touche=/=102 DO IF touche=-72 THEN CALL fen(i).DeplaceFenetre(0,-5); ELSE IF touche=-80 THEN CALL fen(i).DeplaceFenetre(0,5); ELSE IF touche=-75 THEN CALL fen(i).DeplaceFenetre(-5,0); ELSE IF touche=-77 THEN CALL fen(i).DeplaceFenetre(5,0); FI; FI; FI; FI; DO touche:=INKEY; IF touche<>0 THEN EXIT FI; OD; OD; END Deplace; (* -------------------- PROCEDURE taille -------------------- *) UNIT Taille : PROCEDURE (i : INTEGER); VAR touche : INTEGER; BEGIN DO touche:=INKEY; IF touche<>0 THEN EXIT FI; OD; WHILE touche=/=102 DO IF touche=-72 THEN CALL fen(i).ChangeTaille(0,-1); ELSE IF touche=-80 THEN CALL fen(i).ChangeTaille(0,1); ELSE IF touche=-75 THEN CALL fen(i).ChangeTaille(-1,0); ELSE IF touche=-77 THEN CALL fen(i).ChangeTaille(1,0); FI; FI; FI; FI; DO touche:=INKEY; IF touche<>0 THEN EXIT FI; OD; OD; END Taille; (* -------------------- PROCEDURE Saisir -------------------- *) UNIT Saisir : PROCEDURE (i : INTEGER); BEGIN CALL COLOR(4); CALL fen(i).SaisirChaine(chaines,longueur); CALL COLOR(16); END Saisir; (* -------------------- PROCEDURE Affiche -------------------- *) UNIT Affiche : PROCEDURE (i : INTEGER); BEGIN CALL COLOR(8); CALL fen(i).AfficheChaine(chaines); CALL COLOR(16); END Affiche; (* -------------------- PROCEDURE AfFen -------------------- *) UNIT AfFen : PROCEDURE (INOUT k : INTEGER; i : INTEGER); VAR touche : INTEGER; BEGIN CALL COLOR(10); k:=i-1; DO touche:=INKEY; IF touche=102 THEN EXIT FI; IF touche=115 THEN CALL fen(k).SauveFenetre; k:=k-1; IF k=0 THEN k:=i-1 FI; CALL fen(k).AfficheFenetre; FI; OD; END AfFen; (* -------------------- MAIN ------------------- *) VAR fen : ARRAYOF Fenetre, h,v,p : INTEGER, l,r,c : BOOLEAN, chaines : ARRAYOF CHAR, i,cour,touche,longueur : INTEGER; BEGIN CALL GRON(2); CALL CLS; CALL COLOR(16); CALL BORDER(15); CALL DEFCURSOR(0,1,13); CALL SHOWCURSOR; ARRAY fen DIM (1:50); ARRAY chaines DIM (1:50); i:=1; DO touche:=INKEY; CALL GETPRESS(1,h,v,p,l,r,c); IF l AND r THEN EXIT FI; CALL GETPRESS(0,h,v,p,l,r,c); IF l THEN CALL HIDECURSOR; CALL MOVE(0,0); CALL Coord(h,v); fen(i):=NEW Fenetre(h,v,20,7,1); CALL SHOWCURSOR; i:=i+1; cour:=i-1; FI; CASE touche WHEN 100 : CALL Deplace(cour); WHEN 115 : CALL Saisir(cour); WHEN 116 : CALL Taille(cour); WHEN 99 : CALL Affiche(cour); WHEN 101 : CALL fen(cour).EffaceFenetre; WHEN 32 : CALL fen(cour).CacheFenetre; WHEN 97 : CALL fen(cour).AfficheFenetre; WHEN 109 : CALL AfFen(cour,i); ESAC; OD; CALL GROFF; END;END;END