1 文本的屏 幕输出 和键盘 输入
[问题的提出] 编制一个程序,将屏幕垂直平分成两个窗口,左边窗口为蓝背景,白
前景,右边窗口为绿背景,红前景。两个窗口都设计为文本输入,即在窗口中可以输入
文字,在窗口屏幕中显示出来。使用tab 键在左右两个窗口中切换,每个窗口都有光标,活
动窗口光标进行闪烁。
[分析] 在这个问题中我们遇到了在初学C 时不曾接触到的新概念,如文本窗口、前景、
背景,以及围绕它们要解决的新问题:
1 如何在屏幕中开文本输入的窗口?
2 如何设置窗口的前景、背景或闪烁等显示属性?
3 如何通过按键来控制窗口的切换?
[解答] 要解决这一编程问题,要求有两方面的学习过程:一是对于分析中的前两个问题,
要求大家了解有关文本的屏幕输出的知识;二是对于第3 个问题,要求对键盘的输入有所了
解。下面先就这两个方面的内容做一介绍。
1.1 文本的屏幕输出
显示器的屏幕显示方式有两种:文本方式和图形方式。文本方式就是显示文本的模式,
它的显示单位是字符而不是图形方式下的象素,因而在屏幕上显示字符的位置坐标就用行和
列表示。Turbo C 的字符屏幕函数主要包括文本窗口大小的设定、窗口颜的设置、窗口文
本的清除和输入输出等函数。这些函数的有关信息(如宏定义等)均包含在conio.h 头文件中,
因此在用户程序中使用这些函数时,必须用include conio.h 包含进程序。
1) 文本窗口的定义
Turbo C 默认定义的文本窗口为整个屏幕,共有80 25 行的文本单元。如图3-1 所示,
规定整个屏幕的左上角坐标为(11),右下角坐标为(8025),并规定沿水平方向为X
2
轴,方向朝右;沿垂直方向为Y 轴,方向朝下。每个单元包括一个字符和一个属性,字符
ASCII 码字符,属性规定该字符的颜和强度。除了这种默认的80 25 行的文本显示
方式外,还可由用户通过函数:
void textmode(int newmode)
来显式地设置 Turbo C 支持的5 种文本显示方式。该函数将清除屏幕,以整个屏幕为当前窗
口,并移光标到屏幕左上角。newmode 参数的取值见表3-1,既可以用表中指出的方式代码,
又可以用符号常量。LASTMODE 方式指上一次设置的文本显示方式,它常用于在图形方式
到文本方式的切换。
(1列,1)
(80列,25)
第一行
第一列
80
25
3-1 屏幕文本显示坐标
3-1 文本显示方式
方式 符号常量 显示列×行数和颜
0 BW40 40×25 黑白显示
1 C40 40×25 彩显示
2 BW80 80×25 黑白显示
3 C80 80×25 彩显示
7 MONO 80×25 单显示
-1 LASTMODE 上一次的显示方式
Turbo C 也可以让用户根据自己的需要重新设定显示窗口,也就是说,通过使用窗口设
置函数window()定义屏幕上的一个矩形域作为窗口。window()函数的函数原型为:
void window(int left, int top, int right, int bottom)
函数中形式参数(int leftint top)是窗口左上角的坐标,(int rightint bottom)是窗口的
右下角坐标,其中(lefttop)和(rightbottom)是相对于整个屏幕而言的。例如,要定
义一个窗口左上角在屏幕(205)处,大小为30 15 行的窗口可写成:
window(20, 5, 50, 25);
window()函数中的坐标超过了屏幕坐标的界限,则窗口的定义就失去了意义,也就是说
定义将不起作用,但程序编译链接时并不出错。
窗口定义之后,用有关窗口的输入输出函数就可以只在此窗口内进行操作而不超出窗口
的边界。
另外,一个屏幕可以定义多个窗口,但现行窗口只能有一个(因为 DOS 为单任务操作
系统)。当需要用另一窗口时,可将定义该窗口的window()函数再调用一次, 此时该窗口便
成为现行窗口了。
2) 文本窗口颜和其它属性的设置
文本窗口颜的设置包括背景颜的设置和字符颜(既前景)的设置,使用的函数
及其原型为:
3
设置背景颜函数:void textbackground(int color)
设置字符颜函数:void textcolor(int color)
有关颜的定义见表 3-2。表中的符号常数与相应的数值等价,二者可以互换。例如设定兰
背景可以使用textbackground(1),也可以使用textbackground(BLUE),两者没有任何区别,
只不过后者比较容易记忆,一看就知道是兰。
3-2 颜表
符号常数 数值 含义 背景或背景
BLACK 0 前景、背景
BLUE 1 前景、背景
GREEN 2 绿 前景、背景
CYAN 3 前景、背景
RED 4 前景、背景
MAGENTA 5 洋红 前景、背景
BROWN 6 前景、背景
LIGHTGRAY 7 淡灰 前景、背景
DARKGRAY 8 深灰 用于前景.
LIGHTBLUE 9 淡蓝 用于前景
LIGHTGREEN 10 淡绿 用于前景
LIGHTCYAN 11 淡青 用于前景
LIGHTRED 12 淡红 用于前景
LIGHTMAGENTA 13 淡洋红 用于前景
YELLOW 14 用于前景
WHITE 15 用于前景
BLINK 128 闪烁 用于前景
Turbo C 另外还提供了一个函数,可以同时设置文本的字符和背景颜,这个函数是
文本属性设置函数:void textattr(int attr)
参数 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 <stdio.h>
#include <conio.h>
int main()
{
int i;
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();
return 0;
}
void highvideo(void)
该函数将设置用高亮度显示字符。
void lowvideo(void)
该函数将设置用低亮度显示字符。
void normvideo(void)
该函数将设置通常亮度显示字符。
3) 窗口内文本的输入输出函数
? 窗口内文本的输出函数
我们以前介绍过的 printf()putc()puts()putchar()和输出函数以整个屏幕为窗口的,
它们不受由window 设置的窗口限制,也无法用函数控制它们输出的位置,但Turbo C 提供
了三个文本输出函数,它们受窗口的控制,窗口内显示光标的位置,就是它开始输出的位置。
当输出行右边超过窗口右边界时,自动移到窗口内的下一行开始输出,当输出到窗口底部边
界时,窗口内的内容将自动产生上卷,直到完全输出完为止,这三个函数均受当前光标的控
制,每输出一个字符光标后移一个字符位置。这三个输出函数原型为:
int cprintf(char *format,表达式表)
int cputs(char *str)
int putch(int ch)
它们的使用格式同 printf()puts()putc(),其中cprintf()是将按格式化串定义的字符串或数
据输出到定义的窗口中,其输出格式串同printf __________数,不过它的输出受当前光标控制,且输
出特点如上所述,cputs puts,是在定义的窗口中输出一个字符串,而putch()则是输出一
个字符到窗口,它实际上是函数putc 的一个宏定义,即将输出定向到屏幕。
? 窗口内文本的输入函数
5
可直接使用stdio.h 中的getch getche 函数。需要说明的是,getche()函数从键盘上获
得一个字,在屏幕上显示的时候,如果字符超过了窗口右边界,则会被自动转移到下一行的
开始位置。
4) 有关屏幕操作的函数
void clrscr(void)
该函数将清除窗口中的文本,并将光标移到当前窗口的左上角,即(1, 1)处。
void clreol(void)
该函数将清除当前窗口中从光标位置开始到本行结尾的所有字符,但不改变光标原来的
位置。
void delline(void)
该函数将删除一行字符,该行是光标所在行。程序设计c语言
void gotoxy(int x, int y)
该函数很有用,用来定位光标在当前窗口中的位置。这里 xy 是指光标要定位处的坐

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。