ANSI America National Standards Institut... Sau đó ch ng trình dùng hàm đ hi n th menu... printf normal%s underline %s normal \n\n ,UNDER,NORMAL;printf normal%s reversed %s normal \n\n ,
Trang 1CH NG 2: BÀN PHÍM VÀ CURSOR
§1 CÁC MÃ PHÍM M R NG
Chúng ta đã th y bàn phím t o các mã thông th ng cho các ch cái, các s và d u ch m câu Các phím này đ u t o mã ASCII dài 1 byte Tuy nhiên có nhI u phím và t h p phím không đ c bi u di n b ng b kí t dài m t byte này ví d nh các phím ch c năng t F1 đ n F10 hay các phím
đi u khi n cursor Các phím này đ c mô t b ng m t mã dài 2 byte Byte
đ u tiên có tr s là 0 và byte th hai là tr s mã c a phím này
1 Nh n bi t các mã m r ng: M t mã m r ng ph i có 2 byte và byte đ u tiên là 0 nên ch ng trình c n ph i đ c 2 byte này Sau đây là đo n ch ng trình nh n bi t các mã m r ng:
Ch ng trình 2 1:
#include <string.h>
main()
{
char key,key1;
clrscr();
while ((key=getche())!= x )
if (key==0)
{
key1=getch();
printf( %3d%3d ,key,key1);
}
else
printf( %3d ,key);
}
Ch ng trình này s hi n th các mã c a các phím đ c gõ cho dù chúng là mã m t byte hay 2 byte Ta dùng hàm getch() đ không hi n th kí
t v a gõ lên màn hình Trong bi u th c ki m tra c a while ch ng trình
đ c mã đ u tiên N u mã này là 0, ch ng trình bi t đó là mã m r ng và
đ c ti p ph n th hai c a mã b ng hàm getch() Sau đó nó hi n th c hai
ph n N u ph n đ u khác không ch ng trình s cho r ng đây không ph i
là mã m r ng và hi n th mã này
Trang 22 Đoán nh n mã m r ng: M t cách đoán nh n mã m r ng là dùng phát
bi u switch nh trong ch ng trình sau:
Ch ng trình 2 2 :
main()
{
int key,key1;
clrscr();
while ((key=getche())!= X )
if (key==0)
{
key1=getch();
switch (key1)
{
case 59 : printf( Phim F1 duoc nhan\n );
break;
case 60 : printf( Phim F2 duoc nhan\n );
break;
case 75 : printf( Phim left arrow duoc nhan\n );
break;
default : printf( Phim mo rong khac duoc nhan\n );
break;
}
}
else
printf( %3d ,key);
getch();
}
§2 ĐI U KI N CURSOR VÀ ANSI
1 Khái ni m chung: T p tin ansi.sys cung c p t p đã chu n hoá các mã
đi u khi n cursor ANSI America National Standards Institut Đ b o đ m
s cài đ t c a t p tin ansi.sys trong t p tin config.sys ta đ t dòng l nh:
device = ansi.sys
2 Đi u khi n cursor b ng ansi.sys: Ansi.sys dùng dãy escape đ đi u
khi n con nháy Chu i escape g m nhi u kí t đ c bi t Ansi.sys tìm chu i escape này qua thành ph n c a chu i trong hàm prinft() và gi i mã các l nh theo sau nó Chu i escape luôn luôn gi ng nhau, g m kí t không in đ c
Trang 3“\x1B”(là mã c a kí t escape) sau đó là d u [ Sau chu i escape có th có
m t hay nhi u kí t Nh chu i này con nháy có th đi lên, xu ng, sang trái , ph i hay đ nh v t i m t v trí nào đó Ví d đ di chuy n con nháy xu ng
d i ta dùng chu i “\x1B[B”
Ch ng trình 2 3: Vi t ch ng trình in m t chu i theo đ ng chéo:
main()
{
clrscr();
printf( Cho mot chuoi tan cung bang dau : );
while (getche()!= )
printf( \x1B[B );
getch();
}
3 Dùng #define và chu i escape: Chu i “\x1B[B” đ c mã hoá và r t khó
đ c Khi dùng các ch ng trình ph c t p nên ghi chú rõ ràng b ng cách dùng d n h ng #define
Ch ng trình 2 4 :
#define c_down \x1B[B
main()
{
while (getche()!= )
printf(c_down);
getch();
}
“[2J” Xoá màn hình và đ a con nháy v home
“[K” Xoáđ n cu i dòng
“[A” Đ a con nháy lên m t dòng
“[B” Đ a con nháy xu ng m t dòng
“[C” Đ a con nháy sang ph i m t c t
“[D” Đ a con nháy sang trái m t c t
“[%d;%df Đ a con nháy đ n v trí nào đó
“[s” C t gi v trí con nháy
“[u” Khôi ph c v trí con nháy
Trang 4“[%dA” Đ a con nháy lên m t s dòng
“[%dB” Đ a con nháy xu ng m t s dòng
“[%dC” Đ a con nháy sang ph i m t s c t
“[%dD” Đ a con nháy sang trái m t dòng và
nhi u c t
4 Đi u khi n con nháy t bàn phím: Sau đây là ch ng trình cho phép b n
v các hình đ n gi n trên màn hình
Ch ng trình 2 5 :
#define clear \x1B[2J
#define c_left \x1B[D
#define c_right \x1B[C
#define c_up \x1B[A
#define c_down \x1B[B
#define l_arrow 75
#define r_arrow 77
#define u_arrow 72
#define d_arrow 80
#define across 205
#define updown 186
main()
{
int key;
printf(clear);
while ((key=getch())==0)
{
key=getche();
switch (key)
{
case l_arrow : printf(c_left);
putch(across);
break;
case r_arrow : printf(c_right);
putch(across);
break;
case u_arrow : printf(c_up);
putch(updown);
break;
Trang 5case d_arrow : printf(c_down);
putch(updown);
break;
}
printf(c_left);
}
getch();
}
5 Đ a con nháy đ n v trí b t kì: Chu i escape d ng sau s đ a con nháy
đ n v trí b t kì trên màn hình
S hex 1B c a kí t escape Ngo c vuông
S hi u dòng
S hi u c t
Ch cái f
“ \ x 1 B [ 10 ; 40 f ”
Sau đây là m t ch ng trình ví d v cách dùng chu i đó
Ch ng trình 2 6 :
#define true 1
#define clear \x1B[2J
#define erase \x1B[K
main()
{
int row=1,col=1;
printf(clear);
while(true)
{
printf( \x1B[23;1f );
printf(erase);
printf( Nhap vao so dong va so cot dang(20,40) );
scanf( %d%d ,&row,&col);
printf( \x1B[%d;%df ,row,col);
printf( *(%d,%d) ,row,col);
}
}
§6 TRÌNH BÀY T I CH B T KÌ TRÊN MÀN HÌNH
Trang 6Sau đây là ch ng trình dùng chu i đ nh v cursor Ch ng trình cung c p hai menu đ nh v d c theo màn hình
Ch ng trình 2 7 :
#define size1 5
#define size2 4
#define clear \x1B[2J
main()
{
static char *menu1[]=
{ Open , Close Save Print Quit };
static char *menu2[]=
{ Cut , Copy , Paste , Reformat };
void display(char *[],int ,int);
printf(clear);
display(menu1,size1,20);
display(menu2,size2,20);
getch();
}
void display(char *arr[],int size,int hpos)
{
int j;
for (j=0;j<size;j++)
{
printf( \x1B[%d ,j+1,hpos);
printf( %s\n ,*(arr+j));
}
}
Trang 7Các m c cho t ng menu đ c c t gi trong m ng các con tr tr t i chu i Sau đó ch ng trình dùng hàm đ hi n th menu Hàm đ nh v con nháy nh dãy đ nh v ANSI.SYS, l y s hi u dòng t s hi u c a m c trên menu và s hi u c tđ c ch ng trình chính truy n sang
§7 CÁC THU C TÍNH C A KÍ T
M i kí t hi n th trên màn hình đ c c t gi trong hai byte b nh
M t byte là mã thông th ng c a kí t và byte kia là thu c tính c a nó Byte thu c tính n đ nh di n m o c a kí t nh ch p nháy, đ m, g ch d i, đ o màu Ta có th dùng chu i escape c a ANSI đ n đ nh thu c tính c a kí t Theo sau chu i kí t escape và ngo c vuông là con s và ch m Sau đây là danh sách các s t o hi u ng trên màn hình:
2,3,6 màu t i
0 t t thu c tính, th ng là màu tr ng trên n nđen
4 g ch d i
5 ch p nháy
7 đ o màu
8 không th yđ c
Chu i escape có d ng nh sau:
S hex 1B c a kí t escape
S cho bi t ki u thu c tính
“ \ x 1 B [ 10 m”
Chu i này đ c g i trong ti n trình hi n th M i khi b t m t thu c tính, t t
c các kí t s hi n th theo thu c tính m i cho đ n khi nó t t đi Sau đây là
ch ng trình bi u di n các thu c tính c a kí t :
Ch ng trình 2 8 :
#define NORMAL \x1B[Om
#define BOLD \x1B[1m
#define UNDER \x1B[4m
#define BLINK \x1B[5m
#define REVERSE \x1B[7m
main()
{
printf( normal%s blink %s normal \n\n ,BLINK,NORMAL);
printf( normal%s bold %s normal \n\n ,BOLD,NORMAL);
Trang 8printf( normal%s underline %s normal \n\n ,UNDER,NORMAL);
printf( normal%s reversed %s normal \n\n ,REVERSE,NORMAL);
printf( %s%s reversed and blink %s \n\n ,BLINK,REVERSE,NORMAL); }
§8 MENU
Ta xây d ng m t ch ng trình g m 5 m c menu là Open , Close, Save, Print, Quit Các phím mũi tên lên xu ng s di chuy n v t sáng đ n các
m c c n ch n Phím INS đ ch n và th c hi n công vi c t ng ng M c Quit s k t thúc ch ng trình
Ch ng trình 2 9
#define true 1
#define num 5
#define clear \x1B[2J
#define erase \x1B[K
#define normal \x1B[Om
#define reverse \x1B[7m
#define home \x1B[1;1f
#define bottom \x1B[20:1f
#define u_arro 72
#define color \x1B[4m
/*#define l_arro 75
#define r_arro 77*/
#define d_arro 80
#define insert 83
main()
{
static char *item[num]=
{ Open , Close , Save , Print , Quit };
int curpos;
int code;
void display(char *[],int,int);
int getcode(void);
void action(int);
Trang 9curpos=0;
while(true)
{
display(item,num,curpos);
code=getcode();
switch (code)
{
case u_arro:if (curpos>0)
curpos;
break;
case d_arro:if (curpos<num 1)
++curpos;
break;
case insert:action(curpos);
break;
}
}
}
void display(char *arr[],int size,int pos)
{
int j;
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);
}
}
int getcode()
{
int key;
while(getch()!=0)
Trang 10return (getch());
}
void action(int pos)
{
switch(pos)
{
case 0: printf( Open );
break;
case 1: printf( Close );
break;
case 2: printf( Save );
break;
case 3: printf( Print );
break;
case 4: exit();
}
}
§9 GÁN PHÍM CH C NĂNG B NG ANSI
Nh gán chu i vào phím ch c năng ta có th c u hình l i bàn phím đamg dùng D ng th c c a chu i gán phím ch c năng nh sau:
mã escape g m 1xB[
byte th nh t c a mã m r ng cho phím ch c năng
d u ; byte th hai c a mã m r ng cho phím ch c năng
d u ; chu i c n gán
xu ng dòng
\ x 1 B [ 0 ; 68 ; “s” ; 13 p
Ch ng trình 2 10:
main()
{
char str[81];
int key;
clrscr();
Trang 11printf( Nhap vao mot so cua phim chuc nang : );
gets(str);
key=atoi(str);
printf( Nhap vao mot chuoi de gan phim nay : );
gets(str);
printf( \x1B[0;%d;\ %s\ ;13p ,key+58,str);
}