TC高级编程.docx
《TC高级编程.docx》由会员分享,可在线阅读,更多相关《TC高级编程.docx(196页珍藏版)》请在冰豆网上搜索。
![TC高级编程.docx](https://file1.bdocx.com/fileroot1/2023-5/22/b2a694d3-f9e8-4e4f-8acf-e9a5e4a2eab6/b2a694d3-f9e8-4e4f-8acf-e9a5e4a2eab61.gif)
TC高级编程
TC高级编程技术
(1)
高级编程技术
介绍如何利用TC系统所提供的相关函数实现菜单设计、图形绘制、动画的播放、乐曲
的演奏、汉字的显示、图片的显现等技术,在讲述时,以问题-解答的方式来逐渐阐明。
1文本的屏幕输出和键盘输入...........................................................................................1
1.1文本的屏幕输出.....................................................................................................................1
1.2键盘输入................................................................................................................................8
1.3问题实现...............................................................................................................................11
1.4高级应用——菜单实现.......................................................................................................14
实验一........................................................................................................................................23
2图形显示方式和鼠标输入.........................................................................................................23
2.1图形显示...............................................................................................................................23
2.2鼠标的使用...........................................................................................................................52
2.3问题实现...............................................................................................................................58
实验二........................................................................................................................................62
3屏幕图象与动画技术.................................................................................................................63
3.1一个简单的实现方法..........................................................................................................63
3.2利用动态开辟图视口的方法...............................................................................................66
3.3利用屏幕图象存储再放的方法...........................................................................................67
3.4利用页交替的方法...............................................................................................................70
3.5问题实现...............................................................................................................................71
实验三........................................................................................................................................74
4中断技术...................................................................................................................................74
4.1编写自己的中断程序...........................................................................................................76
4.2问题实现..............................................................................................................................78
4.3其它应用——硬中断演示秒表程序...................................................................................84
实验四........................................................................................................................................87
5发声技术...................................................................................................................................87
5.1声音函数...............................................................................................................................87
5.2计算机乐谱...........................................................................................................................88
5.3问题实现...............................................................................................................................89
实验五........................................................................................................................................93
6汉字显示技术............................................................................................................................93
6.1汉字编码...............................................................................................................................93
6.2问题实现...............................................................................................................................95
实验六........................................................................................................................................97
1
使用过Windows系统的用户都感受到了图形用户界面的直观和高效。
所有Windows系
统的应用程序都拥有相同或相似的基本外观,包括窗口、菜单、工具条、状态栏等。
用户只
要掌握其中一个,就不难学会其它软件,从而降低了学习成本和难度。
而且Windows是一
个多任务的操作环境,它允许用户同时运行多个应用程序,或在一个程序中同时做几件事情。
例如,我们可以边欣赏MP3的音乐边IE冲浪,可以在运行WORD时同时编辑多个文档等。
用户直接通过鼠标或键盘来使用应用程序,或在不同的应用程序之间进行切换,非常方便。
这些都是单任务、命令行界面的DOS操作系统所无法比拟的。
TC2.0或TC3.0均是在DOS
环境下运行的C系统。
不过,无论采用TC,还是VC、BC,所产生的C可执行程序都是基
于DOS系统的。
C语言发展如此迅速,而且成为最受欢迎的语言之一,主要因为它具有强大的功能。
C
是一种“中”级语言,它把高级语言的基本结构和语句与低级语言的实用性结合起来。
C语
言可以对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
C语言具有各种
各样的数据类型,并引入了指针概念,可使程序效率更高。
另外C语言也具有强大的图形
功能,支持多种显示器和驱动器。
而且计算功能、逻辑判断功能也比较强大,可以实现决策
目的。
C系统提供了大量的功能各异的标准库函数,减轻了编程的负担。
所以要用C语言
实现具有类Windows系统应用程序界面特征的、或更生动复杂的DOS系统的程序,就必须
掌握更高级的编程技术。
这些技术与微机的硬件密切联系,除了在第一章介绍的内容外,更
深入的知识将在接口和汇编这门后期课程中学习。
1文本的屏幕输出和键盘输入
[问题的提出]编制一个程序,将屏幕垂直平分成两个窗口,左边窗口为蓝色背景,白色
前景,右边窗口为绿色背景,红色前景。
两个窗口都设计为文本输入,即在窗口中可以输入
文字,在窗口屏幕中显示出来。
使用tab键在左右两个窗口中切换,每个窗口都有光标,活
动窗口光标进行闪烁。
[分析]在这个问题中我们遇到了在初学C时不曾接触到的新概念,如文本窗口、前景色、
背景色,以及围绕它们要解决的新问题:
(1)如何在屏幕中开文本输入的窗口?
(2)如何设置窗口的前景色、背景色或闪烁等显示属性?
(3)如何通过按键来控制窗口的切换?
[解答]要解决这一编程问题,要求有两方面的学习过程:
一是对于分析中的前两个问题,
要求大家了解有关文本的屏幕输出的知识;二是对于第3个问题,要求对键盘的输入有所了
解。
下面先就这两个方面的内容做一介绍。
1.1文本的屏幕输出
显示器的屏幕显示方式有两种:
文本方式和图形方式。
文本方式就是显示文本的模式,
它的显示单位是字符而不是图形方式下的象素,因而在屏幕上显示字符的位置坐标就用行和
列表示。
TurboC的字符屏幕函数主要包括文本窗口大小的设定、窗口颜色的设置、窗口文
本的清除和输入输出等函数。
这些函数的有关信息(如宏定义等)均包含在conio.h头文件中,
因此在用户程序中使用这些函数时,必须用include将conio.h包含进程序。
1)文本窗口的定义
TurboC默认定义的文本窗口为整个屏幕,共有80列25行的文本单元。
如图3-1所示,
规定整个屏幕的左上角坐标为(1,1),右下角坐标为(80,25),并规定沿水平方向为X
2
轴,方向朝右;沿垂直方向为Y轴,方向朝下。
每个单元包括一个字符和一个属性,字符
即ASCII码字符,属性规定该字符的颜色和强度。
除了这种默认的80列25行的文本显示
方式外,还可由用户通过函数:
voidtextmode(intnewmode);
来显式地设置TurboC支持的5种文本显示方式。
该函数将清除屏幕,以整个屏幕为当前窗
口,并移光标到屏幕左上角。
newmode参数的取值见表3-1,既可以用表中指出的方式代码,
又可以用符号常量。
LASTMODE方式指上一次设置的文本显示方式,它常用于在图形方式
到文本方式的切换。
(1列,1行)
(80列,25行)
第一行
第一列
第80列
第25行
图3-1屏幕文本显示坐标
表3-1文本显示方式
方式符号常量显示列×行数和颜色
0BW4040×25黑白显示
1C4040×25彩色显示
2BW8080×25黑白显示
3C8080×25彩色显示
7MONO80×25单色显示
-1LASTMODE上一次的显示方式
TurboC也可以让用户根据自己的需要重新设定显示窗口,也就是说,通过使用窗口设
置函数window()定义屏幕上的一个矩形域作为窗口。
window()函数的函数原型为:
voidwindow(intleft,inttop,intright,intbottom);
函数中形式参数(intleft,inttop)是窗口左上角的坐标,(intright,intbottom)是窗口的
右下角坐标,其中(left,top)和(right,bottom)是相对于整个屏幕而言的。
例如,要定
义一个窗口左上角在屏幕(20,5)处,大小为30列15行的窗口可写成:
window(20,5,50,25);
若window()函数中的坐标超过了屏幕坐标的界限,则窗口的定义就失去了意义,也就是说
定义将不起作用,但程序编译链接时并不出错。
窗口定义之后,用有关窗口的输入输出函数就可以只在此窗口内进行操作而不超出窗口
的边界。
另外,一个屏幕可以定义多个窗口,但现行窗口只能有一个(因为DOS为单任务操作
系统)。
当需要用另一窗口时,可将定义该窗口的window()函数再调用一次,此时该窗口便
成为现行窗口了。
2)文本窗口颜色和其它属性的设置
文本窗口颜色的设置包括背景颜色的设置和字符颜色(既前景色)的设置,使用的函数
及其原型为:
3
设置背景颜色函数:
voidtextbackground(intcolor);
设置字符颜色函数:
voidtextcolor(intcolor);
有关颜色的定义见表3-2。
表中的符号常数与相应的数值等价,二者可以互换。
例如设定兰
色背景可以使用textbackground
(1),也可以使用textbackground(BLUE),两者没有任何区别,
只不过后者比较容易记忆,一看就知道是兰色。
表3-2颜色表
符号常数数值含义背景或背景
BLACK0黑前景、背景色
BLUE1蓝前景、背景色
GREEN2绿前景、背景色
CYAN3青前景、背景色
RED4红前景、背景色
MAGENTA5洋红前景、背景色
BROWN6棕前景、背景色
LIGHTGRAY7淡灰前景、背景色
DARKGRAY8深灰用于前景色.
LIGHTBLUE9淡蓝用于前景色
LIGHTGREEN10淡绿用于前景色
LIGHTCYAN11淡青用于前景色
LIGHTRED12淡红用于前景色
LIGHTMAGENTA13淡洋红用于前景色
YELLOW14黄用于前景色
WHITE15白用于前景色
BLINK128闪烁用于前景色
TurboC另外还提供了一个函数,可以同时设置文本的字符和背景颜色,这个函数是
文本属性设置函数:
voidtextattr(intattr);
参数attr的值表示颜色形式编码的信息,每一位代表的含义如下:
字节低四位cccc设置字符颜色,4~6三位bbb设置背景颜色,第7位B设置字符是否闪烁。
假如要设置一个兰底黄字,定义方法如下:
textattr(YELLOW+(BLUE<<4));
若再要求字符闪烁,定义变为:
textattr(128+YELLOW+(BLUE<<4);
注意:
(1)对于背景只有0到7共八种颜色,取大于7小于15的数,则代表的颜色与减7后的值
对应的颜色相同;
(2)用textbackground()和textcolor()函数设置了窗口的背景与字符颜色后,在没有用clrscr()
函数清除窗口之前,颜色不会改变,直到使用了函数clrscr(),整个窗口和随后输出到窗
口中的文本字符才会变成新颜色。
4
(3)用textattr()函数时背景颜色应左移4位,才能使3位背景颜色移到正确位置;
例程3-1:
这个程序使用了关于窗口大小的定义、颜色的设置等函数,在一个屏幕上不同位
置定义了7个窗口,其背景色分别使用了7种不同的颜色。
/*-------例程3-1-------*/
#include
#include
intmain()
{
inti;
textbackground(0);/*设置屏幕背景色,待clrscr后起作用*/
clrscr();/*清除文本屏幕*/
for(i=1;i<8;i++)
{
window(10+i*5,5+i,30+i*5,15+i);/*定义文本窗口*/
textbackground(i);/*定义窗口背景色*/
clrscr();/*清除窗口*/
}
getch();
return0;
}
voidhighvideo(void);
该函数将设置用高亮度显示字符。
voidlowvideo(void);
该函数将设置用低亮度显示字符。
voidnormvideo(void);
该函数将设置通常亮度显示字符。
3)窗口内文本的输入输出函数
?
窗口内文本的输出函数
我们以前介绍过的printf(),putc(),puts(),putchar()和输出函数以整个屏幕为窗口的,
它们不受由window设置的窗口限制,也无法用函数控制它们输出的位置,但TurboC提供
了三个文本输出函数,它们受窗口的控制,窗口内显示光标的位置,就是它开始输出的位置。
当输出行右边超过窗口右边界时,自动移到窗口内的下一行开始输出,当输出到窗口底部边
界时,窗口内的内容将自动产生上卷,直到完全输出完为止,这三个函数均受当前光标的控
制,每输出一个字符光标后移一个字符位置。
这三个输出函数原型为:
intcprintf(char*format,表达式表);
intcputs(char*str);
intputch(intch);
它们的使用格式同printf(),puts()和putc(),其中cprintf()是将按格式化串定义的字符串或数
据输出到定义的窗口中,其输出格式串同printf函数,不过它的输出受当前光标控制,且输
出特点如上所述,cputs同puts,是在定义的窗口中输出一个字符串,而putch()则是输出一
个字符到窗口,它实际上是函数putc的一个宏定义,即将输出定向到屏幕。
?
窗口内文本的输入函数
5
可直接使用stdio.h中的getch或getche函数。
需要说明的是,getche()函数从键盘上获
得一个字,在屏幕上显示的时候,如果字符超过了窗口右边界,则会被自动转移到下一行的
开始位置。
4)有关屏幕操作的函数
voidclrscr(void);
该函数将清除窗口中的文本,并将光标移到当前窗口的左上角,即(1,1)处。
voidclreol(void);
该函数将清除当前窗口中从光标位置开始到本行结尾的所有字符,但不改变光标原来的
位置。
voiddelline(void);
该函数将删除一行字符,该行是光标所在行。
voidgotoxy(intx,inty);
该函数很有用,用来定位光标在当前窗口中的位置。
这里x,y是指光标要定位处的坐
标(相对于窗口而言)。
当x,y超出了窗口的大小时,该函数就不起作用了。
intmovetext(intx1,inty1,intx2,inty2,intx3,inty3);
该函数将把屏幕上左上角为(xl,y1),右下角为(x2,y2)的矩形内文本拷贝到左上角为(x3,
y3)的一个新矩形区内。
这里x,y坐标是以整个屏幕为窗口坐标系,即屏幕左上角为(1,1)。
该函数与开设的窗口无关,且原矩形区文本不变。
intgettext(intxl,intyl,intx2,inty2,void*buffer);
该函数将把左上角为(xl,y1),右下角为(x2,y2)的屏幕矩形区内的文本存到由指针buffer
指向的一个内存缓冲区内,当操作成功,返回1;否则,返回0。
因一个在屏幕上显示的字符需占显示存储器VRAM的两个字节,即第一个字节是该字
符的ASCII码,第二个字节为属性字节,即表示其显示的前景、背景色及是否闪烁,所以
buffer指向的内存缓冲区的字节总数的计算为:
字节总数=矩形内行数×每行列数×2
其中:
矩形内行数=y2-y1+l,每行列数=x2-xl+1(每行