CHNG2:BÀNPHÍMVÀCURSOR
§1.CÁCMÃPHÍMMRNG
Chúngtađãthybànphímtocácmãthôngthngchocácchcái,
cácsvàduchmcâu.CácphímnàyđutomãASCIIdài1byte.Tuy
nhiêncónhIuphím
vàthpphímkhôngđcbiudinbngbkít
dàimtbytenàyvídnhcácphímchcnăngtF1đnF10haycácphím
điukhincursor.Cácphímnàyđcmôtbng
mtmãdài2byte.Byte
đutiêncótrslà0vàbytethhailàtrsmãcaphímnày.
1.Nhnbitcácmãmrng:Mtmãmrngphicó2bytevàbyteđ
u
tiênlà0nênchngtrìnhcnphiđc2bytenày.Sauđâylàđonchng
trìnhnhnbitcácmãmrng:
Chngtrình21:
#include<string.h>
main()
{
charkey,key1;
clrscr();
while((key=getche())!=x
)
if(key==0)
{
key1=getch();
printf(%3d%3d,key,key1);
}
else
printf(%3d,key);
}
Chng trình này s hinthcác mãcacácphímđc gõ cho dù
chúnglàmãmtbytehay2byte.Tadùnghàmgetch()đkhông
hinthkí
tvagõlênmànhình.Trongbiuthckimtracawhilechngtrình
đcmãđutiên.Numãnàylà0,chngtrìnhbitđólàmãmrngvà
đcti
pphnthhaicamãbnghàmgetch().Sauđónóhinthchai
phn.Nuphnđukháckhôngchngtrìnhschorngđâykhôngphi
làmãmrngvàhinthmãnày.
16
2.Đoánnhnmãmrng:Mtcáchđoánnhnmãmrnglàdùngphát
biuswitchnhtrongchngtrìnhsau:
Chngtrình22:
main()
{
intkey,key1;
clrscr();
while((key=getche())!=X)
if(key==0)
{
key1=getch();
switch(key1)
{
case59:printf(PhimF1duocnhan\n);
break;
case60:printf(PhimF2duocnhan\n);
break;
case75:printf(Phimleftarrowduocnhan\n);
break;
default:printf(Phimmorongkhacduocnhan\n);
break;
}
}
else
printf(%3d,key);
getch();
}
§2.ĐIUKINCURSORVÀANSI
1. Khái nim chung: Tp tin ansi.sys cung cp tpđã chun hoá các mã
điukhincursor.ANSIAmerica
NationalStandardsInstitut.Đbođm
scàiđtcatptinansi.systrongtptinconfig.systađtdònglnh:
device=ansi.sys
2.Điu khin cursor bng ansi.sys:Ansi.sys dùng dãy escapeđđiu
khinconnháy.Chuiescape
gmnhiukítđcbit.Ansi.systìmchui
escapenàyquathànhphncachuitronghàmprinft()vàgiimãcáclnh
theosaunó.Chuiescapeluônluôngingnhau,gmkítkhônginđ
c
17
“\x1B”(làmãcakítescape)sauđólàdu[.Sauchuiescapecóthcó
mthaynhiukít.Nhchuinàyconnháycóthđilên,xung,sangtrái
,phihayđnhvtim
tvtrínàođó.Vídđdichuynconnháyxung
ditadùngchui“\x1B[B”
Chngtrình23:Vitchngtrìnhinmtchuitheođngchéo:
main()
{
clrscr();
printf(Chomotchuoitancung
bangdau.:);
while(getche()!=.)
printf(\x1B[B);
getch();
}
3.Dùng#definevàchuiescape:Chui“\x1B[B”đcmãhoávàrtkhó
đc. Khi dùng cácchng trìnhphctpnên ghi chú rõ ràngbng
cách
dùngdnhng#define.
Chngtrình24:
#definec_down\x1B[B
main()
{
while(getche()!=.)
printf(c_down);
getch();
}
Tómttcáclnhđiukhinconnháy
Mã Côngdng
“[2J” Xoámànhìnhvàđaconnháyvhome
“[K” Xoáđncuidòng
“[A”Đaconnháylênmtdòng
“[B”Đaconnháyxungmtdòng
“[C”Đaconnháysangphimtct
“[D”Đaconnháysangtráimtct
“[%d;%dfĐaconnháyđnvtrínàođó
“[s” Ctgivtríconnháy
“[u” Khôiphcvtríconnháy
18
“[%dA”Đaconnháylênmtsdòng
“[%dB”Đaconnháyxungmtsdòng
“[%dC”Đaconnháysangphimtsct
“[%dD”Đa con nháy sang trái mt dòng và
nhiuct
4.Điukhinconnháytbànphím:Sauđâylàchngtrìnhchophépbn
vcáchìnhđngintrênmànhình
Chngtrình25:
#defineclear\x1B[2J
#definec_left\x1B[D
#definec_right\x1B[C
#definec_up\x1B[A
#definec_down\x1B[B
#definel_arrow75
#definer_arrow77
#defineu_arrow72
#defined_arrow80
#defineacross205
#defineupdown186
main()
{
intkey;
printf(clear);
while((key=getch())==0)
{
key=getche();
switch(key)
{
casel_arrow:printf(c_left);
putch(across);
break;
caser_arrow:printf(c_right);
putch(across);
break;
case
u_arrow:printf(c_up);
putch(updown);
break;
19
cased_arrow:printf(c_down);
putch(updown);
break;
}
printf(c_left);
}
getch();
}
5.Đaconnháyđnvtríbtkì:Chuiescapedngsausđaconnháy
đnvtríbtkìtrênmànhình
Shex1Bca
kítescape
Ngocvuông
Shiudòng
Shiuct
Chcáif
“\x1B[10;40f”
Sauđâylàmtchngtrìnhvídvcáchdùngchuiđó
Chngtrình2
6:
#definetrue1
#defineclear\x1B[2J
#defineerase\x1B[K
main()
{
introw=1,col=1;
printf(clear);
while(true)
{
printf(\x1B[23;1f);
printf(erase);
printf(Nhapvaosodongvasocotdang(20,40));
scanf(%d%d,&row,&col);
printf(\x1B[%d;%df,row,col);
printf(*(%d,%d),row,col);
}
}
§6.
TRÌNHBÀYTICHBTKÌTRÊNMÀNHÌNH
20
Sauđây là chng trình dùng chuiđnh v cursor. Chng trình
cungcphaimenuđnhvdctheomànhình.
Chngtrình27:
#definesize15
#definesize24
#defineclear\x1B[2J
main()
{
staticchar*menu1[]=
{
Open,
Close
Save
Print
Quit
};
staticchar*menu2[]=
{
Cut,
Copy,
Paste,
Reformat
};
voiddisplay(char*[],int,int);
printf(clear);
display(menu1,size1,20);
display(menu2,size2,20);
getch();
}
voiddisplay(char*arr[],intsize,inthpos)
{
intj;
for(j=0;j<size;j++)
{
printf(\x1B[%d,j+1,hpos);
printf(%s\n,*(arr+j));
}
}
21
Cácmcchotngmenuđcctgitrongmngcáccontrtrti
chui.Sauđóchngtrìnhdùnghàmđhinthmenu.Hàmđnhvcon
nháynhdãyđnhvANSI.SYS,lyshiudòngt
shiucamctrên
menuvàshiuctđcchngtrìnhchínhtruynsang.
§7.CÁCTHUCTÍNHCAKÍT
Mikíthinthtrênmànhìnhđcctgitronghaibyteb
nh.
Mtbytelàmãthôngthngcakítvàbytekialàthuctínhcanó.Byte
thuctínhnđnhdinmocakítnhchpnháy,đm,gchdi,đo
màu.Ta
cóthdùngchuiescapecaANSIđnđnhthuctínhcakít.
Theosauchuikítescapevàngocvuônglàconsvàchm.Sauđâylà
danhsáchcácstohiungtrênmànhình:
2,3,6màuti
0 ttthuctính,thnglàmàutrngtrênnnđen
1đm
4 gchdi
5 chpnháy
7đomàu
8 khôngthyđc
Chuiescapecódngnhsau:
Shex1Bcakítescape
Schobitkiuthuctính
“\x1B[10m”
Chuinàyđcgitrongtintrìnhhinth.Mikhibtmtthuc
tính,tt
ccáckítshinththeothuctínhmichođnkhinóttđi.Sauđâylà
chngtrìnhbiudincácthuctínhcakít:
Chngtrình28:
#defineNORMAL
\x1B[Om
#defineBOLD\x1B[1m
#defineUNDER\x1B[4m
#defineBLINK\x1B[5m
#defineREVERSE\x1B[7m
main()
{
printf(normal%sblink%snormal\n\n,BLINK,NORMAL);
printf(normal%sbold%snormal\n\n,BOLD,NORMAL);
22
printf(normal%sunderline%snormal\n\n,UNDER,NORMAL);
printf(normal%sreversed%snormal\n\n,REVERSE,NORMAL);
printf(%s%sreversedandblink%s\n\n,BLINK,REVERSE,NORMAL);
}
§8.MENU
Ta xây dng mt chng trình gm 5 mc menu là Open , Close,
Save,Print,Quit.Các
phímmũitênlênxungsdichuynvtsángđncác
mccnchn.PhímINSđchnvàthchincôngvictngng.Mc
Quitsktthúcchngtrình.
Chngtrình2
9
#definetrue 1
#definenum 5
#defineclear\x1B[2J
#defineerase\x1B[K
#definenormal\x1B[Om
#define reverse\x1B[7m
#definehome\x1B[1;1f
#definebottom\x1B[20:1f
#define u_arro 72
#definecolor\x1B[4m
/*#definel_arro 75
#definer_arro 77*/
#defined_arro80
#defineinsert 83
main()
{
staticchar*item[num]=
{
Open,
Close,
Save,
Print,
Quit
};
intcurpos;
intcode;
voiddisplay(char*[],int,int);
intgetcode(void);
voidaction(int);
23
printf(clear);
curpos=0;
while(true)
{
display(item,num,curpos);
code=getcode();
switch(code)
{
caseu_arro:if(curpos>0)
curpos;
break;
cased_arro:if(curpos<num1)
++curpos;
break;
caseinsert:action(curpos);
break;
}
}
}
voiddisplay(char*arr[],intsize,intpos)
{
intj;
printf(home);
for(j=0;j<size;j++)
{
if(j==pos)
printf(reverse);
printf(%s\n,*(arr+1));
printf(%s%5s,color,*(arr+j));
printf(normal);
printf(%s,);
printf(home);
}
}
intgetcode()
{
intkey;
while(getch()!=0)
24
;
return(getch());
}
voidaction(intpos)
{
switch(pos)
{
case0:printf(Open);
break;
case1:printf(Close);
break;
case2:printf(Save);
break;
case3:printf(Print);
break;
case4:exit();
}
}
§9.GÁNPHÍM
CHCNĂNGBNGANSI
Nhgánchuivàophímchcnăngtacóthcuhìnhlibànphím
đamgdùng.Dngthccachuigánphímchcnăngnhsau:
mãescapegm
1xB[
bytethnhtcamãmrngchophímchcnăng
du;
bytethhaicamãmrngchophímchcnăng
du;
chuicngán
xungdòng
\
x1B[0;68;“s”;13p
Chngtrình210:
main()
{
charstr[81];
intkey;
clrscr();
25
printf(Nhapvaomotsocuaphimchucnang:);
gets(str);
key=atoi(str);
printf(Nhapvaomotchuoideganphimnay:);
gets(str);
printf(\x1B[0;%d;\%s\;13p,key+58,str);
}
26