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 . chung: Tp tin ansi.sys cung cp tpđã chun hoá các mã điukhincursor.ANSIAmerica NationalStandardsInstitut.Đbođm scàiđtcatp tin ansi.systrongtp tin config.systađtdònglnh: