c语言键盘操作.docx
- 文档编号:23110859
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:145
- 大小:537.10KB
c语言键盘操作.docx
《c语言键盘操作.docx》由会员分享,可在线阅读,更多相关《c语言键盘操作.docx(145页珍藏版)》请在冰豆网上搜索。
c语言键盘操作
第一章 编程技术实现
如果你是在dos下编程,情况要复杂一些。
你需要编写一个键盘中断扫描程序,然后用这个程序
(函数)替换系统的中断程序(通过中断向量表)。
如果你是在windows下编程,就比较简单了。
用
SHORTGetAsyncKeyState(intvKey);
函数就可以了,具体使用方法可以查msdn。
如果你想做一个比较正规一些的windows游戏,可以研究一下DirectInput。
本章内容简介:
本章主要介绍如何实现键盘和鼠标的输入,图形图像技术,动画技术,发声技术,汉字显示技术,精确的时间控制技术。
是编写大型程序的基本功。
虽然每个技术所涉及的内容很少,所提及的函数也很少,但是当它们组合在一起的时候,就可以编写大型程序。
一、键盘:
首先有必要介绍一下计算机是如何来处理键盘输入的数据的键盘里面有一个微处理器,用来扫描和检测每个键的按下或者抬起的状态,然后向主机传送一个字节的键盘扫描码,键盘扫描码翻译成对应的ASCⅡ码。
作为编程来说,只要知道每个按键都有对应的ASCⅡ码。
由于ASCⅡ码不能将键盘上所有的按键全部包括,因此有些控制键如Ctrl、Alt、End、Home和Del等用扩充的ASCⅡ码表示。
至于每个按键所对应的ASCⅡ码到底是什么,这里介绍一个函数可以实现该功能:
intbioskey(intn)
该函数声明在bios.h头文件中,所以调用之前需要在程序开始的位置写上 #include
)
参数n用来确定该函数的三个功能,具体如下表所示
表1-1
参数n的具体数值
实现的功能
0
bioskey(0)返回按键的键值——两个字节的整型数据。
若没有键按下,该函数一直等待,直到有键按下(这种情况有时会影响效率,在之后的例2中会看到有一种方法可以实现:
在一定时间内没有按键就去执行下面的代码)。
当按下时,返回该键所对应的ASCⅡ码或其扩展的ASCⅡ码。
具体请看例1;
1
bioskey
(1)查询是否有键按下。
若没有键按下,返回0;若有键按下,返回非零值
2
bioskey
(2)将返回一些控制键是否被按过,按过的状态由该函数返回的值来表示,具体请看表2
如选参数n为2时,当某位为1时,表示相应的键已按,或相应的控制功能已有效,若key值为0x09,那么从表1-2中可以得知右Shift键和Alt键被按下,因为只有0x01和0x08相加和为0x09。
若该函数还是无法理解也不影响最后编小游戏,故此处不做详细介绍。
表1-2
字节位
对应的16进制数
含义
字节位
对应的16进制数
含义
0
0x01
右Shift键被按下
4
0x10
ScrollLock已打开
1
0x02
左Shift键被按下
5
0x20
NumLock已打开
2
0x04
Ctrl键被按下
6
0x40
CapsLock已打开
3
0x08
Alt键被按下
7
0x80
Inset已打开
例1-1:
#include
intmain()
{
intkey;
key=bioskey(0);
printf(“%x”,key);
}
/*该例子中,若按下键盘上的UP(↑)键,屏幕会显示4800(16进制),用16进制是一种习惯,在上表2中也体现了这种习惯的合理性。
*/
例1-2:
#include
#include
intmain(){
int i,s;
for(i=0;i<5000;i++){
delay
(1); /*delay()函数用于延时,即使同样的参数会根据不同的实际情况的
不同而延时不同的时间,精确的时间控制请参阅《精确的时间控制》(超链接)一章*/
if(bioskey
(1)!
=0){
s=1;
break;
}
}
printf(“hello”);
}
}
/* 该例中用了一个5000次的循环,每次延时1,每次去判断是否有按键被按下,如果有,则跳出循环,马上去执行printf(“hello”);若5000次循环里面都没有按键按下,在循环结束后,执行printf(“hello”); 这种方法对于最后编小游戏非常有用,在最后的吃豆子放炸弹(超链接)例子中会再次提到 */
最后再介绍一个函数:
intkbhit(void);
该函数声明在conio.h头文件中,所以调用之前需要在程序开始的位置写上 #include
若按了键盘,该函数返回1,否则返回0;
C语言也可以实现鼠标的操作,但由于这种方法效率低,现在的面向对象的编程都不是用C语言的鼠标操作手段。
并且,本课程的一些例子中,也可以不用鼠标的操作,一般只用键盘就可以实现所需要的功能,因此,这里就不做介绍。
第二章文本与图像的显示
第一节 硬件基础
由于本课程的重点在于让大家体会C语言的进一步用法,所以对于硬件部分的知识(有兴趣的话可以到硬件概论学习硬件知识),本人会在非讲不可的情况下给大家做一介绍,就本人经历而言,没有掌握硬件知识也不影响C语言的应用,但为了知识的完整性,本人就文字图像显示所涉及的硬件知识做一介绍。
对于TC而言,如果想利用C的库函数在屏幕上显示图像,它所支持的显卡类型如下表2-1所示:
表2-1
分辨率
颜色数
显卡类型
320×200
4
CGA
320×200
2
CGA
640×200
2
CGA
320×200
16
EGA
640×200
16
EGA
640×350
2
EGA
640×350
16
EGA
640×480
2
VGA
640×480
16
VGA
表格说明:
表中所出现的显卡类型有:
CGA(彩色图形适配器)
EGA(增强型图形适配器)
VGA(视频图形阵列适配器)
之后将介绍TC所支持的模式
第二节文本显示方式
这里所涉及的函数有:
文本窗口大小的设定,窗口颜色的设置,窗口文本的清除和输入输出等函数,在之后会对这些函数做详细介绍。
这些函数包含在conio.h头文件中。
1.voidtextmode(intnewmode)函数
该函数用来定义文本方式,具体如下表所示:
表3-2
显示方式
行×列颜色
数值
符号常量
40×25黑白
0
BW40
40×25彩色
1
C40
80×25黑白
2
BW80
80×25彩色
3
C80
80×25单色
7
MONO
上一次的显示方式
-1
LASTMODE
表格解释:
该函数设置之后才能用上面所提到的一些文本显示方式下的函数。
当然如果不用该函数,TC会认为是缺省定义,也就是说,它会默认一种模式:
80×25。
在调用函数时,参数用数值或者用符号常量是一样的,比如textmode(0);和textmode(BW40);等效。
2.voidwindow(intleft,inttop,intright,intbottom);
该函数定义屏幕上一个矩形的区域作为窗口。
(left,top)是窗口的左上角坐标,(right,bottom)是窗口右下角坐标,这样一个矩形就唯一确定了。
对于屏幕上的坐标需要解释一下,如下图3-1:
如果屏幕是640×480分辨率,则坐上角为坐标(0,0),右下角是(640,480)
图3-1:
注意:
该函数中的坐标如果超过了屏幕坐标,TC不会编译报错,但是该函数无效了。
窗口定义之后,用有关的窗口输入输出函数就可以只在此窗口内进行操作而不超出窗口界限。
3.voidtextbackground(intcolor) 和
voidtextcolor(intcolor)函数
前者用来设置背景颜色,后者用来设置字符函数。
具体应用会在之后的例子给出
有关颜色参数color的取值具体如下表3-3所示:
表3-3:
适用于前景色或背景色
颜色
数值
符号常量
前景色,背景色
黑
0
BLACK
前景色,背景色
蓝
1
BLUE
前景色,背景色
绿
2
GREEN
前景色,背景色
青
3
GYAN
前景色,背景色
红
4
RED
前景色,背景色
洋红
5
MAGENTA
前景色,背景色
棕
6
BROWN
前景色,背景色
淡灰
7
LIGHTGRAY
前景色
深灰
8
DARKGRAY
前景色
淡蓝
9
LIGHTBLUE
前景色
淡绿
10
LIGHTGREEN
前景色
淡青
11
LIGHTGYAN
前景色
淡红
12
LIGHTRED
前景色
淡洋红
13
LIGHTMAGENTA
前景色
黄
14
YELLOW
前景色
白
15
WHITE
前景色
闪烁
128
BLINK
另外有函数voidtextattr(intattr)可以同时设置文本的字符和背景颜色。
如要求黄底蓝字:
textattr(BLUE+(YELLOW<<4)); <<表示移位运算,在C课程中有介绍(超链接)再如:
要求蓝底黄字并且要闪烁:
textattr(128+YELLOW+(BLUE<<4));使用时只要根据这两个的框架并结合表2-3就可以自己定义。
最后说明下:
textbackground()和textcolor()函数设置了之后,要用 clrscr()函数清除窗口,这样才能显示出所设置的颜色。
clrscr()函数会在下一文章具体解释(超链接)。
4.窗口内文本输入输出函数
4.1文本输入函数
窗口定义好之后,文本输入可以采用getch()或getche()函数。
这两个函数定义在stdio.h头文件中。
函数原型分别是:
intgetch(void) intgetche(void) (void表示没有参数)
它们的区别是:
getch():
读入一个字符,当你用键盘输入的时候,屏幕不显示你所输入的字符。
getche():
读入一个字符,键盘输入的时候,屏幕显示所输入的字符。
遇到窗口最右端会自动换行。
4.2文本的输出函数:
intcprintf(char*format,表达式表);
括号中内容的格式跟printf()函数相同(pirnf()在C语言中将诶少超链接),比如cprintf("%d",a)。
intcputs(char*str);
该函数类似于puts()函数(puts()在C语言中介绍超链接),输出一个字符串到窗口。
intputch(intch);
输出一个字符到窗口。
这里要解释下,TC虽然可以在屏幕上画多个窗口,但是每次只能处理一个窗口,所以这些函数在都是在当前窗口进行操作,而要对别的窗口操作,需要将定义那个窗口的函数重新调用一次,则那个窗口就成了当前窗口。
以上三个函数都定义在conio.h头文件中。
conio.h是一个C标准库中的头文件。
conio是ConsoleInput/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作。
5有关窗口或文本整体的操作
voidclrscr(void);
该函数清除窗口中的文本,并将光标移到当前窗口的左上角。
voidclreol(void);
该函数清除当前光标到光标所在行的结尾的所有字符,不改变
标位置。
voiddelline(void);
该函数删除光标所在行的一行字符。
voidgotoxy(intx,inty);
光标定位到坐标(x,y)处,若坐标超出窗口就不起作用了。
intmovetext(intx1,inty1,intx2,inty2,intx3,inty3)
该函数把左上角(x1,y1),右下角(x2,y2)的矩形整体拷贝到左上角为(x3,y3)的一个新矩形内。
原窗口仍保留。
intgettext(intx1,inty1,intx2,inty2,void*buffer) ;
该函数把左上角(x1,y1)到右下角(x2,y2)的窗口内的文本全部存到buffer指针(指针的内容在C语言课程中介绍,超链接)。
其中的坐标是指屏幕的绝对坐标。
intputtext(intx1,inty1,intx2,inty2,void*buffer)
相对应于上面这个函数,该函数把指针buffer中的内容拷贝到左上角(x1,y1)到右下角(x2,y2)的窗口内。
其中的坐标是指屏幕的绝对坐标。
下面一个例子是对以上的几个函数的运用。
该例子实现了绘制左右两个窗口,用Tap键切换光标。
可以在光标所在窗口输入文本,ESC键退出。
例子3-1:
#include
#include
#include
charleftbuf[40*25*2];/*切换时保存左窗口文本*/
charrightbuf[40*25*2];/*切换时保存右窗口文本*/
intleftx,lefty;/*切换时保存左窗口当前坐标*/
intrightx,righty;/*切换时保存右窗口当前坐标*/
voiddraw_left_win();/*重绘左边窗口*/
voiddraw_right_win();/*重绘右边窗口*/
intmain()
{
intkey;
intturn;
textmode(C80); /*采用之前提及的80×25彩色显示模式*/
textbackground(0);
textcolor(WHITE);
clrscr(); /*清屏,也使得以上三个函数起作用*/
/*以下4句话定义右边窗口为绿色背景,红色前景*/
window(41,2,79,24);
textbackground
(2);
textcolor(4);
clrscr(); /*清屏,也使得以上三个函数起作用,单步调试可以发现,未执行该函数,屏幕不会出现右窗口*/
gettext(41,2,79,24,rightbuf); /*用rightbuf指针存放右窗口文本*/
window(2,2,40,24); /*左边窗口为蓝色背景,白色前景*/
textbackground
(1);
textcolor(15);
clrscr();
gettext(2,2,40,24,leftbuf);
turn=0; /*初始激活左窗口*/
for(;;)
{
key=bioskey(0);
if(key==0x11b) /*ox11b是ESC键的ASCII码,如果按下ESC键,退出*/
exit(0);
/*获取窗口输入的文本的ASCII码值*/
if(key==0xf09)/*ox11b是tap键的ASCII码,如果按下tap键,切换窗口*/
{
if(turn==0) /*切换到左窗口*/
{
gettext(2,2,40,24,leftbuf);
leftx=wherex();
lefty=wherey();
draw_right_win();
turn=1;
}
elseif(turn==1) /*切换到右窗口*/
{
gettext(41,2,79,24,rightbuf);
rightx=wherex();
righty=wherey();
draw_left_win();
turn=0;
}
}
else
putch(key); /*当前光标处显示新输入的文本字符*/
}
}
/*重绘右边窗口*/
voiddraw_right_win()
{
window(41,2,79,24);
textbackground
(2);
textcolor(4);
clrscr();
puttext(41,2,79,24,rightbuf);
gotoxy(rightx,righty);
}
/*重绘左边窗口*/
voiddraw_left_win()
{
window(2,2,40,24);
textbackground
(1);
textcolor(15);
clrscr();
puttext(2,2,40,24,leftbuf);
gotoxy(leftx,lefty);
}
第三节图形显示方式
TC有一个图形库文件(graphic.lib),提供了许多有用的图形函数,这些函数均包含在graphics.h头文件中。
TC所支持的图形模式如下表所示(和文本显示类似,表格就不具体介绍了):
表4-1:
适配器
模式
分辨率
颜色数
符号常量
CGA
0
320×200
4
CGAC0
1
320×200
4
CGAC1
2
320×200
4
CGAC2
3
320×200
4
CGAC3
4
640×200
2
CGAHI
EGA
0
640×200
16
EGALO
1
640×350
16
EGAHI
VGA
0
640×200
16
VGALO
1
640×350
16
VGAMED
2
640×480
16
VGAHI
TC支持的都是早期的模式,自己编小游戏时也只能在差的里面挑最高的了——VGAHI
1. voidfarinitgraph(intfar*pdriver,intfar*pmode,charfar*path)
该函数用来设置图形方式,也就是选择上表中一种模式。
按照习惯,该函数使用时一般先定义两个变量graphdiver,graphmode。
下面以表中最后一种模式为例,说明该函数具体的使用方法。
intgraphdiver=VGA;
intgraphmode=VGAHI;
initgraph(&graphdiver,&graphmode,"");
最后一个参数写作""是表示驱动程序路径就在程序文件当前所在目录,所以方便起见,一般把TC目录下的BGI文件中的所有文件(驱动程序都在里面了)都拷贝到程序文件所在目录,那么例子中的程序才可以正常运行,否则要写路径,比如"d:
\\tc\\BGI"
此外,若设置intgraphdiver=DETECT;那么TC会自动检测最高的显示模式,graphdiver参数不用赋值。
(如果出现BGIError:
Graphicsnotinitialized(use'initgraph')错误,可能是上述路径的问题,也有可能是机子的问题,请参照附录)
一旦调用了该函数,显示器就变成了图形显示模式,而要回到上一节所说的文本显示模式,需要调用函数 closegraph();
2. voidfarsetcolor(intcolor);
voidfarsetbkcolor(intcolor);
这两个函数分别用来设置前景色(画图函数所画出的图形的颜色)和背景色。
下面表4-2介绍了VGAHI模式下color参数的16种情况。
这也同样适用于EGAHI模式,其他模式的不作介绍了。
表中的所代表的颜色和第三讲文本显示模式下的表3-3相同,看英文就可以知道颜色。
表4-2:
数值
符号常量
0
EGA_BLACK
1
EGA_BLUE
2
EGA_GREEN
3
EGA_GYAN
4
EGA_RED
5
EGA_MAGENTA
6
EGA_BROWN
7
EGA_LIGHTGRAY
数值
符号常量
8
EGA_DARKGRAY
9
EGA_LIGHTBLUE
10
EGA_LIGHTGREEN
11
EGA_LIGHTGYAN
12
EGA_LIGHTRED
13
EGA_LIGHTMAGENTA
14
EGA_YELLOW
15
EGA_WHITE
3. voidfarsetviewport(intx1,inty1,intx2,inty2,clipflag);
和文本显示方式类似,在图形方式下,也可以利用该函数设置一个左上角(x1,y1)到右下角(x2,y2)的窗口。
clipflag参数为0时,所画图形即使超出了该窗口,仍将显示超出部分;clipflag参数非0时(比如写作1),所画图形超出该窗口的部分将不显示。
设置窗口之后,就可以用相对坐标来定位了,也就是说图形的左上角(x1,y1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 键盘 操作