Giáo trình C++ - Chương 2: Bàn phím và Cursor

ch¬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ã nhÒ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ô nhc¸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 .  
2. §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");  
12  
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 khiÓn cursor vµ ansi.sys  
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 “\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();  
}
Tãm t¾t c¸c lÖnh ®iÒu khiÓn con nh¸y  
M·  
C«ng dông  
13  
“[2J”  
“[K”  
“[A”  
“[B”  
“[C”  
“[D”  
Xo¸ mµn h×nh vµ ®a con nh¸y vÒ home  
Xo¸ ®Õn cuèi dßng  
§a con nh¸y lªn mét dßng  
§a con nh¸y xuèng mét dßng  
§a con nh¸y sang ph¶i mét cét  
§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  
“[%dA”  
“[%dB”  
“[%dC”  
“[%dD”  
§a con nh¸y lªn mét sè dßng  
§a con nh¸y xuèng mét sè dßng  
§a con nh¸y sang ph¶i mét sè cét  
§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;  
case d_arrow : printf(c_down);  
putch(updown);  
break;  
}
14  
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  
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 chç bÊt k× trªn mµn h×nh  
Sau ®©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"  
15  
};  
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));  
}
}
C¸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ù nhchí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
1
4
5
7
8
t¾t thuéc tÝnh , thêng lµ mµu tr¾ng trªn nÒn ®en  
®Ëm  
g¹ch díi  
chíp nh¸y  
®¶o mµu  
kh«ng thÊy ®îc  
Chuçi escape cã d¹ng nhsau :  
Sè hex 1B cña kÝ tù escape  
Sè cho biÕt kiÓu thuéc tÝnh  
16  
“ \ 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  
#define UNDER  
#define BLINK  
"\x1B[1m"  
"\x1B[4m"  
"\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);  
printf("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  
#define reverse  
#define home"\x1B[1;1f"  
#define bottom "\x1B[20:1f"  
u_arro 72  
"\x1B[Om"  
"\x1B[7m"  
#define  
#define color "\x1B[4m"  
/*#define l_arro  
#define r_arro  
#define d_arro 80  
#define insert83  
main()  
75  
77*/  
{
static char *item[num]=  
{
"Open",  
"Close",  
"Save",  
"Print",  
"Quit"  
};  
17  
int curpos;  
int code;  
void display(char *[],int,int);  
int getcode(void);  
void action(int);  
printf(clear);  
curpos=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)  
;
return (getch());  
}
void action(int pos)  
18  
{
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.sys  
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 nhsau :  
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  
dÊu ;  
xuèng dßng  
ch÷ p  
\ x 1 B [ 0 ; 68 ; “s” ; 13 p  
Ch¬ng tr×nh 2-10:  
main()  
{
char str[81];  
int key;  
clrscr();  
printf("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);  
}
19  
pdf 8 trang Thùy Anh 27/04/2022 3760
Bạn đang xem tài liệu "Giáo trình C++ - Chương 2: Bàn phím và Cursor", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_c_chuong_2_ban_phim_va_cursor.pdf