Hali. Ez lesz itten a harmadik nekifutás azügyben, hogy valami ehető féle programot hozzak össze telefonkönyvügyileg. Mivel a téma kezd unalmassá válni most már nagyjából befejezem. A múltkor ott tartottunk, hogy minden működött ugyan, csak egy kicsit tréh módon nézett ki. Valami kis képernyőkezeléssel fel kéne dobni a cuccost, aztán készen is volna. Nosza!
A szöveges képernyő kezeléséhez csak a CONIO.H header-filera lesz szükség. Egy kis alap
void screeninit(void)
{
directvideo=1;
//nem a BIOS on keresztul cammog
_wscroll=0;
//nem gorgeti a kepernyot
textbackground(BLUE);
clrscr();
}
Nézzük a menüvezérlést. Az elv nagyon egyszerű. Amelyik menüpont éppen ki van választva, az más színű, mint a többi. Mivel a menüpontok száma változó, egy ilyen kezelőfüggvényt változó paraméterszámúra kell megírni. Ez C-ben nem is olyan nehéz.:
int mnuwin(int x1, int y1, int
x2, int y2 , char *cim, int n, char *mnu1, ...)
{
int t,c;
struct text_info ti;
char *bck;
_setcursortype(_NOCURSOR);
gettextinfo(&ti);
//eredeti allapot
bck=(char *)malloc((x2-x1+1)*(y2-y1+1)*2);
gettext(x1,y1,x2,y2,bck);
textbackground(NORMALBCK);
textcolor(NORMALCOL);
ablak(x1,y1,x2,y2,cim,0); //keret
for(t=0;t<n;t++)
//kirak
{
gotoxy((x1+x2)/2-strlen(*(&mnu1+t))/2,y1+t+1);
cprintf("%s",*(&mnu1+t));
}
t=0;
do
//mozog
{
textbackground(SELECTEDBCK);
textcolor(SELECTEDCOL);
gotoxy((x1+x2)/2-strlen(*(&mnu1+t))/2,y1+t+1);
cprintf("%s",*(&mnu1+t));
c=getch();
textbackground(NORMALBCK);
textcolor(NORMALCOL);
gotoxy((x1+x2)/2-strlen(*(&mnu1+t))/2,y1+t+1);
cprintf("%s",*(&mnu1+t));
if (c==0)
{
c=getch();
switch(c)
{
case UP:
if (t>0) t--; break;
case DOWN:
if (t<n-1) t++; break;
}
}
} while (c!=ESC &&
c!=ENTER);
if (c==ESC) t=-1;
fflush(stdin);
puttext(x1,y1,x2,y2,bck);
free(bck);
_setcursortype(_NORMALCURSOR);
return(t);
}
A függvény paraméterei a bal feső, és a jobb alsó sarok, az menuablak címe, a menüpontok száma, és utánna sorra a menüpontok. Az összes átadott paramétert könnyen tudjuk kezelni, annak számától függetlenül.
Pl az n. menupont: *(&menu1+n)
annak számától függetlenül.
A &menu1 az első menupont címe a stacken. Mivel a C a paramétereket fordított sorrendben vermeli el, innen a stacken visszafele járva meg fogjuk találni a második, harmadik stb menupontot. tehát ehez az offsethez hozza kell adni. Világos.
A függvény azzal kezd, hogy elmenti maga előtt az éppen aktuális állapotokat, és azzal fejezi be, hogy ezeket visszaállítja. érdemi dolgokat csak a kettő között csinál. Először kiírja az összes mennupontot, ezután lehet mennupontot választani.
Ha menüablakból kell adatokat bekérni, kell valami ilyesféle
valamit írni:
int linedit(int cx,int cy,char *str)
{
int x=0,y,l,ex=0;
char c;
l=strlen(str);
// x=l;
do
{
gotoxy(cx,cy);cprintf("%s",str);
gotoxy(cx+x,cy);
c=getch();
switch(c)
{
case 0: c=getch();
switch(c)
{
case RIGHT: if (x<l-1) x++; break;
case LEFT: if (x>0) x--; break;
case UP: ex=1; break;
case DOWN: ex=1; break;
case DEL: memmove(str+x,str+x+1,l-x);str[l-1]='
';break;
//
case INS:
}
break;
case BS: if (x>0) {x--;memmove(str+x,str+x+1,l-x);str[l-1]='
';} break;
case ESC: ex=1; break;
case ENTER: ex=1; break;
default: if (x<l-1)
{
memmove(str+x+1,str+x,l-x);str[x]=c;str[l]=0;x++;
}
break;
} //switch
} while(!ex);
fflush(stdin);
return(c);
}
Egy egyszerű kis függvény, ami kezeli a backspace-t, nyilakat, del-t.
Azt hiszem, most a szokásosnál is sikerült zavarosabbnak lennem. A programban a képernyőkezelés egy külön file-ba került, ezért aztán most már egy projekt az egész. Az igazsághoz hozzátartozik, hogy ilyen feladatokat nagyságrendekkel egyszerűbb Turbo Visionban (van cpp-s változata is) megoldani. Ld. OOP rovat.