十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
圖形和圖像函數(shù)包含在graphics.h里面(一) 像素函數(shù)56. putpiel() 畫(huà)像素點(diǎn)函數(shù)57. getpixel()返回像素色函數(shù)(二) 直線和線型函數(shù)58. line() 畫(huà)線函數(shù)59. lineto() 畫(huà)線函數(shù)60. linerel() 相對(duì)畫(huà)線函數(shù)61. setlinestyle() 設(shè)置線型函數(shù)62. getlinesettings() 獲取線型設(shè)置函數(shù)63. setwritemode() 設(shè)置畫(huà)線模式函數(shù)(三)、多邊形函數(shù)64. rectangle() 畫(huà)矩形函數(shù)65. bar() 畫(huà)條函數(shù)66. bar3d() 畫(huà)條塊函數(shù)67. drawpoly() 畫(huà)多邊形函數(shù)(四)、 圓、弧和曲線函數(shù)68. getaspectratio()獲取縱橫比函數(shù)69. circle()畫(huà)圓函數(shù)70. arc() 畫(huà)圓弧函數(shù)71. ellipse()畫(huà)橢圓弧函數(shù)72. fillellipse() 畫(huà)橢圓區(qū)函數(shù)73. pieslice() 畫(huà)扇區(qū)函數(shù)74. sector() 畫(huà)橢圓扇區(qū)函數(shù)75. getarccoords()獲取圓弧坐標(biāo)函數(shù)(五)、 填充函數(shù)76. setfillstyle() 設(shè)置填充圖樣和顏色函數(shù)77. setfillpattern() 設(shè)置用戶圖樣函數(shù)78. floodfill() 填充閉域函數(shù)79. fillpoly() 填充多邊形函數(shù)80. getfillsettings() 獲取填充設(shè)置函數(shù)81. getfillpattern() 獲取用戶圖樣設(shè)置函數(shù)(六)、圖像函數(shù)82. imagesize() 圖像存儲(chǔ)大小函數(shù)83. getimage() 保存圖像函數(shù)84. putimage() 輸出圖像函數(shù)四、圖形和圖像函數(shù)對(duì)許多圖形應(yīng)用程序,直線和曲線是非常有用的。但對(duì)有些圖形只能靠操作單個(gè)像素才能畫(huà)出。當(dāng)然如果沒(méi)有畫(huà)像素的功能,就無(wú)法操作直線和曲線的函數(shù)。而且通過(guò)大規(guī)模使用像素功能,整個(gè)圖形就可以保存、寫(xiě)、擦除和與屏幕上的原有圖形進(jìn)行疊加。(一) 像素函數(shù)56. putpixel() 畫(huà)像素點(diǎn)函數(shù)功能: 函數(shù)putpixel() 在圖形模式下屏幕上畫(huà)一個(gè)像素點(diǎn)。用法: 函數(shù)調(diào)用方式為void putpixel(int x,int y,int color);說(shuō)明: 參數(shù)x,y為像素點(diǎn)的坐標(biāo),color是該像素點(diǎn)的顏色,它可以是顏色符號(hào)名,也可以是整型色彩值。此函數(shù)相應(yīng)的頭文件是graphics.h返回值: 無(wú)例: 在屏幕上(6,8)處畫(huà)一個(gè)紅色像素點(diǎn):putpixel(6,8,RED);57. getpixel()返回像素色函數(shù)功能: 函數(shù)getpixel()返回像素點(diǎn)顏色值。用法: 該函數(shù)調(diào)用方式為int getpixel(int x,int y);說(shuō)明: 參數(shù)x,y為像素點(diǎn)坐標(biāo)。函數(shù)的返回值可以不反映實(shí)際彩色值,這取決于調(diào)色板的設(shè)置情況(參見(jiàn)setpalette()函數(shù))。這個(gè)函數(shù)相應(yīng)的頭文件為graphics.h返回值: 返回一個(gè)像素點(diǎn)色彩值。例: 把屏幕上(8,6)點(diǎn)的像素顏色值賦給變量color。color=getpixel(8,6);
旬陽(yáng)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!
分類(lèi)函數(shù),所在函數(shù)庫(kù)為ctype.h
int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否則返回0
int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或數(shù)字('0'-'9')
返回非0值,否則返回0
int isascii(int ch) 若ch是字符(ASCII碼中的0-127)返回非0值,否則返回0
int iscntrl(int ch) 若ch是作廢字符(0x7F)或普通控制字符(0x00-0x1F)
返回非0值,否則返回0
int isdigit(int ch) 若ch是數(shù)字('0'-'9')返回非0值,否則返回0
int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否則返回0
int islower(int ch) 若ch是小寫(xiě)字母('a'-'z')返回非0值,否則返回0
int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否則返回0
int ispunct(int ch) 若ch是標(biāo)點(diǎn)字符(0x00-0x1F)返回非0值,否則返回0
int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回車(chē)符('\r'),
走紙換行('\f'),垂直制表符('\v'),換行符('\n')
返回非0值,否則返回0
int isupper(int ch) 若ch是大寫(xiě)字母('A'-'Z')返回非0值,否則返回0
int isxdigit(int ch) 若ch是16進(jìn)制數(shù)('0'-'9','A'-'F','a'-'f')返回非0值,
否則返回0
int tolower(int ch) 若ch是大寫(xiě)字母('A'-'Z')返回相應(yīng)的小寫(xiě)字母('a'-'z')
int toupper(int ch) 若ch是小寫(xiě)字母('a'-'z')返回相應(yīng)的大寫(xiě)字母('A'-'Z')
數(shù)學(xué)函數(shù),所在函數(shù)庫(kù)為math.h、stdlib.h、string.h、float.h
int abs(int i) 返回整型參數(shù)i的絕對(duì)值
double cabs(struct complex znum) 返回復(fù)數(shù)znum的絕對(duì)值
double fabs(double x) 返回雙精度參數(shù)x的絕對(duì)值
long labs(long n) 返回長(zhǎng)整型參數(shù)n的絕對(duì)值
double exp(double x) 返回指數(shù)函數(shù)ex的值
double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存貯在eptr中
double ldexp(double value,int exp); 返回value*2exp的值
double log(double x) 返回logex的值
double log10(double x) 返回log10x的值
double pow(double x,double y) 返回xy的值
double pow10(int p) 返回10p的值
double sqrt(double x) 返回+√x的值
double acos(double x) 返回x的反余弦cos-1(x)值,x為弧度
double asin(double x) 返回x的反正弦sin-1(x)值,x為弧度
double atan(double x) 返回x的反正切tan-1(x)值,x為弧度
double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x為弧度
double cos(double x) 返回x的余弦cos(x)值,x為弧度
double sin(double x) 返回x的正弦sin(x)值,x為弧度
double tan(double x) 返回x的正切tan(x)值,x為弧度
double cosh(double x) 返回x的雙曲余弦cosh(x)值,x為弧度
double sinh(double x) 返回x的雙曲正弦sinh(x)值,x為弧度
double tanh(double x) 返回x的雙曲正切tanh(x)值,x為弧度
double hypot(double x,double y) 返回直角三角形斜邊的長(zhǎng)度(z),
x和y為直角邊的長(zhǎng)度,z2=x2+y2
double ceil(double x) 返回不小于x的最小整數(shù)
double floor(double x) 返回不大于x的最大整數(shù)
void srand(unsigned seed) 初始化隨機(jī)數(shù)發(fā)生器
int rand() 產(chǎn)生一個(gè)隨機(jī)數(shù)并返回這個(gè)數(shù)
double poly(double x,int n,double c[])從參數(shù)產(chǎn)生一個(gè)多項(xiàng)式
double modf(double value,double *iptr)將雙精度數(shù)value分解成尾數(shù)和階
double fmod(double x,double y) 返回x/y的余數(shù)
double frexp(double value,int *eptr) 將雙精度數(shù)value分成尾數(shù)和階
double atof(char *nptr) 將字符串nptr轉(zhuǎn)換成浮點(diǎn)數(shù)并返回這個(gè)浮點(diǎn)數(shù)
double atoi(char *nptr) 將字符串nptr轉(zhuǎn)換成整數(shù)并返回這個(gè)整數(shù)
double atol(char *nptr) 將字符串nptr轉(zhuǎn)換成長(zhǎng)整數(shù)并返回這個(gè)整數(shù)
char *ecvt(double value,int ndigit,int *decpt,int *sign)
將浮點(diǎn)數(shù)value轉(zhuǎn)換成字符串并返回該字符串
char *fcvt(double value,int ndigit,int *decpt,int *sign)
將浮點(diǎn)數(shù)value轉(zhuǎn)換成字符串并返回該字符串
char *gcvt(double value,int ndigit,char *buf)
將數(shù)value轉(zhuǎn)換成字符串并存于buf中,并返回buf的指針
char *ultoa(unsigned long value,char *string,int radix)
將無(wú)符號(hào)整型數(shù)value轉(zhuǎn)換成字符串并返回該字符串,radix為轉(zhuǎn)換時(shí)所用基數(shù)
char *ltoa(long value,char *string,int radix)
將長(zhǎng)整型數(shù)value轉(zhuǎn)換成字符串并返回該字符串,radix為轉(zhuǎn)換時(shí)所用基數(shù)
char *itoa(int value,char *string,int radix)
將整數(shù)value轉(zhuǎn)換成字符串存入string,radix為轉(zhuǎn)換時(shí)所用基數(shù)
double atof(char *nptr) 將字符串nptr轉(zhuǎn)換成雙精度數(shù),并返回這個(gè)數(shù),錯(cuò)誤返回0
int atoi(char *nptr) 將字符串nptr轉(zhuǎn)換成整型數(shù), 并返回這個(gè)數(shù),錯(cuò)誤返回0
long atol(char *nptr) 將字符串nptr轉(zhuǎn)換成長(zhǎng)整型數(shù),并返回這個(gè)數(shù),錯(cuò)誤返回0
double strtod(char *str,char **endptr)將字符串str轉(zhuǎn)換成雙精度數(shù),并返回這個(gè)數(shù),
long strtol(char *str,char **endptr,int base)將字符串str轉(zhuǎn)換成長(zhǎng)整型數(shù),
并返回這個(gè)數(shù),
int matherr(struct exception *e)
用戶修改數(shù)學(xué)錯(cuò)誤返回信息函數(shù)(沒(méi)有必要使用)
double _matherr(_mexcep why,char *fun,double *arg1p,
double *arg2p,double retval)
用戶修改數(shù)學(xué)錯(cuò)誤返回信息函數(shù)(沒(méi)有必要使用)
unsigned int _clear87() 清除浮點(diǎn)狀態(tài)字并返回原來(lái)的浮點(diǎn)狀態(tài)
void _fpreset() 重新初使化浮點(diǎn)數(shù)學(xué)程序包
unsigned int _status87() 返回浮點(diǎn)狀態(tài)字
int chdir(char *path) 使指定的目錄path(如:"C:\\WPS")變成當(dāng)前的工作目錄,成
功返回0
int findfirst(char *pathname,struct ffblk *ffblk,int attrib)查找指定的文件,成功
返回0
pathname為指定的目錄名和文件名,如"C:\\WPS\\TXT"
ffblk為指定的保存文件信息的一個(gè)結(jié)構(gòu),定義如下:
┏━━━━━━━━━━━━━━━━━━━━┓
┃struct ffblk ┃
┃{ ┃
┃ char ff_reserved[21]; /*DOS保留字*/ ┃
┃ char ff_attrib; /*文件屬性*/ ┃
┃ int ff_ftime; /*文件時(shí)間*/ ┃
┃ int ff_fdate; /*文件日期*/ ┃
┃ long ff_fsize; /*文件長(zhǎng)度*/ ┃
┃ char ff_name[13]; /*文件名*/ ┃
┃} ┃
┗━━━━━━━━━━━━━━━━━━━━━┛
attrib為文件屬性,由以下字符代表
┏━━━━━━━━━┳━━━━━━━━━┓
┃FA_RDONLY 只讀文件┃FA_LABEL 卷標(biāo)號(hào) ┃
┃FA_HIDDEN 隱藏文件┃FA_DIREC 目錄 ┃
┃FA_SYSTEM 系統(tǒng)文件┃FA_ARCH 檔案 ┃
┗━━━━━━━━━┻━━━━━━━━━┛
例:
struct ffblk ff;
findfirst("*.wps",ff,FA_RDONLY);
int findnext(struct ffblk *ffblk) 取匹配finddirst的文件,成功返回0
void fumerge(char *path,char *drive,char *dir,char *name,char *ext)
此函數(shù)通過(guò)盤(pán)符drive(C:、A:等),路徑dir(\TC、\BC\LIB等),
文件名name(TC、WPS等),擴(kuò)展名ext(.EXE、.COM等)組成一個(gè)文件名
存與path中.
int fnsplit(char *path,char *drive,char *dir,char *name,char *ext)
此函數(shù)將文件名path分解成盤(pán)符drive(C:、A:等),路徑dir(\TC、\BC\LIB等),
文件名name(TC、WPS等),擴(kuò)展名ext(.EXE、.COM等),并分別存入相應(yīng)的變量中.
int getcurdir(int drive,char *direc) 此函數(shù)返回指定驅(qū)動(dòng)器的當(dāng)前工作目錄名稱(chēng)
drive 指定的驅(qū)動(dòng)器(0=當(dāng)前,1=A,2=B,3=C等)
direc 保存指定驅(qū)動(dòng)器當(dāng)前工作路徑的變量 成功返回0
char *getcwd(char *buf,iint n) 此函數(shù)取當(dāng)前工作目錄并存入buf中,直到n個(gè)字
節(jié)長(zhǎng)為為止.錯(cuò)誤返回NULL
int getdisk() 取當(dāng)前正在使用的驅(qū)動(dòng)器,返回一個(gè)整數(shù)(0=A,1=B,2=C等)
int setdisk(int drive) 設(shè)置要使用的驅(qū)動(dòng)器drive(0=A,1=B,2=C等),
返回可使用驅(qū)動(dòng)器總數(shù)
int mkdir(char *pathname) 建立一個(gè)新的目錄pathname,成功返回0
int rmdir(char *pathname) 刪除一個(gè)目錄pathname,成功返回0
char *mktemp(char *template) 構(gòu)造一個(gè)當(dāng)前目錄上沒(méi)有的文件名并存于template中
char *searchpath(char *pathname) 利用MSDOS找出文件filename所在路徑,
,此函數(shù)使用DOS的PATH變量,未找到文件返回NULL
進(jìn)程函數(shù),所在函數(shù)庫(kù)為stdlib.h、process.h
void abort() 此函數(shù)通過(guò)調(diào)用具有出口代碼3的_exit寫(xiě)一個(gè)終止信息于stderr,
并異常終止程序。無(wú)返回值
int exec…裝入和運(yùn)行其它程序
int execl( char *pathname,char *arg0,char *arg1,…,char *argn,NULL)
int execle( char *pathname,char *arg0,char *arg1,…,
char *argn,NULL,char *envp[])
int execlp( char *pathname,char *arg0,char *arg1,…,NULL)
int execlpe(char *pathname,char *arg0,char *arg1,…,NULL,char *envp[])
int execv( char *pathname,char *argv[])
int execve( char *pathname,char *argv[],char *envp[])
int execvp( char *pathname,char *argv[])
int execvpe(char *pathname,char *argv[],char *envp[])
exec函數(shù)族裝入并運(yùn)行程序pathname,并將參數(shù)
arg0(arg1,arg2,argv[],envp[])傳遞給子程序,出錯(cuò)返回-1
在exec函數(shù)族中,后綴l、v、p、e添加到exec后,
所指定的函數(shù)將具有某種操作能力
有后綴 p時(shí),函數(shù)可以利用DOS的PATH變量查找子程序文件。
l時(shí),函數(shù)中被傳遞的參數(shù)個(gè)數(shù)固定。
v時(shí),函數(shù)中被傳遞的參數(shù)個(gè)數(shù)不固定。
e時(shí),函數(shù)傳遞指定參數(shù)envp,允許改變子進(jìn)程的環(huán)境,
無(wú)后綴e時(shí),子進(jìn)程使用當(dāng)前程序的環(huán)境。
void _exit(int status)終止當(dāng)前程序,但不清理現(xiàn)場(chǎng)
void exit(int status) 終止當(dāng)前程序,關(guān)閉所有文件,寫(xiě)緩沖區(qū)的輸出(等待輸出),
并調(diào)用任何寄存器的"出口函數(shù)",無(wú)返回值
int spawn…運(yùn)行子程序
int spawnl( int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL)
int spawnle( int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL,char *envp[])
int spawnlp( int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL)
int spawnlpe(int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL,char *envp[])
int spawnv( int mode,char *pathname,char *argv[])
int spawnve( int mode,char *pathname,char *argv[],char *envp[])
int spawnvp( int mode,char *pathname,char *argv[])
int spawnvpe(int mode,char *pathname,char *argv[],char *envp[])
spawn函數(shù)族在mode模式下運(yùn)行子程序pathname,并將參數(shù)
arg0(arg1,arg2,argv[],envp[])傳遞給子程序.出錯(cuò)返回-1
mode為運(yùn)行模式
mode為 P_WAIT 表示在子程序運(yùn)行完后返回本程序
P_NOWAIT 表示在子程序運(yùn)行時(shí)同時(shí)運(yùn)行本程序(不可用)
P_OVERLAY表示在本程序退出后運(yùn)行子程序
在spawn函數(shù)族中,后綴l、v、p、e添加到spawn后,
所指定的函數(shù)將具有某種操作能力
有后綴 p時(shí), 函數(shù)利用DOS的PATH查找子程序文件
l時(shí), 函數(shù)傳遞的參數(shù)個(gè)數(shù)固定.
v時(shí), 函數(shù)傳遞的參數(shù)個(gè)數(shù)不固定.
e時(shí), 指定參數(shù)envp可以傳遞給子程序,允許改變子程序運(yùn)行環(huán)境.
當(dāng)無(wú)后綴e時(shí),子程序使用本程序的環(huán)境.
int system(char *command) 將MSDOS命令command傳遞給DOS執(zhí)行
轉(zhuǎn)換子程序,函數(shù)庫(kù)為math.h、stdlib.h、ctype.h、float.h
char *ecvt(double value,int ndigit,int *decpt,int *sign)
將浮點(diǎn)數(shù)value轉(zhuǎn)換成字符串并返回該字符串
char *fcvt(double value,int ndigit,int *decpt,int *sign)
將浮點(diǎn)數(shù)value轉(zhuǎn)換成字符串并返回該字符串
char *gcvt(double value,int ndigit,char *buf)
將數(shù)value轉(zhuǎn)換成字符串并存于buf中,并返回buf的指針
char *ultoa(unsigned long value,char *string,int radix)
將無(wú)符號(hào)整型數(shù)value轉(zhuǎn)換成字符串并返回該字符串,radix為轉(zhuǎn)換時(shí)所用基數(shù)
char *ltoa(long value,char *string,int radix)
將長(zhǎng)整型數(shù)value轉(zhuǎn)換成字符串并返回該字符串,radix為轉(zhuǎn)換時(shí)所用基數(shù)
char *itoa(int value,char *string,int radix)
將整數(shù)value轉(zhuǎn)換成字符串存入string,radix為轉(zhuǎn)換時(shí)所用基數(shù)
double atof(char *nptr) 將字符串nptr轉(zhuǎn)換成雙精度數(shù),并返回這個(gè)數(shù),錯(cuò)誤返回0
int atoi(char *nptr) 將字符串nptr轉(zhuǎn)換成整型數(shù), 并返回這個(gè)數(shù),錯(cuò)誤返回0
long atol(char *nptr) 將字符串nptr轉(zhuǎn)換成長(zhǎng)整型數(shù),并返回這個(gè)數(shù),錯(cuò)誤返回0
double strtod(char *str,char **endptr)將字符串str轉(zhuǎn)換成雙精度數(shù),并返回這個(gè)數(shù),
long strtol(char *str,char **endptr,int base)將字符串str轉(zhuǎn)換成長(zhǎng)整型數(shù),
并返回這個(gè)數(shù),
int toascii(int c) 返回c相應(yīng)的ASCII
int tolower(int ch) 若ch是大寫(xiě)字母('A'-'Z')返回相應(yīng)的小寫(xiě)字母('a'-'z')
int _tolower(int ch) 返回ch相應(yīng)的小寫(xiě)字母('a'-'z')
int toupper(int ch) 若ch是小寫(xiě)字母('a'-'z')返回相應(yīng)的大寫(xiě)字母('A'-'Z')
int _toupper(int ch) 返回ch相應(yīng)的大寫(xiě)字母('A'-'Z')
診斷函數(shù),所在函數(shù)庫(kù)為assert.h、math.h
void assert(int test) 一個(gè)擴(kuò)展成if語(yǔ)句那樣的宏,如果test測(cè)試失敗,
就顯示一個(gè)信息并異常終止程序,無(wú)返回值
void perror(char *string) 本函數(shù)將顯示最近一次的錯(cuò)誤信息,格式如下:
字符串string:錯(cuò)誤信息
char *strerror(char *str) 本函數(shù)返回最近一次的錯(cuò)誤信息,格式如下:
字符串str:錯(cuò)誤信息
int matherr(struct exception *e)
用戶修改數(shù)學(xué)錯(cuò)誤返回信息函數(shù)(沒(méi)有必要使用)
double _matherr(_mexcep why,char *fun,double *arg1p,
double *arg2p,double retval)
用戶修改數(shù)學(xué)錯(cuò)誤返回信息函數(shù)(沒(méi)有必要使用)
圖形函數(shù) 1. 圖形模式的初始化
不同的顯示器適配器有不同的圖形分辨率。即是同一顯示器適配器, 在不同
模式下也有不同分辨率。因此, 在屏幕作圖之前, 必須根據(jù)顯示器適配器種類(lèi)將
顯示器設(shè)置成為某種圖形模式, 在未設(shè)置圖形模式之前, 微機(jī)系統(tǒng)默認(rèn)屏幕為文
本模式(80列, 25行字符模式), 此時(shí)所有圖形函數(shù)均不能工作。設(shè)置屏幕為圖形
模式, 可用下列圖形初始化函數(shù):
void far initgraph(int far *gdriver, int far *gmode, char *path);
其中g(shù)driver和gmode分別表示圖形驅(qū)動(dòng)器和模式, path是指圖形驅(qū)動(dòng)程序所
在的目錄路徑。有關(guān)圖形驅(qū)動(dòng)器、圖形模式的符號(hào)常數(shù)及對(duì)應(yīng)的分辨率見(jiàn)表2。
圖形驅(qū)動(dòng)程序由Turbo C出版商提供, 文件擴(kuò)展名為.BGI。根據(jù)不同的圖形
適配器有不同的圖形驅(qū)動(dòng)程序。例如對(duì)于EGA、 VGA 圖形適配器就調(diào)用驅(qū)動(dòng)程序
EGAVGA.BGI。 例4. 使用圖形初始化函數(shù)設(shè)置VGA高分辨率圖形模式
#include graphics.h
int main()
{
int gdriver, gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(gdriver, gmode, "c:\\tc");
bar3d(100, 100, 300, 250, 50, 1); /*畫(huà)一長(zhǎng)方體*/
getch();
closegraph();
return 0;
}
有時(shí)編程者并不知道所用的圖形顯示器適配器種類(lèi), 或者需要將編寫(xiě)的程序
用于不同圖形驅(qū)動(dòng)器, Turbo C提供了一個(gè)自動(dòng)檢測(cè)顯示器硬件的函數(shù), 其調(diào)用
格式為:
void far detectgraph(int *gdriver, *gmode);
其中g(shù)driver和gmode的意義與上面相同。
例5. 自動(dòng)進(jìn)行硬件測(cè)試后進(jìn)行圖形初始化
#include graphics.h
int main()
{
int gdriver, gmode;
detectgraph(gdriver, gmode); /*自動(dòng)測(cè)試硬件*/
printf("the graphics driver is %d, mode is %d\n", gdriver,
gmode); /*輸出測(cè)試結(jié)果*/
getch();
initgraph(gdriver, gmode, "c:\\tc");
/* 根據(jù)測(cè)試結(jié)果初始化圖形*/
bar3d(10, 10, 130, 250, 20, 1);
getch();
closegraph();
return 0;
}
上例程序中先對(duì)圖形顯示器自動(dòng)檢測(cè), 然后再用圖形初始化函數(shù)進(jìn)行初始化
設(shè)置, 但Turbo C提供了一種更簡(jiǎn)單的方法, 即用gdriver= DETECT 語(yǔ)句后再跟
initgraph()函數(shù)就行了。采用這種方法后, 上例可改為:
例6.
#include graphics.h
int main()
{
int gdriver=DETECT, gmode;
initgraph(gdriver, gmode, "c:\\tc");
bar3d(50, 50, 150, 30, 1);
getch();
closegraph();
return 0;
}
另外, Turbo C提供了退出圖形狀態(tài)的函數(shù)closegraph(), 其調(diào)用格式為:
void far closegraph(void);
調(diào)用該函數(shù)后可退出圖形狀態(tài)而進(jìn)入文本方式(Turbo C 默認(rèn)方式), 并釋放
用于保存圖形驅(qū)動(dòng)程序和字體的系統(tǒng)內(nèi)存。
2. 獨(dú)立圖形運(yùn)行程序的建立
Turbo C對(duì)于用initgraph()函數(shù)直接進(jìn)行的圖形初始化程序, 在編譯和鏈接
時(shí)并沒(méi)有將相應(yīng)的驅(qū)動(dòng)程序(*.BGI)裝入到執(zhí)行程序, 當(dāng)程序進(jìn)行到intitgraph()
語(yǔ)句時(shí), 再?gòu)脑摵瘮?shù)中第三個(gè)形式參數(shù)char *path中所規(guī)定的路徑中去找相應(yīng)的
驅(qū)動(dòng)程序。若沒(méi)有驅(qū)動(dòng)程序, 則在C:\TC中去找, 如C:\TC中仍沒(méi)有或TC不存在,
將會(huì)出現(xiàn)錯(cuò)誤:
BGI Error: Graphics not initialized (use 'initgraph')
因此, 為了使用方便, 應(yīng)該建立一個(gè)不需要驅(qū)動(dòng)程序就能獨(dú)立運(yùn)行的可執(zhí)行
圖形程序,Turbo C中規(guī)定用下述步驟(這里以EGA、VGA顯示器為例):
1. 在C:\TC子目錄下輸入命令:BGIOBJ EGAVGA
此命令將驅(qū)動(dòng)程序EGAVGA.BGI轉(zhuǎn)換成EGAVGA.OBJ的目標(biāo)文件。
2. 在C:\TC子目錄下輸入命令:TLIB LIB\GRAPHICS.LIB+EGAVGA
此命令的意思是將EGAVGA.OBJ的目標(biāo)模塊裝到GRAPHICS.LIB庫(kù)文件中。
3. 在程序中initgraph()函數(shù)調(diào)用之前加上一句:
registerbgidriver(EGAVGA_driver):
該函數(shù)告訴連接程序在連接時(shí)把EGAVGA的驅(qū)動(dòng)程序裝入到用戶的執(zhí)行程序中。
經(jīng)過(guò)上面處理,編譯鏈接后的執(zhí)行程序可在任何目錄或其它兼容機(jī)上運(yùn)行。
假設(shè)已作了前兩個(gè)步驟,若再向例6中加 registerbgidriver()函數(shù)則變成:
例7:
#includestdio.h
#includegraphics.h
int main()
{
int gdriver=DETECT,gmode;
registerbgidriver(EGAVGA_driver): / *建立獨(dú)立圖形運(yùn)行程序 */
initgraph( gdriver, gmode,"c:\\tc");
bar3d(50,50,250,150,20,1);
getch();
closegraph();
return 0;
}
上例編譯鏈接后產(chǎn)生的執(zhí)行程序可獨(dú)立運(yùn)行。
如不初始化成EGA或CGA分辨率, 而想初始化為CGA分辨率, 則只需要將上述
步驟中有EGAVGA的地方用CGA代替即可。
3.屏幕顏色的設(shè)置和清屏函數(shù)
對(duì)于圖形模式的屏幕顏色設(shè)置, 同樣分為背景色的設(shè)置和前景色的設(shè)置。在
Turbo C中分別用下面兩個(gè)函數(shù)。
設(shè)置背景色: void far setbkcolor( int color);
設(shè)置作圖色: void far setcolor(int color);
其中color 為圖形方式下顏色的規(guī)定數(shù)值, 對(duì)EGA, VGA顯示器適配器, 有關(guān)
顏色的符號(hào)常數(shù)及數(shù)值見(jiàn)下表所示。
表3 有關(guān)屏幕顏色的符號(hào)常數(shù)表
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
符號(hào)常數(shù) 數(shù)值 含義 符號(hào)常數(shù) 數(shù)值 含義
———————————————————————————————————
BLACK 0 黑色 DARKGRAY 8 深灰
BLUE 1 蘭色 LIGHTBLUE 9 深蘭
GREEN 2 綠色 LIGHTGREEN 10 淡綠
CYAN 3 青色 LIGHTCYAN 11 淡青
RED 4 紅色 LIGHTRED 12 淡紅
MAGENTA 5 洋紅 LIGHTMAGENTA 13 淡洋紅
BROWN 6 棕色 YELLOW 14 黃色
LIGHTGRAY 7 淡灰 WHITE 15 白色
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
對(duì)于CGA適配器, 背景色可以為表3中16種顏色的一種, 但前景色依賴于不同
的調(diào)色板。共有四種調(diào)色板, 每種調(diào)色板上有四種顏色可供選擇。不同調(diào)色板所
對(duì)應(yīng)的原色見(jiàn)表4。
表4 CGA調(diào)色板與顏色值表
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
調(diào)色板 顏色值
——————————— ——————————————————
符號(hào)常數(shù) 數(shù)值 0 1 2 3
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
C0 0 背景 綠 紅 黃
C1 1 背景 青 洋紅 白
C2 2 背景 淡綠 淡紅 黃
C3 3 背景 淡青 淡洋紅 白
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
清除圖形屏幕內(nèi)容使用清屏函數(shù), 其調(diào)用格式如下:
voide far cleardevice(void);
另外, TURBO C也提供了幾個(gè)獲得現(xiàn)行顏色設(shè)置情況的函數(shù)。
int far getbkcolor(void); 返回現(xiàn)行背景顏色值。
int far getcolor(void); 返回現(xiàn)行作圖顏色值。
int far getmaxcolor(void); 返回最高可用的顏色值。
4. 基本圖形函數(shù)
基本圖形函數(shù)包括畫(huà)點(diǎn), 線以及其它一些基本圖形的函數(shù)。本節(jié)對(duì)這些函數(shù)
作一全面的介紹。
一、畫(huà)點(diǎn)
1. 畫(huà)點(diǎn)函數(shù)
void far putpixel(int x, int y, int color);
該函數(shù)表示有指定的象元畫(huà)一個(gè)按color所確定顏色的點(diǎn)。對(duì)于顏色color的
值可從表3中獲得而對(duì)x, y是指圖形象元的坐標(biāo)。
在圖形模式下, 是按象元來(lái)定義坐標(biāo)的。對(duì)VGA適配器, 它的最高分辨率為
640x480, 其中640為整個(gè)屏幕從左到右所有象元的個(gè)數(shù), 480 為整個(gè)屏幕從上到
下所有象元的個(gè)數(shù)。屏幕的左上角坐標(biāo)為(0, 0), 右下角坐標(biāo)為(639, 479), 水
平方向從左到右為x軸正向, 垂直方向從上到下為y軸正向。TURBO C 的圖形函數(shù)
都是相對(duì)于圖形屏幕坐標(biāo), 即象元來(lái)說(shuō)的。
關(guān)于點(diǎn)的另外一個(gè)函數(shù)是:
int far getpixel(int x, int y);
它獲得當(dāng)前點(diǎn)(x, y)的顏色值。
2. 有關(guān)坐標(biāo)位置的函數(shù)
int far getmaxx(void);
返回x軸的最大值。
int far getmaxy(void);
返回y軸的最大值。
int far getx(void);
返回游標(biāo)在x軸的位置。
void far gety(void);
返回游標(biāo)有y軸的位置。
void far moveto(int x, int y);
移動(dòng)游標(biāo)到(x, y)點(diǎn), 不是畫(huà)點(diǎn), 在移動(dòng)過(guò)程中亦畫(huà)點(diǎn)。
void far moverel(int dx, int dy);
移動(dòng)游標(biāo)從現(xiàn)行位置(x, y)移動(dòng)到(x+dx, y+dy)的位置, 移動(dòng)過(guò)程中不畫(huà)點(diǎn)。
二、畫(huà)線
1. 畫(huà)線函數(shù)
TURBO C提供了一系列畫(huà)線函數(shù), 下面分別敘述:
void far line(int x0, int y0, int x1, int y1);
畫(huà)一條從點(diǎn)(x0, y0)到(x1, y1)的直線。
void far lineto(int x, int y);
畫(huà)一作從現(xiàn)行游標(biāo)到點(diǎn)(x, y)的直線。
void far linerel(int dx, int dy);
畫(huà)一條從現(xiàn)行游標(biāo)(x, y)到按相對(duì)增量確定的點(diǎn)(x+dx, y+dy)的直線。
void far circle(int x, int y, int radius);
以(x, y)為圓心, radius為半徑, 畫(huà)一個(gè)圓。
void far arc(int x, int y, int stangle, int endangle, int radius);
以(x, y)為圓心, radius為半徑, 從stangle開(kāi)始到endangle結(jié)束(用度表示)
畫(huà)一段圓弧線。在TURBO C中規(guī)定x軸正向?yàn)?度, 逆時(shí)針?lè)较蛐D(zhuǎn)一周, 依次為
90, 180, 270和360度(其它有關(guān)函數(shù)也按此規(guī)定, 不再重述)。
void ellipse(int x, int y, int stangle, int endangle, int xradius,
int yradius);
以(x, y)為中心, xradius, yradius為x軸和y軸半徑, 從角stangle 開(kāi)始到
endangle結(jié)束畫(huà)一段橢圓線, 當(dāng)stangle=0, endangle=360時(shí), 畫(huà)出一個(gè)完整的
橢圓。
void far rectangle(int x1, int y1, int x2, inty2);
以(x1, y1)為左上角, (x2, y2)為右下角畫(huà)一個(gè)矩形框。
void far drawpoly(int numpoints, int far *polypoints);
畫(huà)一個(gè)頂點(diǎn)數(shù)為numpoints, 各頂點(diǎn)坐標(biāo)由polypoints 給出的多邊形。
polypoints整型數(shù)組必須至少有2倍頂點(diǎn)數(shù)個(gè)無(wú)素。每一個(gè)頂點(diǎn)的坐標(biāo)都定義為x,
y, 并且x在前。值得注意的是當(dāng)畫(huà)一個(gè)封閉的多邊形時(shí), numpoints 的值取實(shí)際
多邊形的頂點(diǎn)數(shù)加一, 并且數(shù)組polypoints中第一個(gè)和最后一個(gè)點(diǎn)的坐標(biāo)相同。
下面舉一個(gè)用drawpoly()函數(shù)畫(huà)箭頭的例子。
例9:
#includestdlib.h
#includegraphics.h
int main()
{
int gdriver, gmode, i;
int arw[16]={200, 102, 300, 102, 300, 107, 330,
100, 300, 93, 300, 98, 200, 98, 200, 102};
gdriver=DETECT;
registerbgidriver(EGAVGA_driver);
initgraph(gdriver, gmode, "");
setbkcolor(BLUE);
cleardevice();
setcolor(12); /*設(shè)置作圖顏色*/
drawpoly(8, arw); /*畫(huà)一箭頭*/
getch();
closegraph();
return 0;
}
2. 設(shè)定線型函數(shù)
在沒(méi)有對(duì)線的特性進(jìn)行設(shè)定之前, TURBO C用其默認(rèn)值, 即一點(diǎn)寬的實(shí)線,
但TURBO C也提供了可以改變線型的函數(shù)。線型包括:寬度和形狀。其中寬度只有
兩種選擇: 一點(diǎn)寬和三點(diǎn)寬。而線的形狀則有五種。下面介紹有關(guān)線型的設(shè)置函
數(shù)。
void far setlinestyle(int linestyle, unsigned upattern, int
thickness);
該函數(shù)用來(lái)設(shè)置線的有關(guān)信息, 其中l(wèi)inestyle是線形狀的規(guī)定, 見(jiàn)表5。
表5. 有關(guān)線的形狀(linestyle)
━━━━━━━━━━━━━━━━━━━━━━━━━
符號(hào)常數(shù) 數(shù)值 含義
—————————————————————————
SOLID_LINE 0 實(shí)線
DOTTED_LINE 1 點(diǎn)線
CENTER_LINE 2 中心線
DASHED_LINE 3 點(diǎn)畫(huà)線
USERBIT_LINE 4 用戶定義線
━━━━━━━━━━━━━━━━━━━━━━━━━
thickness是線的寬度, 見(jiàn)表6。
表6. 有關(guān)線寬(thickness)
━━━━━━━━━━━━━━━━━━━━━━━━━
符號(hào)常數(shù) 數(shù)值 含義
—————————————————————————
NORM_WIDTH 1 一點(diǎn)寬
THIC_WIDTH 3 三點(diǎn)寬
━━━━━━━━━━━━━━━━━━━━━━━━━
對(duì)于upattern, 只有l(wèi)inestyle選USERBIT_LINE 時(shí)才有意義( 選其它線型,
uppattern取0即可)。此進(jìn)uppattern的16位二進(jìn)制數(shù)的每一位代表一個(gè)象元, 如
果那位為1, 則該象元打開(kāi), 否則該象元關(guān)閉。
void far getlinesettings(struct linesettingstype far *lineinfo);
該函數(shù)將有關(guān)線的信息存放到由lineinfo 指向的結(jié)構(gòu)中, 表中
linesettingstype的結(jié)構(gòu)如下:
struct linesettingstype{
int linestyle;
unsigned upattern;
int thickness;
}
例如下面兩句程序可以讀出當(dāng)前線的特性
struct linesettingstype *info;
getlinesettings(info);
void far setwritemode(int mode);
該函數(shù)規(guī)定畫(huà)線的方式。如果mode=0, 則表示畫(huà)線時(shí)將所畫(huà)位置的原來(lái)信息
覆蓋了(這是TURBO C的默認(rèn)方式)。如果mode=1, 則表示畫(huà)線時(shí)用現(xiàn)在特性的線
與所畫(huà)之處原有的線進(jìn)行異或(XOR)操作, 實(shí)際上畫(huà)出的線是原有線與現(xiàn)在規(guī)定
的線進(jìn)行異或后的結(jié)果。因此, 當(dāng)線的特性不變, 進(jìn)行兩次畫(huà)線操作相當(dāng)于沒(méi)有
畫(huà)線。
有關(guān)線型設(shè)定和畫(huà)線函數(shù)的例子如下所示。
例10.
#includestdlib.h
#includegraphics.h
int main()
{
int gdriver, gmode, i;
gdriver=DETECT;
registerbgidriver(EGAVGA_driver);
initgraph(gdriver, gmode, "");
setbkcolor(BLUE);
cleardevice();
setcolor(GREEN);
circle(320, 240, 98);
setlinestyle(0, 0, 3); /*設(shè)置三點(diǎn)寬實(shí)線*/
setcolor(2);
rectangle(220, 140, 420, 340);
setcolor(WHITE);
setlinestyle(4, 0xaaaa, 1); /*設(shè)置一點(diǎn)寬用戶定義線*/
line(220, 240, 420, 240);
line(320, 140, 320, 340);
getch();
closegraph();
return 0;
}
5. 封閉圖形的填充
填充就是用規(guī)定的顏色和圖模填滿一個(gè)封閉圖形。
一、先畫(huà)輪廓再填充
TURBO C提供了一些先畫(huà)出基本圖形輪廓, 再按規(guī)定圖模和顏色填充整個(gè)封
閉圖形的函數(shù)。在沒(méi)有改變填充方式時(shí), TURBO C以默認(rèn)方式填充。 下面介紹這
些函數(shù)。
void far bar(int x1, int y1, int x2, int y2);
確定一個(gè)以(x1, y1)為左上角, (x2, y2)為右下角的矩形窗口, 再按規(guī)定圖
模和顏色填充。
說(shuō)明: 此函數(shù)不畫(huà)出邊框, 所以填充色為邊框。
void far bar3d(int x1, int y1, int x2, int y2, int depth, int
topflag);
當(dāng)topflag為非0時(shí), 畫(huà)出一個(gè)三維的長(zhǎng)方體。當(dāng)topflag為0時(shí), 三維圖形不
封頂, 實(shí)際上很少這樣使用。
說(shuō)明: bar3d()函數(shù)中, 長(zhǎng)方體第三維的方向不隨任何參數(shù)而變, 即始終為
45度的方向。
void far pieslice(int x, int y, int stangle, int endangle, int
radius);
畫(huà)一個(gè)以(x, y)為圓心, radius為半徑, stangle為起始角度, endangle 為
終止角度的扇形, 再按規(guī)定方式填充。當(dāng)stangle=0, endangle=360 時(shí)變成一個(gè)
實(shí)心圓, 并在圓內(nèi)從圓點(diǎn)沿X軸正向畫(huà)一條半徑。
void far sector(int x, int y, int stanle, intendangle, int
xradius, int yradius);
畫(huà)一個(gè)以(x, y)為圓心分別以xradius, yradius為x軸和y軸半徑, stangle
為起始角, endangle為終止角的橢圓扇形, 再按規(guī)定方式填充。
二、設(shè)定填充方式
TURBO C有四個(gè)與填充方式有關(guān)的函數(shù)。下面分別介紹:
void far setfillstyle(int pattern, int color);
color的值是當(dāng)前屏幕圖形模式時(shí)顏色的有效值。pattern的值及與其等價(jià)的
符號(hào)常數(shù) 除USER_FILL(用戶定義填充式樣)以外, 其它填充式樣均可由setfillstyle()
函數(shù)設(shè)置。當(dāng)選用USER_FILL時(shí), 該函數(shù)對(duì)填充圖模和顏色不作任何改變。 之所
以定義USER_FILL主要因?yàn)樵讷@得有關(guān)填充信息時(shí)用到此項(xiàng)。
void far setfillpattern(char * upattern,int color);
設(shè)置用戶定義的填充圖模的顏色以供對(duì)封閉圖形填充。
其中upattern是一個(gè)指向8個(gè)字節(jié)的指針。這8個(gè)字節(jié)定義了8x8點(diǎn)陣的圖形。
每個(gè)字節(jié)的8位二進(jìn)制數(shù)表示水平8點(diǎn), 8個(gè)字節(jié)表示8行, 然后以此為模型向個(gè)封
閉區(qū)域填充。
void far getfillpattern(char * upattern);
該函數(shù)將用戶定義的填充圖模存入upattern指針指向的內(nèi)存區(qū)域。
void far getfillsetings(struct fillsettingstype far * fillinfo);
獲得現(xiàn)行圖模的顏色并將存入結(jié)構(gòu)指針變量fillinfo中。其中fillsettingstype
結(jié)構(gòu)定義如下:
struct fillsettingstype{
int pattern; /* 現(xiàn)行填充模式 * /
int color; /* 現(xiàn)行填充模式 * /
};
三、任意封閉圖形的填充
截止目前為止, 我們只能對(duì)一些特定形狀的封閉圖形進(jìn)行填充, 但還不能對(duì)
任意封閉圖形進(jìn)行填充。為此, TURBO C 提供了一個(gè)可對(duì)任意封閉圖形填充的函
數(shù), 其調(diào)用格式如下:
void far floodfill(int x, int y, int border);
其中: x, y為封閉圖形內(nèi)的任意一點(diǎn)。border為邊界的顏色, 也就是封閉圖
形輪廓的顏色。調(diào)用了該函數(shù)后, 將用規(guī)定的顏色和圖模填滿整個(gè)封閉圖形。例12:
#includestdlib.h
#includegraphics.h
main()
{
int gdriver, gmode;
strct fillsettingstype save;
gdriver=DETECT;
initgraph(gdriver, gmode, "");
setbkcolor(BLUE);
cleardevice();
setcolor(LIGHTRED);
setlinestyle(0,0,3);
setfillstyle(1,14); /*設(shè)置填充方式*/
bar3d(100,200,400,350,200,1); /*畫(huà)長(zhǎng)方體并填充*/
floodfill(450,300,LIGHTRED); /*填充長(zhǎng)方體另外兩個(gè)面*/
floodfill(250,150, LIGHTRED);
rectanle(450,400,500,450); /*畫(huà)一矩形*/
floodfill(470,420, LIGHTRED); /*填充矩形*/
getch();
closegraph();
}
6. 有關(guān)圖形窗口和圖形屏幕操作函數(shù)
一、圖形窗口操作
象文本方式下可以設(shè)定屏幕窗口一樣, 圖形方式下也可以在屏幕上某一區(qū)域
設(shè)定窗口, 只是設(shè)定的為圖形窗口而已, 其后的有關(guān)圖形操作都將以這個(gè)窗口的
左上角(0,0)作為坐標(biāo)原點(diǎn), 而且可為通過(guò)設(shè)置使窗口之外的區(qū)域?yàn)椴豢山佑|。
這樣, 所有的圖形操作就被限定在窗口內(nèi)進(jìn)行。
void far setviewport(int xl,int yl,int x2, int y2,int clipflag);
設(shè)定一個(gè)以(xl,yl)象元點(diǎn)為左上角, (x2,y2)象元為右下角的圖形窗口, 其
中x1,y1,x2,y2是相對(duì)于整個(gè)屏幕的坐標(biāo)。若clipflag為非0, 則設(shè)定的圖形以外
部分不可接觸, 若clipflag為0, 則圖形窗口以外可以接觸。
void far clearviewport(void);
清除現(xiàn)行圖形窗口的內(nèi)容。
void far getviewsettings(struct viewporttype far * viewport);
獲得關(guān)于現(xiàn)行窗口的信息,并將其存于viewporttype定義的結(jié)構(gòu)變量viewport
中, 其中viewporttype的結(jié)構(gòu)說(shuō)明如下:
struct viewporttype{
int left, top, right, bottom;
int cliplag;
};
二、屏幕操作
除了清屏函數(shù)以外, 關(guān)于屏幕操作還有以下函數(shù):
void far setactivepage(int pagenum);
void far setvisualpage(int pagenum);
這兩個(gè)函數(shù)只用于EGA,VGA 以及HERCULES圖形適配器。setctivepage() 函數(shù)
是為圖形輸出選擇激活頁(yè)。 所謂激活頁(yè)是指后續(xù)圖形的輸出被寫(xiě)到函數(shù)選定的
pagenum頁(yè)面, 該頁(yè)面并不一定可見(jiàn)。setvisualpage()函數(shù)才使pagenum 所指定
的頁(yè)面變成可見(jiàn)頁(yè)。頁(yè)面從0開(kāi)始(Turbo C默認(rèn)頁(yè))。如果先用setactivepage()
函數(shù)在不同頁(yè)面上畫(huà)出一幅幅圖像,再用setvisualpage()函數(shù)交替顯示, 就可以
實(shí)現(xiàn)一些動(dòng)畫(huà)的效果。
void far getimage(int xl,int yl, int x2,int y2, void far *mapbuf);
void far putimge(int x,int,y,void * mapbuf, int op);
unsined far imagesize(int xl,int yl,int x2,int y2);
這三個(gè)函數(shù)用于將屏幕上的圖像復(fù)制到內(nèi)存,然后再將內(nèi)存中的圖像送回到
屏幕上。首先通過(guò)函數(shù)imagesize()測(cè)試要保存左上角為(xl,yl), 右上角為(x2,
y2)的圖形屏幕區(qū)域內(nèi)的全部?jī)?nèi)容需多少個(gè)字節(jié), 然后再給mapbuf 分配一個(gè)所測(cè)
數(shù)字節(jié)內(nèi)存空間的指針。通過(guò)調(diào)用getimage()函數(shù)就可將該區(qū)域內(nèi)的圖像保存在
內(nèi)存中, 需要時(shí)可用putimage()函數(shù)將該圖像輸出到左上角為點(diǎn)(x, y)的位置上,
其中g(shù)etimage()函數(shù)中的參數(shù)op規(guī)定如何釋放內(nèi)存中圖像。
對(duì)于imagesize()函數(shù), 只能返回字節(jié)數(shù)小于64K字節(jié)的圖像區(qū)域, 否則將會(huì)
出錯(cuò), 出錯(cuò)時(shí)返回-1。
本節(jié)介紹的函數(shù)在圖像動(dòng)畫(huà)處理、菜單設(shè)計(jì)技巧中非常有用。
例13: 下面程序模擬兩個(gè)小球動(dòng)態(tài)碰撞過(guò)程。
7. 圖形模式下的文本輸出
在圖形模式下, 只能用標(biāo)準(zhǔn)輸出函數(shù), 如printf(), puts(), putchar() 函
數(shù)輸出文本到屏幕。除此之外, 其它輸出函數(shù)(如窗口輸出函數(shù))不能使用, 即是
可以輸出的標(biāo)準(zhǔn)函數(shù), 也只以前景色為白色, 按80列, 25行的文本方式輸出。
Turbo C2.0也提供了一些專(zhuān)門(mén)用于在圖形顯示模式下的文本輸出函數(shù)。下面
將分別進(jìn)行介紹。
一、文本輸出函數(shù)
void far outtext(char far *textstring);
該函數(shù)輸出字符串指針textstring所指的文本在現(xiàn)行位置。
void far outtextxy(int x, int y, char far *textstring);
該函數(shù)輸出字符串指針textstring所指的文本在規(guī)定的(x, y)位置。 其中x
和y為象元坐標(biāo)。
說(shuō)明:
這兩個(gè)函數(shù)都是輸出字符串, 但經(jīng)常會(huì)遇到輸出數(shù)值或其它類(lèi)型的數(shù)據(jù),
此時(shí)就必須使用格式化輸出函數(shù)sprintf()。
sprintf()函數(shù)的調(diào)用格式為:
int sprintf(char *str, char *format, variable-list);
它與printf()函數(shù)不同之處是將按格式化規(guī)定的內(nèi)容寫(xiě)入str 指向的字符串
中, 返回值等于寫(xiě)入的字符個(gè)數(shù)。
例如:
sprintf(s, "your TOEFL score is %d", mark);
這里s應(yīng)是字符串指針或數(shù)組, mark為整型變量。
framebuffer(幀緩沖)。
幀的最低數(shù)量為24(人肉眼可見(jiàn))(低于24則感覺(jué)到畫(huà)面不流暢)。
顯卡與幀的關(guān)系:由cpu調(diào)節(jié)其數(shù)據(jù)傳輸速率來(lái)輸出其三基色的配比。
三基色:RGB(紅綠藍(lán))。
在沒(méi)有桌面和圖形文件的系統(tǒng)界面,可以通過(guò)C語(yǔ)言的編程來(lái)實(shí)現(xiàn)在黑色背景上畫(huà)圖!
用下面的代碼,在需要的地方(有注釋?zhuān)┻m當(dāng)修改,就能畫(huà)出自己喜歡的圖形!
PS:同樣要編譯運(yùn)行后才能出效果。
#include stdio.h
#include sys/mman.h
#include fcntl.h
#include linux/fb.h
#include stdlib.h
#define RGB888(r,g,b) ((r 0xff) 16 | (g 0xff) 8 | (b 0xff))
#define RGB565(r,g,b) ((r 0x1f) 11 | (g 0x3f) 5 | (b 0x1f))
int main()
{
int fd = open("/dev/fb0", O_RDWR);
if(fd 0){
perror("open err. \n");
exit(EXIT_FAILURE);
printf("xres: %d\n", info.xres);
printf("yres: %d\n", info.yres);
printf("bits_per_pixel: %d\n", info.bits_per_pixel);
size_t len = info.xres*info.yres*info.bits_per_pixel 3;
unsigned long* addr = NULL;
addr = mmap(NULL, len, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
if(addr == (void*)-1){
perror("mmap err. \n");
#includestdio.h
#includegraphics.h
main()
{ int gdriver,gmode;
gdriver=DETECT;
initgraph(gdriver,gmode,"");
setcolor(BLUE);
setfillstyle(1,RED);
pieslice(250,250,0,45,200);
setfillstyle(1,GREEN);
pieslice(250,250,45,90,200);
setfillstyle(1,BLUE);
pieslice(250,250,90,135,200);
setfillstyle(1,CYAN);
pieslice(250,250,135,180,200);
setfillstyle(1,BROWN);
pieslice(250,250,180,225,200);
setfillstyle(1,LIGHTGRAY);
pieslice(250,250,225,270,200);
setfillstyle(1,YELLOW);
pieslice(250,250,270,315,200);
setfillstyle(1,MAGENTA);
pieslice(250,250,315,360,200);
getch();
closegraph();
}
(一) 像素函數(shù)
56. putpiel() 畫(huà)像素點(diǎn)函數(shù)
57. getpixel()返回像素色函數(shù)
(二) 直線和線型函數(shù)
58. line() 畫(huà)線函數(shù)
59. lineto() 畫(huà)線函數(shù)
60. linerel() 相對(duì)畫(huà)線函數(shù)
61. setlinestyle() 設(shè)置線型函數(shù)
62. getlinesettings() 獲取線型設(shè)置函數(shù)
63. setwritemode() 設(shè)置畫(huà)線模式函數(shù)
(三)、多邊形函數(shù)
64. rectangle() 畫(huà)矩形函數(shù)
65. bar() 畫(huà)條函數(shù)
66. bar3d() 畫(huà)條塊函數(shù)
67. drawpoly() 畫(huà)多邊形函數(shù)
(四)、 圓、弧和曲線函數(shù)
68. getaspectratio()獲取縱橫比函數(shù)
69. circle()畫(huà)圓函數(shù)
70. arc() 畫(huà)圓弧函數(shù)
71. ellipse()畫(huà)橢圓弧函數(shù)
72. fillellipse() 畫(huà)橢圓區(qū)函數(shù)
73. pieslice() 畫(huà)扇區(qū)函數(shù)
74. sector() 畫(huà)橢圓扇區(qū)函數(shù)
75. getarccoords()獲取圓弧坐標(biāo)函數(shù)
(五)、 填充函數(shù)
76. setfillstyle() 設(shè)置填充圖樣和顏色函數(shù)
77. setfillpattern() 設(shè)置用戶圖樣函數(shù)
78. floodfill() 填充閉域函數(shù)
79. fillpoly() 填充多邊形函數(shù)
80. getfillsettings() 獲取填充設(shè)置函數(shù)
81. getfillpattern() 獲取用戶圖樣設(shè)置函數(shù)
(六)、圖像函數(shù)
82. imagesize() 圖像存儲(chǔ)大小函數(shù)
83. getimage() 保存圖像函數(shù)
84. putimage() 輸出圖像函數(shù)
四、圖形和圖像函數(shù)
對(duì)許多圖形應(yīng)用程序,直線和曲線是非常有用的。但對(duì)有些圖形只能靠操作單個(gè)像素才能畫(huà)出。當(dāng)然如果沒(méi)有畫(huà)像素的功能,就無(wú)法操作直線和曲線的函數(shù)。而且通過(guò)大規(guī)模使用像素功能,整個(gè)圖形就可以保存、寫(xiě)、擦除和與屏幕上的原有圖形進(jìn)行疊加。
(一) 像素函數(shù)
56. putpixel() 畫(huà)像素點(diǎn)函數(shù)
功能: 函數(shù)putpixel() 在圖形模式下屏幕上畫(huà)一個(gè)像素點(diǎn)。
用法: 函數(shù)調(diào)用方式為void putpixel(int x,int y,int color);
說(shuō)明: 參數(shù)x,y為像素點(diǎn)的坐標(biāo),color是該像素點(diǎn)的顏色,它可以是顏色符號(hào)名,也可以是整型色彩值。
此函數(shù)相應(yīng)的頭文件是graphics.h
返回值: 無(wú)
例: 在屏幕上(6,8)處畫(huà)一個(gè)紅色像素點(diǎn):
putpixel(6,8,RED);
57. getpixel()返回像素色函數(shù)
功能: 函數(shù)getpixel()返回像素點(diǎn)顏色值。
用法: 該函數(shù)調(diào)用方式為int getpixel(int x,int y);
說(shuō)明: 參數(shù)x,y為像素點(diǎn)坐標(biāo)。
函數(shù)的返回值可以不反映實(shí)際彩色值,這取決于調(diào)色板的設(shè)置情況(參見(jiàn)setpalette()函數(shù))。
這個(gè)函數(shù)相應(yīng)的頭文件為graphics.h
返回值: 返回一個(gè)像素點(diǎn)色彩值。
例: 把屏幕上(8,6)點(diǎn)的像素顏色值賦給變量color。
color=getpixel(8,6);
(二) 直線和線型函數(shù)
有三個(gè)畫(huà)直線的函數(shù),即line(),lineto(),linerel()。這些直線使用整型坐標(biāo),并相對(duì)于當(dāng)前圖形視口,但不一定受視口限制,如果視口裁剪標(biāo)志clip為真,那么直線將受到視口邊緣截?cái)?;如果clip為假,即使終點(diǎn)坐標(biāo)或新的當(dāng)前位置在圖形視口或屏幕極限之外,直線截?cái)嗟狡聊粯O限。
有兩種線寬及幾種線型可供選擇,也可以自己定義線圖樣。下面分別介紹直線和線型函數(shù)。
58. line() 畫(huà)線函數(shù)
功能: 函數(shù)line()使用當(dāng)前繪圖色、線型及線寬,在給定的兩點(diǎn)間畫(huà)一直線。
用法: 該函數(shù)調(diào)用方式為void line(int startx,int starty,int endx,int endy);
說(shuō)明: 參數(shù)startx,starty為起點(diǎn)坐標(biāo),endx,endy為終點(diǎn)坐標(biāo),函數(shù)調(diào)用前后,圖形狀態(tài)下屏幕光標(biāo)(一般不可見(jiàn))當(dāng)前位置不改變。
此函數(shù)相應(yīng)的頭文件為graphics.h
返回值: 無(wú)
例: 見(jiàn)函數(shù)60.linerel()中的實(shí)例。
59. lineto() 畫(huà)線函數(shù)
功能: 函數(shù)lineto()使用當(dāng)前繪圖色、線型及線寬,從當(dāng)前位置畫(huà)一直線到指定位置。
用法: 此函數(shù)調(diào)用方式為void lineto(int x,int y);
說(shuō)明: 參數(shù)x,y為指定點(diǎn)的坐標(biāo),函數(shù)調(diào)用后,當(dāng)前位置改變到指定點(diǎn)(x,y)。
該函數(shù)對(duì)應(yīng)的頭文件為graphics.h
返回值: 無(wú)
例: 見(jiàn)函數(shù)60.linerel()中的實(shí)例。
60.linerel() 相對(duì)畫(huà)線函數(shù)
功能: 函數(shù)linerel() 使用當(dāng)前繪圖色、線型及線寬,從當(dāng)前位置開(kāi)始,按指定的水平和垂直偏移距離畫(huà)一直線。
用法: 這個(gè)函數(shù)調(diào)用方式為void linerel(int dx,int dy);
說(shuō)明: 參數(shù)dx,dy分別是水平偏移距離和垂直偏移距離。
函數(shù)調(diào)用后,當(dāng)前位置變?yōu)樵黾悠凭嚯x后的位置,例如,原來(lái)的位置是(8,6),調(diào)用函數(shù)linerel(10,18)后,當(dāng)前位置為(18,24)。
返回值:無(wú)