C语言高级编程技术.pdf

上传人:asd****56 文档编号:70321521 上传时间:2023-01-19 格式:PDF 页数:62 大小:693.33KB
返回 下载 相关 举报
C语言高级编程技术.pdf_第1页
第1页 / 共62页
C语言高级编程技术.pdf_第2页
第2页 / 共62页
点击查看更多>>
资源描述

《C语言高级编程技术.pdf》由会员分享,可在线阅读,更多相关《C语言高级编程技术.pdf(62页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、 14 第 14 章 C 语言高级编程技术 使用过 Windows 系统的用户都感受到了图形用户界面的直观和高效。所有 Windows 系统的应用程序都拥有相同或相似的基本外观,包括窗口、菜单、工具条、状态栏等。用户只要掌握其中一个,就不难学会其他软件,从而降低了学习成本和难度。而且 Windows 是一个多任务的操作环境,它允许用户同时运行多个应用程序,或在一个程序中同时做几件事情。例如,我们可以边欣赏 MP3 的音乐边 IE 冲浪,可以在运行 Word 时同时编辑多个文档等。用户直接通过鼠标或键盘来使用应用程序,或在不同的应用程序之间进行切换,非常方便。这些都是单任务、命令行界面的 DOS

2、 操作系统所无法比拟的。TC2.0 或 TC3.0 均是在 DOS 环境下运行的 C 系统。不过,无论采用 TC,还是 VC、BC,所产生的 C 可执行程序都是基于 DOS 系统的。C 语言发展如此迅速,而且成为最受欢迎的语言之一,主要因为它具有强大的功能。C 是一种“中”级语言,它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。C 语言具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。另外 C 语言也具有强大的图形功能,支持多种显示器和驱动器。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的。C 系

3、统提供了大量的功能各异的标准库函数,减轻了编程的负担。所以要用 C 语言实现具有类 Windows 系统应用程序界面特征的、或更生动复杂的 DOS 系统的程序,就必须掌握更高级的编程技术。本章介绍了如何利用 TC 系统所提供的相关函数实现菜单设计、图形绘制、动画的播放、乐曲的演奏、汉字的显示、图片的显现等技术。534 C语言开发全程指南 14.1 文本的屏幕输出和键盘输入 在前面几章的实例中,程序运行的结果都显示在黑色屏幕上,颜色单调。这并不是说 C语言的所有结果都只能显示在黑色屏幕上,与其他的高级语言一样,C 语言也可以显示多样的界面。例如,编写一个程序,将屏幕垂直平分成两个窗口,左边窗口为

4、蓝色背景,白色前景,右边窗口为绿色背景,红色前景。两个窗口都设计为文本输入,即在窗口中可以输入文字,在窗口屏幕中显示出来。使用【Tab】键在左右两个窗口中切换,每个窗口都有光标,活动窗口光标进行闪烁。这时前面不曾接触到的新概念,如文本窗口、前景色、背景色,以及如何在屏幕中显示文本输入的窗口;如何设置窗口的前景色、背景色或闪烁等显示属性;如何通过按键来控制窗口的切换等。这就涉及了有关文本的屏幕输出和键盘的输入知识。下面就来介绍这两个方面的内容。14.1.1 文本屏幕输出 显示器的屏幕显示方式有两种:文本方式和图形方式。本节将介绍文本方式,而图形方式将会在后面一节介绍。文本方式就是显示文本的模式,

5、它的显示单位是字符而不是图形方式下的像素,因而在屏幕上显示字符的位置坐标就用行和列表示。Turbo C 的字符屏幕函数主要包括文本窗口大小的设定、窗口颜色的设置、窗口文本的清除和输入输出等函数。这些函数的有关信息(如宏定义等)均包含在 conio.h 头文件中,因此在用户程序中使用这些函数时,必须用 include 将 conio.h 包含进程序。1文本窗口定义 Turbo C 默认定义的文本窗口为整个屏幕,共有 80 列 25 行的文本单元。规定整个屏幕的左上角为 1 行 1 列,右下角坐标为 25 行 80 列,并规定沿水平方向为 X 轴,方向朝右;沿垂直方向为 Y 轴,方向朝下。每个单元

6、包括一个字符和一个属性,字符即 ASCII 码字符,属性规定该字符的颜色和强度。除了这种默认的 80 列 25 行的文本显示方式外,Turbo C 还支持另外 4 种文本显示方式,可以用文本显示方式设置函数 textmode 来进行设置,该函数调用的形式为:textmode(newmode)其中,newmode 参数可以选用如表 14-1 所示的任一种方式,可以用表中指出的方式代号,也可以用对应的符号常量。该函数将清除屏幕,以整个屏幕为当前窗口,并移动到屏幕的左上角。该函数无返回值。表 14-1 文本显示方式 方 式 符号常量 显示列行数和颜色 0 BW40 4025 黑白显示 1 C40 4

7、025 彩色显示 2 BW80 8025 黑白显示 535第14章 C语言高级编程技术 续表 方 式 符号常量 显示列行数和颜色 3 C80 8025 彩色显示 7 MONO 8025 单色显示-1 LASTMODE 上一次的显示方式 表中的 LASTMODE 方式指上一次设置的文本显示方式,它常用于在图形方式到文本方式的切换。关于颜色,将在文本颜色设置函数中介绍,MONO 方式用在 MGA 显示器上。Turbo C 还可以通过窗口设置函数 window 让用户根据自己的需要重新设定显示窗口。window 函数的调用形式为:window(left,top,right,bottom);该函数的作

8、用就是用来定义屏幕上的一个矩形域作为窗口,窗口定义之后,用有关窗口的输入输出函数就可以只在此窗口内进行操作而不超出窗口的边界。其参数 left(列)和 top(行)表示是窗口左上角的坐标;right(列)和 bottom(行)表示窗口的右下角坐标,它们都是整型数据;坐标(left,top)和(right,bottom)是相对于整个屏幕而言的。例如,要定义一个窗口左上角在屏幕(10,8)处,大小为 10 列 20 行的窗口可写成:window(10,8,20,28);编者手记 请读者注意,这里坐标的表示与在平时习惯上的坐标表示有所不同。习惯的表示是在圆括号中将行数放在前面列数在后面,但这里的表示

9、是将列数放在前面行数放在后面,例如上面的坐标(10,8)在这里表示是 10 列 8 行,而不是 10 行 8 列,请读者一定要注意这一点。注意,若 window 函数中的坐标超过了屏幕坐标的界限,则窗口的定义就失去了意义,也就是说定义将不起作用,但程序编译链接时并不出错。另外,一个屏幕可以定义多个窗口,但现行窗口只能有一个(因为 DOS 为单任务操作系统),当需要用另一窗口时,可将定义该窗口的 window 函数再调用一次,此时该窗口便成为现行窗口了。2文本窗口颜色和其他属性的设置 Turbo C 为了控制文本显示的前景色(字符颜色)和背景色,提供了控制颜色的函数,常用的有下面几个函数。(1)

10、字符颜色设置函数 textcolor()该函数调用形式为:textcolor(color);该函数的作用就是设置显示的前景色,即字符显示的颜色。其参数 color 可用表 14-2 所列的表中的符号常数或数值表示。536 C语言开发全程指南 表 14-2 颜色表 符号常数 数 值 显 示 色 说 明 BLACK 0 黑 前景、背景色 BLUE 1 蓝 前景、背景色 GREEN 2 绿 前景、背景色 CYAN 3 青 前景、背景色 RED 4 红 前景、背景色 MAGENTA 5 洋红 前景、背景色 BROWN 6 棕 前景、背景色 LIGHTGRAY 7 淡灰 前景、背景色 DARKGRAY

11、8 深灰 用于前景色 LIGHTBLUE 9 淡蓝 用于前景色 LIGHTGREEN 10 淡绿 用于前景色 LIGHTCYAN 11 淡青 用于前景色 LIGHTRED 12 淡红 用于前景色 LIGHTMAGENTA 13 淡洋红 用于前景色 YELLOW 14 黄 用于前景色 WHITE 15 白 用于前景色 BLINK 128 闪烁 用于前景色 表中的符号常数与相应的数值等价,二者可以互换。例如设定蓝色前景色可以使用textcolor(1),也可以使用 textcolor(BLUE),两者没有任何区别,只不过后者比较容易记忆,一看就知道是蓝色。(2)文本背景颜色设置函数 textbac

12、kground()该函数的调用形式为:textbackground(color);该函数的作用就是用来设置文本显示的背景颜色,其参数 color 仅能选择表 14-2 中的前 8和颜色,即值为 07。(3)文本属性设置函数 textattr()该函数的调用形式为:textattr(attr);该函数的作用就是设置文本显示的属性,所谓显示的属性指字符显示的颜色和背景色,字符显示是否闪烁。也就是说,通过 textattr 函数可以同时设置文本的字符和背景颜色。其参数 attr 的值表示颜色形式编码的信息,即参数 attr 可用 1 字节(8 位)来描述,其各位含义如图 14-1 所示。BLINKR

13、GBIRGB闪烁红绿蓝加亮红绿蓝闪烁红绿蓝加亮红绿蓝背景色背景色前景色前景色闪烁闪烁 图 14-1 属性字节各位含义 537第14章 C语言高级编程技术 其中低 4 位用来设置字符显示颜色(对应颜色值 015),46 位用来设置显示背景色(颜色为 07),第 7 位最高位用来设置显示的字是否闪烁,例如:要求在蓝色背景下显示黄色的字符,可用此函数设置:textatter(YELLOW+(BLUE4);要求在白色背景下显示闪烁的蓝色字符,可设置为:textatter(WHITE4)+BLUE+BLINK);或者:textatter(154)+1+128);其中 WHITE4 表示左移 4 位,即其

14、对应的二进制值左移 4 位,变成 46 位,这恰是设置背景色的位,也就是用 15 的二进制表示的数左移 4 位。注意(1)对于背景只有 0 到 7 共 8 种颜色,取大于 7 小于 15 的数,则代表的颜色与减 7 后的值对应的颜色相同;(2)用 textbackground()和 textcolor()函数设置了窗口的背景与字符颜色后,在没有用 clrscr()函数清除窗口之前,颜色不会改变,直到使用了函数 clrscr(),整个窗口和随后输出到窗口中的文本字符才会变成新颜色。(3)用 textattr()函数时背景颜色应左移 4 位,才能使 3 位背景颜色移到正确位置。3字符显示亮度控制函

15、数 字符显示亮度控制函数有:highvideo()函数、lowvideo()函数和 normvideo()函数。它们的调用方式和作用如下:highvideo();该函数将设置用高亮度显示字符。lowvideo();该函数将设置用低亮度显示字符。normvideo();该函数将设置通常亮度显示字符。4控制台文本的输入输出函数(1)窗口内文本的输出函数 前面介绍过的 printf(),putc(),puts(),putchar()和输出函数以整个屏幕为窗口,它们不受由 window 设置的窗口限制,也无法用函数控制它们输出的位置,但 Turbo C 提供了三个文本 538 C语言开发全程指南 输出

16、函数,它们受窗口的控制,窗口内显示光标的位置,就是它开始输出的位置。当输出行右边超过窗口右边界时,自动移到窗口内的下一行开始输出,当输出到窗口底部边界时,窗口内的内容将自动产生上卷,直到完全输出完为止,这三个函数均受当前光标的控制,每输出一个字符光标后移一个字符位置。这三个输出函数原型为:cprintf(格式化字符串,表达式表);cputs(字符串);putch(字符);它们的使用格式同 printf(),puts()和 putc(),其中 cprintf()是将按格式化串定义的字符串或数据输出到定义的窗口中,其输出格式串同 printf 函数,不过它的输出受当前光标控制,且输出特点如上所述,

17、cputs 同 puts,是在定义的窗口中输出一个字符串,而 putch()则是输出一个字符到窗口,它实际上是函数 putc 的一个宏定义,即将输出定向到屏幕。(2)窗口内文本的输入函数 可直接使用 stdio.h 中的 getch 或 getche 函数。编者手记 需要说明的是,getche()函数从键盘上获得一个字,在屏幕上显示的时候,如果字符超过了窗口右边界,则会被自动转移到下一行的开始位置。实例 14-1 多窗口显示实例 实例说明 首先定义一个字符指针数组指向可用背景和前景显示七种颜色,然后用for 循环连续开辟七个窗口,每个窗口背景色同指针 si指向的颜色一样,每个窗口上显示大写的颜

18、色名(由 cputs(si)),其颜色为窗口颜色的下一顺序颜色,偶数窗口颜色名用高亮度显示,奇数窗口用低亮度显示。实例代码 光盘chapter1414-1 知识要点 文本屏幕输出。(1)编辑源代码 启动 Turbo C 3.0 编译器,在编辑区中输入代码 14-1 中的代码。代码 14-1 实例 14-1 的代码 01.#include 02.#include 03.main()04.05.int i;06.char*s=BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIGHTGRAY;07.textmode(C80);/设置显示文本方式 C80 08.tex

19、tbackground(0);/设置背景色 09.clrscr();/清屏 10.for(i=1;i8;i+)539第14章 C语言高级编程技术 11.12.window(10+i*5,5+i,30+i*5,15+i);13.textbackground(i);14.clrscr();15.textcolor(7+i);/设置窗口内字符显示颜色 16.if(i%2=0)17.highvideo();/i 为偶数的窗口字符高度显示 18.else 19.lowvideo();/奇数窗口字符低亮度显示 20.cputs(si);/输出字符到窗口内 21.22.getch();23.代码执行步骤如下

20、。代码第 7 行调用 textmode 函数设置窗口文本显示方式为 C80。代码第 8、9 行调用 textbackground 函数设置窗口背景颜色为黑色。然后调用 clrscr 函数清屏。代码第10到第21行通过for循环依次开辟了七个窗口,每个窗口的显示坐标由i决定,每个窗口背景色同指针 si指向的颜色一样,每个窗口上显示大写的颜色名(由 cputs(si)),其颜色为窗口颜色的下一顺序颜色,偶数窗口颜色名用高亮度显示,奇数窗口用低亮度显示。代码第 22 行调用 getch 函数接收一个字符。(2)保存源文件 按【F2】键,在弹出的保存文件窗口中,选择或输入文件保存到的目录并修改该文件名

21、为Ex14-1.c。(3)编译、链接、运行程序 按【F9】键,编译并链接代码 14-1,然后按【Ctrl+F9】快捷键运行该程序。最后按【Alt+F5】快捷键查看程序运行结果。结果如图 14-2 所示。图 14-2 实例 14-1 的运行结果 5有关屏幕操作的函数 有关屏幕操作的函数主要有:clrscr()函数、clreol()函数、delline()函数、gotoxy()函数、movetext()函数、gettext()函数和 puttext()函数。它们的调用形式和作用如下:540 C语言开发全程指南 clrscr();该函数将清除窗口中的文本,并将光标移到当前窗口的左上角,即(1,1)处

22、。clreol();该函数将清除当前窗口中从光标位置开始到本行结尾的所有字符,但不改变光标原来的位置。delline();该函数将删除一行字符,该行是光标所在行。gotoxy(x,y);该函数很有用,用来定位光标在当前窗口中的位置。这里 x,y 是指光标要定位处的坐标(相对于当前窗口而言)。当 x,y 超出了窗口的大小时,该函数就不起作用了。movetext(x1,y1,x2,y2,x3,y3);该函数将把屏幕上左上角为(xl,y1),右下角为(x2,y2)的矩形内文本拷贝到左上角为(x3,y3)的一个新矩形区内。这里 x,y 坐标是以整个屏幕为窗口坐标系,即屏幕左上角为(1,1)。该函数与开

23、设的窗口无关,且原矩形区文本不变。gettext(xl,yl,x2,y2,buffer);其中 buffer 是一个 void 类型指针。该函数将把左上角为(xl,y1),右下角为(x2,y2)的屏幕矩形区内的文本存到由指针 buffer 指向的一个内存缓冲区内,当操作成功,返回 1;否则,返回 0。因一个在屏幕上显示的字符需占显示存储器 VRAM 的两字节,即第一字节是该字符的ASCII 码,第二字节为属性字节,即表示其显示的前景、背景色及是否闪烁,所以 buffer 指向的内存缓冲区的字节总数的计算为:字节总数=矩形内行数每行列数2 其中:矩形内行数=y2-y1+l,每行列数=x2-xl+

24、1(每行列数是指矩形内每行的列数)。矩形内文本字符在缓冲区内存放的次序是从左到右,从上到下,每个字符占连续两字节并依次存放。puttext(x1,y1,x2,y2,buffer);其中 buffer 是一个 void 类型指针。该函数则是将 gettext()函数存入内存 buffer 中的文字内容拷贝到屏幕上指定的位置。编者手记 这里提醒读者注意两点:(1)gettext()函数和 puttext()函数中的坐标是对整个屏幕而言的,即是屏幕的绝对坐标,而不是相对窗口的坐标;(2)movetext()函数是拷贝而不是移动窗口区域内容,即使用该函数后,原位置区域的文本内容仍然存在。541第14章

25、 C语言高级编程技术 6状态查询函数 有时需要知道当前屏幕的显示方式,当前窗口的坐标、当前光标的位置,文本的显示属性等,Turbo C 提供了一些函数用来得到这些信息。(1)得到屏幕文本显示有关信息的函数 gettextinfo(),其调用形式为:gettextinfo(struct text_info 类型指针);这里的 text_info 是在 conio.h 头文件中定义的一个结构,该结构的定义是:structtext_info(unsigned char winleft;/*窗口左上角 x 坐标*/unsigned char wintop;/*窗口左上角 y 坐标*/unsigned

26、char winright;/*窗口右下角 x 坐标*/unsigned char winbottom;/*窗口右下角 y 坐标*/unsigned char attributes;/*文本属性*/unsigned char normattr;/*通常属性*/unsigned char currmode;/*当前文本方式*/unsigned char screenheight;/*屏高*/unsigned char screenwidth;/*屏宽*/unsigned char curx;/*当前光标的 x 值*/unsigned char cury;/*当前光标的 y 值*/;(2)得到当前

27、光标位置的函数 wherex()和 wherey()。它们的调用形式如下:wherex();wherey();这两个函数将分别得到当前窗口中光标的 x 和 y 坐标。例如下面的调用,可以输出当前光标的 x,y 坐标:printf(The cursor is at%d,%dn,wherex(),wherey();14.1.2 键盘输入 当我们按下键盘上某键时,系统如何知道某键被按下呢?简单的应用中可采用两种办法:一是直接使用 Turbo C 提供的键盘操作函数 bioskey()来识别,二是通过 int86()函数实现。函数 bioskey()的调用的形式为:bioskey(cmd);它在 bi

28、os.h 头文件中进行了说明,该函数完成直接键盘操作,参数 cmd 的值决定执行什么操作。cmd 可以取 0、1、2 三个值。当 cmd 是 0 时,bioskey 函数返回按键的键值,该值是一个 16 位的二进制数。若没有键按下,则该函数一直等待,直到有键按下。当按下一个普通键时,其返回值的低 8 位数存放该字符的 ASCII 码;对于特殊键(如方向键、F1F12 等等),低 8 位为 0,高 8 位字节存放该键的扫描码。当 cmd 是 1 时,bioskey 函数查询是否有键按下。若有则返回非零值,否则返回 0。542 C语言开发全程指南 当 cmd 是 2 时,bioskey 函数将返回

29、一些控制键是否被按过,按过的状态由该函数返回的低 8 位的各位值来表示,如表 14-3 所示。表 14-3 参数 cmd 为 2 时低 8 位的各位值 cmd 对应的 16 进制数 含 义 0 0 x01 右边的【Shift】键被按下 1 0 x02 左边的【Shift】键被按下 2 0 x04【Ctrl】键被按下 3 0 x08【Alt】键被按下 4 0 x10【Scroll Lock】已打开 5 0 x20【Num Lock】已打开 6 0 x40【Caps Lock】已打开 7 0 x80【Inset】已打开 当某位为 l 时,表示相应的键已按,或相应的控制功能已有效,如选参数 cmd

30、为 1,若key 值为 0 x09,则表示右边的【Shift】键被按,同时又按了【Alt】键。函数 int86()的调用形式为:int86(中断号,&输入指针名,&输出指针名);这个函数在bios.h头文件中进行了说明,它的第一个参数intr_num表示BIOS调用类型号,相当于 int n 调用的中断类型号 n;第二个参数表示是指向联合类型 REGS 的指针,它用于接收调用的功能号及其他一些指定的入口参数,以便传给相应的寄存器,第三个参数也是一个指向联合类型 REGS 的指针,它用于接收功能调用后的返回值,即出口参数,如调用的结果、状态信息,这些值从相关寄存器中得到。实例 14-2 将屏幕平

31、分成两个窗口 实例说明 编写一段 C 代码,实现将屏幕垂直平分成两个窗口,左边窗口为蓝色背景,白色前景,右边窗口为绿色背景,黄色前景。两个窗口都设计为文本输入,即在窗口中可以输入文字,在窗口屏幕中显示出来。使用【Tab】键在左右两个窗口中切换,每个窗口都有光标,活动窗口光标进行闪烁。实例代码 光盘chapter1414-2 知识要点 文本的屏幕输出和键盘输入。(1)编辑源代码 启动 Turbo C 3.0 编译器,在编辑区中输入代码 14-2 中的代码。代码 14-2 实例 14-2 的代码 01.#include 02.#include 03.#include 04.char leftbuf

32、40*25*2;/*切换时保存左窗口文本*/05.char rightbuf40*25*2;/*切换时保存右窗口文本*/543第14章 C语言高级编程技术 06.int leftx,lefty;/*切换时保存左窗口当前坐标*/07.int rightx,righty;/*切换时保存右窗口当前坐标*/08.void draw_left_win();/*重绘左边窗口*/09.void draw_right_win();/*重绘右边窗口*/10.int main()11.12.int key;13.int turn;14.textmode(C80);/设置显示文本方式 C80 15.textback

33、ground(0);/设置背景色 16.textcolor(WHITE);/设置前景色即文本字符的颜色 17.clrscr();/清屏 18.gotoxy(60,1);/定位光标在当前窗口的(60,1)处 19.cprintf(Press Esc to Quit);/输出一行字符串 20./*右边窗口为绿色背景,黄色前景*/21.window(41,2,79,24);/绘制右窗口 22.textbackground(2);/设置右窗口背景色 23.textcolor(14);/设置右窗口前景色 24.clrscr();/清屏 25.gettext(41,2,79,24,rightbuf);/保

34、存右窗口中的文本 26./*左边窗口为蓝色背景,白色前景*/27.window(2,2,40,24);/绘制左窗口 28.textbackground(1);/设置左窗口背景色 29.textcolor(15);/设置左窗口前景色 30.clrscr();/清屏 31.gettext(2,2,40,24,leftbuf);/保存左窗口中的文本 32.turn=1;/*初始激活右窗口*/33.for(;)34.35.key=bioskey(0);36.if(key=0 x011b)37.exit(0);38.key=key&0 xff;/*获取窗口输入的文本的 ASCII 码值*/39.if(k

35、ey=t)40.41.if(turn=1)/*切换到右窗口*/42.43.gettext(2,2,40,24,leftbuf);44.leftx=wherex();45.lefty=wherey();46.draw_right_win();47.turn=0;48.49.else if(turn=0)/*切换到左窗口*/50.51.gettext(41,2,79,24,rightbuf);52.rightx=wherex();53.righty=wherey();54.draw_left_win();55.turn=1;56.57.544 C语言开发全程指南 58.else 59.putch(

36、key);/*当前光标处显示新输入的文本字符*/60.61.62.void draw_right_win()/重绘右窗口函数 63.64.window(41,2,79,24);65.textbackground(2);66.textcolor(14);67.clrscr();68.puttext(41,2,79,24,rightbuf);69.gotoxy(rightx,righty);70.71.void draw_left_win()/重绘左窗口函数 72.73.window(2,2,40,24);74.textbackground(1);75.textcolor(15);76.clrsc

37、r();77.puttext(2,2,40,24,leftbuf);78.gotoxy(leftx,lefty);79.代码执行步骤如下。代码第 1 行到第 9 行先是包含相应的头文件,然后定义了相关的变量,最后声明将在main 函数中被调用的两个自定义函数。代码第 12、13 行定义了两个整型变量 key 和 turn。其中 key 用来存储用户当前按键值,turn 用来实现左右窗口间的切换。代码第 14 行到第 17 行是设置窗口显示文本方式为 C80,设置窗口背景色为黑色,设置窗口前景色为白色,然后清屏。代码第 31、32 行是将左窗口的文本保存在字符数组 leftbuf 中,然后定义

38、turn 的值等于 1。代码第 33 行到第 61 行是一个 for 循环,该循环将永远执行下去,直到循环体中执行了退出循环或退出程序的命令。代码第 35 行是调用 bioskey(0)获得当前用户按下的键值,并存储在变量 key 中。代码第 36 行是判断 key 是否等于 0 x011b(即键【Esc】),若是则执行代码第 37 行退出本程序,若不是则继续执行其下面的代码。编者手记 这里的 16 进制数 0 x011b 为键【Esc】的键盘扫描码。有关键盘扫描码的内容超出了本书的范围,这里就不做介绍,若读者想要了解相关的内容,请读者查阅相关的资料。代码第 38 行将 key 的值和 0 x

39、ff 相与获得用户所按键的 ASCII 码值,并重新保存在 key 中。代码第 39 行是判断该键是否为【Tab】键(ASCII 码值等于字符t),若是则执行代码第 41 545第14章 C语言高级编程技术 行再判断 turn 的值是否等于 1,若是则执行代码第 43 行到第 47 行,先调用 gettext 函数将左窗口中文本保存到 leftbuf 数组中,接着调用 wherex 和 wherey 函数获得当前光标的位置,然后调用 draw_right_win()函数重新绘制右窗口,最后将 turn 的值设置为 0;若 turn 的值等于 0则执行代码第 51 行到第 55 行,先调用 ge

40、ttext 函数将右窗口中文本保存到 rightbuf 数组中,接着调用 wherex 和 wherey 函数获得;若该键不是为【Tab】键则指向代码第 59 行在当前光标处显示新输入的文本字符。代码第 62 行定义 draw_right_win 函数实现重新绘制右窗口,该函数返回为 void 类型,函数无参数,其函数体为代码第 64 行到第 69 行。代码第 64 行是调用 window 函数绘制右窗口;代码第 65 行设置右窗口背景色;代码第 66 行设置右窗口前景色;代码第 67 行清屏;代码第 68 行将当前右窗口中的文本保存到字符数组 rightbuf 中;代码第 69 行定位右窗口

41、中光标的位置。代码第 71 行定义 draw_left_win 函数实现重新绘制左窗口,该函数返回为 void 类型,函数无参数,其函数体为代码第 73 行到代码第 78 行。代码第 73 行是调用 window 函数绘制左窗口;代码第 74 行设置左窗口背景色;代码第 75 行设置左窗口前景色;代码第 76 行清屏;代码第 77 行将当前左窗口中的文本保存到字符数组 leftbuf 中;代码第 78 行定位左窗口中光标的位置。(2)保存源文件 按【F2】键,在弹出的保存文件窗口中,选择或输入文件保存到的目录并修改该文件名为Ex14-2.c。(3)编译、链接、运行程序 按【F9】键,编译并链接

42、代码 14-2,然后按【Ctrl+F9】快捷键运行该程序。最后按【Alt+F5】快捷键查看程序运行结果。结果如图 14-3 所示。图 14-3 实例 14-2 的运行结果 接着可在两个窗口中输入文本,并使用【Tab】键在左右两个窗口中切换。例如在左窗口中输入字符串“hello”,然后按【Tab】键则切换到右窗口,在右窗口中输入字符串“nihao”,如图 14-4 所示。546 C语言开发全程指南 图 14-4 在左右窗口中输入文本 本程序首先用文本窗口函数 window()画出两个窗口,用 textcolor(),textbackground(),clrscr()等进行窗口属性的设置。用【Ta

43、b】键进行两个窗口间的循环切换,在每次切换前先调用 gettext()函数把当前矩形窗口上的字符拷贝到由 buf 所指向的内存中,在切换到另一个窗口后调用puttext()把先前存储在该窗口 buf 所指向的内存中的字符拷贝到当前窗口中,并用 gotoxy()把光标移到原先所在位置,因此可以接着先前的文本继续编辑。程序中运用一个临时变量 turn 的值 0 和 1 来进行两个窗口间的循环切换,当值为 0 时调用 draw_left_win()函数重绘左边窗口,当值为 1 时调用 draw_right_win()函数重绘右边窗口。程序用 bioskey(0)来读取键盘输入的文本并存在内存中,然后

44、用 putch(key)输出。14.2 Turbo C 图形处理 计算机图形程序设计是程序设计中较难且又最吸引人的部分。为了用户设计图形程序方便,不同版本和公司的 C 编译系统都提供了许多画图库函数,用户设计图形程序时,只要在需要的地方,设置相应的参数对其调用即可(这些画图库函数不是 C 语言标准要求的,一般 C语言程序设计课本中没做介绍)。Turbo C 提供了非常丰富的图形函数以实现图形程序设计,所有图形函数的原型均在头文件 graphics.h 中,本节将介绍编制图形程序的各种库函数和相应的其他一些知识。使用图形函数时要确保有显示器图形驱动程序“*.BGI”,同时将集成开发环境Optio

45、ns/Linker 中的 Graphics lib 选为 on,只有这样才能保证正确使用图形函数.14.2.1 图形模式的初始化和关闭 不同的显示器适配器有不同的图形分辨率。即使同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80 列,25 行字符模式),此时所有图形函数均不能工作。1图形模式的初始化函数 Turbo C 提供了函数 initgraph 用来设置屏幕为图形模式,其原型为:547第14章 C语言高级编程技术 void far initgraph(int fa

46、r*gdriver,int far*gmode,char*path);编者手记 注意其中的 far 表示远指针,具体介绍请读者查阅相关资料。其中 gdriver 和 gmode 分别表示图形驱动器和模式,path 是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见表 14-4。图形驱动程序由 Turbo C 出版商提供,文件扩展名为.BGI。根据不同的图形适配器有不同的图形驱动程序。例如对于 EGA、VGA 图形适配器就调用驱动程序 EGAVGA.BGI。表 14-4 图形驱动器、模式的符号常数及数值 图形驱动器(gdriver)图形模式(gmode)符号常数

47、数 值 符号常数 数 值 色 调 分 辨 率 页 数 CGAC0 0 C0 320*200 1 CGAC1 1 C1 320*200 1 CGAC2 2 C2 320*200 1 CGAC3 3 C3 320*200 1 CGA 1 CGAHI 4 2 色 640*200 1 MCGAC0 0 C0 320*200 1 MCGAC1 1 C1 320*200 1 MCGAC2 2 C2 320*200 1 MCGAC3 3 C3 320*200 1 MCGAMED 4 2 色 640*200 1 MCGA 2 MCGAHI 5 2 色 640*480 1 EGALO 0 16 色 640*20

48、0 4 EGA 3 EGAHI 1 16 色 640*350 2 EGA64LO 0 16 色 640*200 1 EGA64 4 EGA64HI 1 4 色 640*350 1 EGAMON 5 EGAMONHI 0 2 色 640*350 1 IBM8514LO 0 256 色 640*480 IBM8514 6 IBM8514HI 1 256 色 1024*768 HERC 7 HERCMONOHI 0 2 色 720*348 1 ATT400C0 0 C0 320*200 1 ATT400C1 1 C1 320*200 1 ATT400C2 2 C2 320*200 1 ATT400C

49、3 3 C3 320*200 1 ATT400MED 4 2 色 320*200 1 ATT400 8 ATT400HI 5 2 色 320*200 1 VGALO 0 16 色 640*200 2 VGAMED 1 16 色 640*350 2 VGA 9 VGAHI 2 16 色 640*480 1 PC3270 10 PC3270HI 0 2 色 720*350 1 DETECT 0 用于硬件测试 548 C语言开发全程指南 当我们使用的存储模式为 tiny(微型)、small(小型)或 medium(中型)时,不需要远指针,因而可以将初始化函数调用格式写成如下形式(该说明适用于后面所述

50、的任一函数):initgraph(&graphdriver,&graphmode,);其中驱动程序目录路径为空字符(“”)时,表示就在当前目录下。当我们不知道所用显示适配器名称时,可将 graphdriver 设成 DETECT,它将自动检测所用显示适配器类型,并将相应的驱动程序装入,将其最高的显示模式作为当前显示模式,如表 14-5 所示。表 14-5 检测到的适配器及其选中的显示模式 检测到的适配器 选中的显示模式 CGA 4(640200,2 色即 CGAHI)EGA 1(640350,16 色,即 EGAHI)VGA 2(640480,16 色,即 VGAHI)一旦执行了初始化,显示器

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com