C語言圖形編程(一,字符屏幕)
一,屏幕操作函數(shù)
1. clrscr()清除字符窗口函數(shù)
2. window()字符窗口函數(shù)
3. gotoxy()光標(biāo)定位函數(shù)
4. clreol() 清除光標(biāo)行尾字符函數(shù)
5. insline() 插入空行函數(shù)
6. delline() 刪除一行函數(shù)
7. gettext() 拷進(jìn)文字函數(shù)
8. puttext() 拷出文字函數(shù)
9. movetext() 移動文字函數(shù)
二,字符屬性函數(shù)
10. textmode() 文本模式函數(shù)
11. highvideo()高亮度函數(shù)
12. lowvideo() 低亮度函數(shù)
13. normvideo(void);
14. textcolor() 文本顏色函數(shù)
15. textattr() 文本屬性函數(shù)
16.textbackground() 文本背景函數(shù)
三, 屏顯狀態(tài)函數(shù)
17. wherex() 光標(biāo)處x坐標(biāo)函數(shù)
18. wherey() 光標(biāo)處y坐標(biāo)函數(shù)
19. gettextinfo() 獲取文本窗口信息函數(shù)
在Borland C++里面提供了字符屏幕和圖形函數(shù).字符屏幕的核心是窗口(Window),它是屏幕的活動部分,字符輸出或顯示在活動窗口中進(jìn)行.窗口在缺省時(shí),就是整個屏幕.窗口可以根據(jù)需要指定其大小.同樣,對圖形函數(shù)的操作,也提供了(Viewport).也就是說圖形函數(shù)的操作都是在視口上進(jìn)行.圖形視口與字符窗口具有相同的特性,用戶可以在屏幕上定義大小不同的視口,若不定義視口大小,它就是整個屏幕.
窗口是在字符屏幕下的概念,只有字符才能在窗口中顯示出來,這時(shí)用戶可以訪問的最小單位為一個字符.視口是在圖形屏幕狀態(tài)下的概念,文本與圖形都可以在視口上顯示,用戶可訪問的最小單位是一個像素(像素這一術(shù)語最初用來指顯示器上最小的,單獨(dú)的發(fā)光點(diǎn)單元.然而現(xiàn)在,其含義拓寬為指圖形顯示器上的最小可訪問點(diǎn)).
字符和圖形狀態(tài)下,屏幕上的位置都是由它們的行與列所決定的.有一點(diǎn)須指出:字符狀態(tài)左上角坐標(biāo)為(1,1),但圖形左上角坐標(biāo)為(0,0).
了解字符屏幕和圖形函數(shù)與窗口和視口的關(guān)系是很重要的.例如,字符屏幕 光標(biāo)位置函數(shù)gotoxy()將光標(biāo)移到窗口的x,y位置上,這未必是相對于整個屏幕.下面介紹常用的幾類字符屏幕函數(shù)的功能用途,操作方法及其例行程序.
一,屏幕操作函數(shù)
編寫程序繪圖經(jīng)常要用到對字符屏幕進(jìn)行操作.例如,在往屏幕上寫字符之前,首先要將屏幕清除干凈.又如,有時(shí)需要在屏幕上多處寫上肉中刺樣的字符內(nèi)容,這時(shí)最好用屏幕拷貝來高效率地完成這一任務(wù).對這些操作,Borland C++提供了一系列字符屏幕操作函數(shù)來實(shí)現(xiàn).
1. clrscr()清除字符窗口函數(shù)
功能:函數(shù)clrscr()清除整個當(dāng)前字符窗口,并且把光標(biāo)定位于左上角(1,1)處.
用法:此函數(shù)調(diào)用方式為 void clrscr(void);
說明:括號中void 表示無參數(shù).
該函數(shù)相應(yīng)的頭文件為conio.h
返回值:無
例:使用這個函數(shù)的例子見4.clreol()函數(shù)的實(shí)例中.
2. window()字符窗口函數(shù)
功能: 函數(shù)window()用于在指定位置建立一個字符窗口.
用法: 此函數(shù)調(diào)用方式為 void window(int left,int top,int right,int bottom);
說明: 函數(shù)中參數(shù)left,top為窗口左上角坐標(biāo);right,bottom為其右下角坐標(biāo).
若有一個坐標(biāo)是無效的,則window()函數(shù)不起作用.一旦該函數(shù)調(diào)用成功,那么所有定位坐標(biāo)都是相對于窗口的,而不是相對于整個屏幕.但是建立窗口所用的坐標(biāo)總是相對整個屏幕的絕對坐標(biāo),而不是相對當(dāng)前窗口的相對坐標(biāo).這樣用戶就可以根據(jù)各種需要建立多個互不嵌套的窗口.
此函數(shù)的頭文件為conio.h.
返回值:無
例: 調(diào)用這個函數(shù)的實(shí)現(xiàn)例見3.gotoxy()函數(shù)的例子中.
3. gotoxy()光標(biāo)定位函數(shù)
功能: 函數(shù)gotoxy()將字屏幕上的光標(biāo)移到當(dāng)前窗口指定的位置上.
用法: 這個函數(shù)調(diào)用方式為void gotoxy(int x,int y);
說明: 括號里x,y是, 光標(biāo)定位的坐標(biāo),如果其中一個坐標(biāo)值無效(如坐標(biāo)超界),那么光標(biāo)不會移動.
此函數(shù)在字符狀態(tài)(有時(shí)稱為文本狀態(tài))下經(jīng)常用到 ,其相應(yīng)的頭文件為conio.h
返回值:無
例: 下面程序建立兩個窗口,然后在窗口里顯示字符,字符的位置是調(diào)用該函數(shù)確定的.
#include"conio.h>
void border(int startx,int starty,int endx,int endy)
{
register int i;
gotoxy(1,1);
for(i=0;i<=endx-startx;i++)
putch('-');
gotoxy(1,endy-starty);
for(i=0;i<=endx-startx;i++)
putch('-');
for(i=2;i
void main()
{
register int i;
gotoxy(6,8);
printf("This is a test of the clreol() function.");
getch();
gotoxy(6,8);
clreol();
for(i=0;i<20;i++)
printf("Hello\n");
getch();
clrscr();
}
5. insline() 插入空行函數(shù)
功能: 函數(shù)insline()插入一空行到當(dāng)前光標(biāo)所在行上,同時(shí)光標(biāo)以下的所有行都向下順移一行.
用法: 此函數(shù)的調(diào)用方式為void insline(void);
說明: 該函數(shù)只用于文本方式,并且在當(dāng)了符窗口才有效.
這個函數(shù)的對應(yīng)頭文件是 conio.h
返回值:無
例: 程序給出了insline()函數(shù)的用法.
#include "conio.h"
void main()
{
registser int i;
clrscr();
for(i=1;i<24;i++)
{
gotoxy(1,i);
printf("This is line %d\n",i);
}
getch();
gotoxy(1,10);
insline();
getch();
}
6. delline() 刪除一行函數(shù)
功能: 函數(shù)delline()刪除當(dāng)前窗口內(nèi)光標(biāo)所在行,同時(shí)把該行下面 所有行都上移一行.
用法: 此函數(shù)調(diào)用方式為 void delline(void);
說明: 注意,如果當(dāng)前窗口小于整個屏幕,那么該函數(shù)只影響到窗口內(nèi)的字符.
這個函數(shù)相應(yīng)的頭部文件是conio.h
返回值: 無
例:先在屏幕上顯示16行文字,然后刪除第4行
#include "conio.h"
void main()
{
register int i;
clrscr();
for(i=0;i<16;i++) printf("line %d\n",i);
getch();
gotoxy(1,4);
delline();
getch();
}
7.gettext() 拷進(jìn)文字函數(shù)
功能: 函數(shù)gettext()用于文本狀態(tài)下將屏幕上矩形域內(nèi)的文字拷進(jìn)內(nèi)存.
用法: 該函數(shù)調(diào)用方式為 int gettext(int left,int top,int right,int bottom,void *buffer);
說明: 函數(shù)中參數(shù)left,top為矩形區(qū)域的左上角坐標(biāo),right,bottom為其右下角坐標(biāo),這些坐標(biāo)是屏幕的絕對坐標(biāo),不是窗口的相對坐標(biāo).buffer指針必須指向一個足夠保存該矩形域內(nèi)文字的內(nèi)存.所用內(nèi)存大小按下式計(jì)算:
點(diǎn)頭用字節(jié)數(shù)=矩形哉內(nèi)的行數(shù)×矩形域的列數(shù)×2
這里將行數(shù)乘以列數(shù)再乘以2的原因是保存屏幕上每個字符要用兩個字節(jié)存儲單元,一個字節(jié)存儲單元存放字符本身,而另一個存放其屬性.
此函數(shù)相應(yīng)的頭文件是 conio.h
返回值: 若函數(shù)調(diào)用成功則返回1,否則返順0.
例: 把屏幕左上角點(diǎn)(1,1)和右下角點(diǎn)(10,10)的區(qū)域拷貝到buf指向的內(nèi)存中去.
buf=(char *)malloc(10*10*2);
if(!buf)gettext(1,1,10,10,buf);
8. puttext() 拷出文字函數(shù)
功能: 函數(shù)puttext()把先前由gettext()保存到buffer指向的內(nèi)存中的文字拷出到屏幕上一個矩形區(qū)域中.
用法: 此函數(shù)調(diào)用方式為 int puttext(int left,int top,int right,int bottom,void *buffer);
說明: 函數(shù)里left,top為給出的屏幕上矩形區(qū)域的左上角點(diǎn),right,bottom為其右下角點(diǎn),其坐標(biāo)是用屏幕的絕對坐標(biāo),而不是用窗口的相對坐標(biāo).
該函數(shù)相應(yīng)的頭文件為conio.h
返回值: 函數(shù)調(diào)用成功返回值為1,否則返回0.
例: 屏幕上某個區(qū)域內(nèi)容拷進(jìn)buf指向的內(nèi)存中,然后又將這些文字拷出到屏幕上新位置.
buf=(char *)malloc(10*10*2);
gettext(1,1,10,10,buf);
puttext(16,16,30,30,buf);
9. movetext() 移動文字函數(shù)
功能: 函數(shù)movetext()將屏幕上一個矩形區(qū)域的文字移到另一個區(qū)域上.
用法: 該函數(shù)調(diào)用方式為 int movetext(int left,int top,int right,int bottom,int newleft,int newtop);
說明: 上面left,top為矩形區(qū)域上角坐標(biāo),right,bottom為其右下角坐標(biāo),newleft,newright為移動到區(qū)域左上角坐標(biāo).這些坐標(biāo)是屏幕的絕對坐標(biāo),不是窗口的相對坐標(biāo).
若要把屏幕上一段文字移到屏幕的另一位置,那么使用movetext()函數(shù)比用gettext()然后再用puttext()效率更高.
此函數(shù)相應(yīng)的頭文件是conio.h
返回值: 如果有一個以上坐標(biāo)無效,那么函數(shù)返回值為0,否則返回1.
列: 把屏幕左上角點(diǎn)(8,8),右下角點(diǎn)(20,20)的矩形區(qū)域文字移動到左上角點(diǎn)(10,10)的位置上:
movetext(8,8,20,20,10,10);
10. textmode() 文本模式函數(shù)
功能: 函數(shù)textmode()針屏幕設(shè)置為文本模式(或者說字符狀態(tài)).
用法: 函數(shù)調(diào)用方式為 void textmode(int mode);
說明: 參數(shù)mode必須為表1-2中所示的模式之一⑴以用模式名(符號值),也可以用其等價(jià)的整數(shù)值.
表1-2 文本模式
----------------------------------------------------------------
模式名(符號值) 等價(jià)整數(shù)值 說 明
BW40 0 40列黑白
C 40 1 40列彩色
BW80 2 80列黑白
C 80 3 80列彩色
MONO 7 80列單色
LASTMODE -1 上次模式
----------------------------------------------------------------
調(diào)用該函數(shù)后,屏幕復(fù)位,并且所有字符的屬性恢復(fù)其缺省值.
此函數(shù)對應(yīng)的頭文件是conio.h
返回值: 無
例: 把屏幕設(shè)置為80列彩色模式
textmode(C80);
二,字符屬性函數(shù)
用戶可以設(shè)置字符顯示的高亮度或低亮度的寫的符閃爍及其背景顏色等.具有這些操作的函數(shù)稱為字符屬性函數(shù).除了僅支持單模式和單色的顯示卡外,字符屬性函數(shù)適用于其余所有的顯示卡.
11. highvideo()高亮度函數(shù)
功能: 函數(shù)highvideo()設(shè)置屏幕為高亮度顯示.
用法: 此函數(shù)調(diào)用方式為void highvideo(void);
說明: 調(diào)用該函數(shù)后,寫到屏幕上的字符是高亮度的.此函數(shù)只適用于文本模式狀態(tài)(或說字符屏幕狀態(tài)).
這個函數(shù)對應(yīng)的頭文件為 conio.h
返回值: 無
例: 設(shè)置屏幕顯示為高亮度的.
highvideo();
12. lowvideo() 低亮度函數(shù)
功能: 函數(shù)lowvideo()設(shè)置屏幕為低亮度顯示.
用法: 該函數(shù)調(diào)用方式為void lowvideo(void);
說明: 調(diào)用該函數(shù)后,此時(shí)寫到屏幕上的字符是低亮度的.這個函數(shù)只適用于文本模式狀態(tài)(或說字符屏幕狀態(tài)).
此函數(shù)相應(yīng)的頭文件是 conio.h
返回值: 無
例: 設(shè)置屏幕顯示為低亮度的
lowvideo();
13. normvideo(void);
功能: 函數(shù)normvideo()設(shè)置屏幕為正常亮度顯示.
用法: 這個函數(shù)調(diào)用方式為void normvideo(void);
說明: 調(diào)用該函數(shù)后,此時(shí)寫到屏幕上的字符是正常亮度的,該函數(shù)只適用于文本模式狀態(tài)(或說字符狀屏幕狀態(tài)).
此函數(shù)相應(yīng)的頭文件為conio.h
返回值: 無
例: 設(shè)置屏幕顯示為正常亮度.
normvideo();
14. textcolor() 文本顏色函數(shù)
功能: 函數(shù)textcolor()設(shè)置字符屏幕下文本顏色(或字符顏色),它也可以用于使字符閃爍.
用法: 這個函數(shù)調(diào)用方式為void textcolor(int color);
說明: 函數(shù)中參數(shù)color的有效值可取表1-3中的顏色名(即宏名)或等價(jià)值.
表1-3 顏色名與等價(jià)值
---------------------------------------------------
名 等價(jià)值 含 義
BLACK 0 黑
BLUE 1 藍(lán)
GREEN 2 綠
CYAN 3 青
RED 4 紅
MAGENTA 5 洋紅
BROWN 6 棕
LIGHTGRAY 7 淡灰
DRAKGRAY 8 深灰
LIGHTBLUE 9 淡藍(lán)
LIGHTGREEN 10 淡綠
LIGHTCYAN 11 淡青
LIGHTRED 12 淡紅
LIGHTMAGENTA 13 淡洋紅
YELLOW 14 黃
WHITE 15 白
BLINK 128 閃爍
------------------------------------------------------------
textcolor()函數(shù)執(zhí)行后,只影響其后輸出探險(xiǎn)符顏色,而不改變已經(jīng)在當(dāng)前屏幕上的其它字符顏色.顯然,如果需要輸出的字符閃爍,只要將函數(shù)中參數(shù)color取為BLINK即可,如果要使字符帶顏色閃爍,就必須將所選的顏色值與128作"或"運(yùn)算.
此函數(shù)相應(yīng)的頭文件是 conio.h
返回值: 無
例: 下面程序段中第一條語句使輸出的字符閃爍,第三條語句使字符輸出為經(jīng)色同時(shí)閃爍:
textcolor(BLINK);
printf("hello");
textcolor(RED|BLINK);
15. textattr() 文本屬性函數(shù)
功能: 函數(shù)textattr()用于設(shè)置文本屬性,即字符背景顏色,字符本身顏色和字符閃爍與否.
用法: 函數(shù)調(diào)用方式為void textattr(int attribute);
說明: 設(shè)置字符背景顏色屬性字節(jié)的最簡單方法是,用所選的背景顏色值乘以16再與字符顏色值作按位或(OR)運(yùn)算.例如需要紅色背景,綠色字符,就設(shè)置成RED*16|GREEN,若還要字符閃爍,就把背景顏色值,字符顏色值與閃爍值一起
按位作或運(yùn)算.如藍(lán)背景,黃字符且閃爍,就設(shè)置成為:
YELLO|128|BLUE*16
第0位用于設(shè)置字符顏色.
此函數(shù)相應(yīng)的頭文件為conio.h
返回值: 無
例: 設(shè)置背景為藍(lán)色,字符為紅色并且字符閃爍:
textattr(RED|128|BLUE*16);
16.textbackground() 文本背景函數(shù)
功能: 函數(shù)textbackground()設(shè)置字符屏幕下文本背景顏色(或字符背景顏色).
用法: 此函數(shù)調(diào)用方式為void textbackground(int bcolor);
說明: 參數(shù)bcolor 的有效值取表1-4背景顏色(即宏名)或等價(jià)值.
表1-4 背景顏色與等價(jià)值
-------------------------------------------------
背景顏色 等價(jià)值 含 義
-------------------------------------------------
BLACK 0 黑
BLUE 1 藍(lán)
GREEN 2 綠
CYAN 3 青
RED 4 紅
MAGENTA 5 洋紅
BROWN 6 棕
-------------------------------------------------
調(diào)用該函數(shù)只影響后續(xù)寫的字符背景顏色,而不改變當(dāng)前顯示在屏幕上的字符背景顏色.
這個函數(shù)對應(yīng)的頭文件是conio.h
返回值: 無
例: 設(shè)置文本背景顏色為藍(lán)色:
textbackground(BLUE));
三, 屏顯狀態(tài)函數(shù)
這里提供三個在文本模式下屏幕顯示狀態(tài)的函數(shù)
17. wherex() 光標(biāo)處x坐標(biāo)函數(shù)
功能: 函數(shù)wherex()返回當(dāng)前窗口中光標(biāo)處橫向坐標(biāo).
用法: 此函數(shù)調(diào)用方式為int wherex(void);
說明: 這個函數(shù)調(diào)用無參數(shù),其對應(yīng)的頭文件是conio.h
返回值: 函數(shù)調(diào)用成功,返回光標(biāo)處x坐標(biāo)值.
例: 調(diào)用這個函數(shù)的實(shí)例見18.wherey()函數(shù)的例中.
18. wherey() 光標(biāo)處y坐標(biāo)函數(shù)
功能: 函數(shù)wherey()返回當(dāng)前窗口中光標(biāo)處縱向坐標(biāo).
用法: 該函數(shù)調(diào)用方式為int wherey(void);
說明: 此函數(shù)調(diào)用無參數(shù),其相應(yīng)的頭文件是conio.h
返回值: 函數(shù)調(diào)用成功,返回光標(biāo)處y坐標(biāo)值.
例: 調(diào)作函數(shù)wherex()與wherey(),返回當(dāng)前光標(biāo)處x坐標(biāo)與y坐標(biāo),并賦給整型變量xpos ,ypos.
int xpos,ypos;
xpos=wherex();
ypos=wherey();
19. gettextinfo() 獲取文本窗口信息函數(shù)
功能: 函數(shù)gettextinfo()獲取當(dāng)前文本窗口信息,并存放在實(shí)參結(jié)構(gòu)中.
用法: 函數(shù)調(diào)用方式為void gettextinfo(struct text-info *info);
說明: 函數(shù)中參數(shù)info 為struct text-info結(jié)構(gòu)型指針,struct text-info結(jié)構(gòu)在此函數(shù)相應(yīng)的頭文件中定義為:
struct text-info{
unsigned char winleft; // 窗口左上角x坐標(biāo)
unsigned char wintop; // 窗口左上角y坐標(biāo)
unsigned char winright; // 窗口右下角x坐標(biāo)
unsigned char winbottom; // 窗口右下角y坐標(biāo)
unsigned char attribute; // 文本屬性
unsigned char normattr; // 正常屬性
unsigned char currmode; // 當(dāng)前屏顯模式
unsigned char screenhight // 文本窗口高度(以行數(shù)計(jì))
unsigned char screenwidth; // 文本窗口寬度(以字符個數(shù)計(jì))
unsigned char curx; // 光標(biāo)處x坐標(biāo)
unsigned char cury; // 光標(biāo)處y坐標(biāo)
};
記住,調(diào)用函數(shù)gettextinfo()時(shí),要傳遞struct text-info結(jié)構(gòu)型指針或該結(jié)構(gòu)的首地址,不要傳遞結(jié)構(gòu)變量本身.
這個函數(shù)對應(yīng)的頭文件是conio.h
返回值: 返回文本窗口角點(diǎn)坐標(biāo),高寬度,文本屬性等值,并存放在info所指向的結(jié)構(gòu)變量中.
例: 程序語句說明如何正確調(diào)用gettextinfo()函數(shù):
struct text-info win-status;
gettextinfo(&win-status)