Made by Edward.Xu
序:首先感谢BORLAND公司为我们提供了一个这么基础库让我们学习C的GUI编程,虽然现在时代已经基本不用这种编程方式了,不过通过学习最基础的GUI编程,我们能从中体会到很多在MFC或者SWING中我们体会不到的东西。这份C的GUI编程教程只是本人的粗陋潜学,还有很多不恰当的地方,还请多多见谅。本GUI编程仅能在TC平台下编译,VC上不能编译,敬请注意。
北京理工大学珠海学院 徐方鑫
E-mail:[email protected]
第一章:认识GUI编程
在程序设计中,往往我们最后编译的结果都是通过控制台输出所获得的一系列数据,随着科技一天天的进步,人们对程序的美观的要求也逐渐加深,所以渐渐的,图型显示就变的比较重要了。
显示器的显示方式有文本方式和图形方式两种,这里讲述文本方式下屏幕输出的控制,并介绍一些有关屏幕处理的函数。本文所介绍函数均包含于conio.h这个头文件当中,因此在用户程序中使用这些函数时,必须用include将conio.h包含在程序中。
第二章:初识GUI应用函数
1.文本方式控制函数 Void textmode(int newmode);
这里的参数newmode既可以是下表中的方式代码,也可以是大写的方式名。
方式 |
方式名 |
显示列*行数和颜色 |
0 |
BW40 |
40*25黑白显示 |
1 |
C40 |
40*25彩色显示 |
2 |
BW80 |
80*25黑白显示 |
3 |
C80 |
80*25彩色显示 |
7 |
MONO |
80*25单色显示 |
-1 |
LASTMODE |
上一次的显示方式 |
一般建议使用C80或者C40的显示方式。LASTMODE方式指上一次设置的文本显示方式,它常用于在图形方式到文本方式的切换。
2.文本方式颜色控制函数
a.文本属性设置函数 Void textattr(int attr);
该函数设置文本显示的属性,包括字符显示颜色(前景色),背景色及字符显示是否闪烁等,其参数可以用一个字节,即8位数来描述,各位含义如下表。
闪烁 |
红 |
绿 |
蓝 |
加亮 |
红 |
绿 |
蓝 |
BLINK |
R |
G |
B |
I |
R |
G |
B |
闪烁 |
背景色 |
前景色 |
其中低四位用来设置字符显示颜色(对应颜色值0~15),4~6为用来设置显示背景色(对应颜色值0~7),第七位最高,用来显示的字符是否闪烁。
例:蓝底红字 textattr(RED+(BLUE<<4));
白底蓝字(闪) textattr((WHITE<<4)+BLUE_BLINK);
或(方式值) textattr(128+1+(15<<4));
或(十六进制) textattr(0xf1);
颜色表
颜色名 |
值 |
显示色 |
用处 |
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 |
闪烁 |
用于前景色 |
b.文本字符颜色设置函数 void textcolor(int color);
该函数设置文本字符颜色,即是前景色,只能在彩色显示的模式下才可进行。参数可以是方式值也可以是大写的方式名(按颜色表为准)。
c.文本背景色设置函数 void textbackfround(int color);
该函数设置文本背景色,只能在彩色显示的模式下才可进行。参数可以是方式值也可以是大写的方式名(只能是颜色表前八种颜色)。
d.高亮度显示字符 void highvideo(void);
e.低亮度显示字符 void lowvideo(void);
f.通常亮度显示字符 void normvideo(void);
3.窗口设置和文本输出函数
a.窗口设置函数 void window(int x1,int y1,int x2,int y2);
其中(x1,y1)为窗口左上角坐标,(x2,y2)为窗口右下角坐标,这些坐标以整个屏幕为参考系。当定义窗口时,若定义坐标超过屏幕坐标界限(即显示模式的界限),则该窗口不会建立。
利用窗口函数可以在屏幕上定义多个不同的窗口,以显示不同的信息。定义一个窗口后,前面所讲过的函数textattr,textcolor和textbackground仅对此窗口起作用,窗口以外不受影响。当定义多个窗口后,上文中函数的作用域仅为最后一个定义的窗口。
b.控制台文本输出函数
int cprintf(char *format,…);
int cputs(char *str);
int cputch(int ch);
这三个输出函数不同于标准输出函数printf之类,它们受窗口的控制,窗口内显示的光标就是他们开始的位置,当输出行右边超过窗口的左边界时,自动移动到窗口内下一行开始输出,当输出到窗口底部边界时,窗口内的内容将自动上卷(类似于翻页),直至输出完为止。
4.清屏和光标操作函数
a.清屏函数
void clrscr(void); 清除窗口中文本
void clreol(void); 清除当前窗口中从光标开始位置到本行结尾的所有字符(但不改变光标位置)
void delline(void); 清除光标所在那一行字符
b.光标操作函数
void gotoxy(int x,int y);
该函数把光标移动到窗口内的(x,y)处,x,y坐标是相对于窗口而言,它多和cprintf函数配合,以指定输出开始位置。
5.屏幕文本移动与存储函数
a.屏幕文本移动函数 void movetext(int x1,inty1,int x2,int y2,int x3,int y3);
该函数是将坐标起始为(x1,y1)终止为(x2,y2)的矩形方块内文本拷贝到左上角坐标为(x3,y3)的新矩形框内,这里x,y的坐标是以整个屏幕为窗口坐标系,该函数与开设的窗口无关,且原来矩形区文本不变。
b屏幕文本存储函数 void gettext(int x1,int y1,int x2,int y2,void *buffer);
该函数是将坐标起始为(x1,y1)终止为(x2,y2)的矩形方块内文本拷贝到由buffer指针指向的一个内存缓冲区内。这个缓冲区大小可以计算,由于在屏幕上显示的一个字符占两个字节(一个是字符本身的ASCII码,第二个字节是属性字节,表示其显示的前景色,背景色以及是否闪烁等)
缓冲取字节总数=矩形内行数*每行列数*2
c.屏幕文本取出函数 void puttext(int x1,int y1,int x2,int y2,void *buffer);
该函数是将把buffer指针指向的缓冲区内所存文本复制到屏幕上以坐标起始为(x1,y1)终止为(x2,y2)的矩形方块内。
6.状态查询函数
a.屏幕文本显示有关信息的函数
void gettextinfo(struct texy_info *f);
这里的text_info是在conio.h头文件中定义的一个结构,该结构的定义是
Struct text_info
{
unsigned char winleft; /*窗口左上角x坐标*/
unsigned char wintop; /*窗口左上角y坐标*/
unsigned char winright; /*窗口右下角x坐标*/
unsigned char winbottom; /*窗口左下角x坐标*/
unsigned char attributes; /*文本属性*/
unsigned char normattr; /*通常属性*/
unsigned char currmode; /*当前文本方式*/
unsigned char screenheight; /*屏高*/
unsigned char screenwidth; /*屏宽*/
unsigned char curx; /*当前光标的x值*/
unsigned char curyt; /*当前光标的y值*/
b.当前光标位置的函数
int wherex(void);
int wherey(void);
通过这两个函数可分别得到当前窗口中光标的x和y坐标
第三章: 实例分析
文本下拉框设计