C語言程序設計課件:文件與圖形_第1頁
C語言程序設計課件:文件與圖形_第2頁
C語言程序設計課件:文件與圖形_第3頁
C語言程序設計課件:文件與圖形_第4頁
C語言程序設計課件:文件與圖形_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

文件與圖形C語言程序設計目錄content文件的基本概念1文件類型指針2文件操作與相關函數3文件函數應用綜合舉例4C語言圖形程序設計基本概念5C語言中的圖形函數6圖形方式下的文本常見操作函數7C語言圖形操作綜合應用舉例8文件文件編碼的方式文件緩沖類型文件:指存放在外部介質上的一組相關數據的有序集合。9.1文件的基本概念

這個數據集有一個名稱,叫做文件名。實際上在前面的各章中我們已經多次使用了文件,例如源程序文件、目標文件、可執(zhí)行文件、庫文件(頭文件)等。

文本文件二進制文件緩沖型文件非緩沖型文件9.1.1文本文件與二進制文件文本文件在磁盤中存放時每個字符對應一個字節(jié),用于存放對應的ASCII碼。例如,數1357在內存中的存儲形式為:在文本文件中的保存形式為:共占用4個字節(jié)。00000101 01001101ASCII:00110001001100110011010100110111對應的↓↓↓↓ 十進制碼:1357文本文件:文本文件可在屏幕上按字符顯示,例如源程序文件就是文本文件,由于是按字符顯示,因此能讀懂文件內容。但一般占存儲空間較多,而且要花費轉換時間。9.1.1文本文件與二進制文件二進制文件:二進制文件是按二進制的編碼方式來存放文件的。例如,數1357的存儲形式為:只占二個字節(jié)。二進制形式輸出數值,可以節(jié)省外存空間和轉換時間,但不便于閱讀。00000101 010011019.1.2緩沖性文件系統(tǒng)

ANSIC語言中把文件的輸入/輸出功能作為標準庫函數的一部分,以提高程序的可移植性。各種C語言系統(tǒng)都遵循ANSIC標準定義了一組完整的標準輸入/輸出操作函數,這組標準輸入/輸出操作函數稱為緩沖性文件系統(tǒng)(BufferedFileSystem)。所謂緩沖性文件系統(tǒng)是指能夠自動地在內存區(qū)為每個正在使用的文件名開辟一個緩沖區(qū)的系統(tǒng)。

1.當從磁盤向內存讀取數據時,首先一次性從磁盤文件中將一批數據讀入內存,再從緩沖區(qū)中逐個將數據送到對應的內存空間中。

2.從內存向磁盤輸出數據時,必須首先輸出到緩沖區(qū)中。待緩沖區(qū)裝滿后,再一起輸出到磁盤文件中。

9.2文件類型指針在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進行各種操作。該結構類型由系統(tǒng)定義,取名FILE,并在stdio.h中定義(#include“stdio.h”):typedefstruct{

intlevel;//緩沖區(qū)“滿”或“空”的程度

unsignedflags;//文件狀態(tài)標志

charfd;//文件描述符號

unsignedcharhold;//如無緩沖區(qū)則不讀取字符串

intbsize;//緩沖區(qū)大小

unsignedchar_FAR*buffer;//數據傳輸緩沖區(qū)指針unsignedchar_FAR*curp;//文件緩沖區(qū)位置unsignedistemp;//臨時文件指示器shorttoken;//用于有效性檢查}FILE;9.2文件類型指針定義說明文件指針的一般形式為:其中FILE應為大寫,它實際上是由系統(tǒng)定義的一個結構,該結構中含有文件名、文件狀態(tài)和文件當前位置等信息。在編寫源程序時不必關心FILE結構的細節(jié)。FILE*指針變量標識符;FILE*fp;表示fp是指向FILE結構的指針變量,通過fp即可找存放某個文件信息的結構變量,然后按結構變量提供的信息找到該文件,實施對文件的操作。習慣上也籠統(tǒng)地把fp稱為指向一個文件的指針。9.3文件操作與相關函數文件處理過程通常要經歷如下三個步驟:打開文件→文件讀/寫→關閉文件文件在進行讀寫操作之前要先打開,使用完畢要關閉。所謂打開文件,實際上是建立文件的各種有關信息,并使文件指針指向該文件,以便進行其它操作。關閉文件則斷開指針與文件之間的聯系,也就禁止再對該文件進行操作。

在C語言中,文件操作都是由庫函數來完成的。在本章內將介紹主要的文件操作函數。9.3.1文件的打開(fopen函數):

fopen函數用來打開一個文件,其函數原形為:其調用的一般形式為:其中,“文件指針名”必須是被說明為FILE類型的指針變量;“文件名”是被打開文件的文件名,為字符串常量或字符串數組;“使用文件方式”是指文件的類型和操作要求。FILE*fopen(constchar*filename,constchar*mode);if((文件指針名=fopen(文件名,使用文件方式))==NULL)9.3.1例9.1文件的打開1FILE*fp;if((fp=("c:\\config.sys","r"))==NULL);其意義是檢查文件指針fp所指向的文件存在否,如果存在,則打開C盤目錄下的config.sys文件,只允許進行“讀”操作,并使fp指向該文件。例9.2文件的打開2FILE*fphzk;If((fphzk=("ccbp.dat","rb"))==NULL);其意義是先檢查文件ccbp.dat文件是否存在,如果存在,則打開當前目錄下的文件ccbp.dat,這是一個二進制文件,只允許按二進制方式進行讀操作。文件的打開(fopen函數):

9.3.1使用文件的方式共有12種,符號和意義如下:文件使用方式意義“rt”只讀打開一個文本文件,只允許讀數據“wt”只寫打開或建立一個文本文件,只允許寫數據“at”追加打開一個文本文件,并在文件末尾寫數據“rb”只讀打開一個二進制文件,只允許讀數據“wb”只寫打開或建立一個二進制文件,只允許寫數據“ab”追加打開一個二進制文件,并在文件末尾寫數據“rt+”讀寫打開一個文本文件,允許讀和寫“wt+”讀寫打開或建立一個文本文件,允許讀寫“at+”讀寫打開一個文本文件,允許讀,或在文件末追加數據“rb+”讀寫打開一個二進制文件,允許讀和寫“wb+”讀寫打開或建立一個二進制文件,允許讀和寫“ab+”讀寫打開一個二進制文件,允許讀,或在文件末追加數據文件的打開(fopen函數):

9.3.1文件的打開(fopen函數):

1) 文件使用方式由r,w,a,t,b,+六個字符拼成,各字符的含義是:r(read):讀w(write):寫a(append):追加t(text):文本文件,可省略不寫b(banary):二進制文件+:讀和寫2) 凡用“r”打開一個文件時,該文件必須已經存在,且只能從該文件讀出。3)用“w”打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經存在,則將該文件刪去,重建一個新文件。9.3.1文件的打開(fopen函數):

若要向一個已存在的文件追加新的信息,只能用“a”方式打開文件。但此時該文件必須是存在的,否則將會出錯。在打開一個文件時,如果出錯,fopen將返回一個空指針值NULL。在程序中可以用這一信息來判別是否完成打開文件的工作,并作相應的處理。if((fp=fopen("c:\\hzk16","rb")==NULL){printf("\nerroronopenc:\\hzk16file!");getch();exit(1);}例9.3文件打開錯誤如果返回的指針為空,表示不能打開C盤根目錄下的hzk16文件,則給出錯誤提示信息。敲鍵后執(zhí)行exit(1)退出程序。6) 標準輸入文件(鍵盤),標準輸出文件(顯示器),標準出錯輸出(出錯信息)是由系統(tǒng)打開的,可直接使用。9.3.2文件關閉函數(fclose函數)文件一旦使用完畢,應用關閉文件函數把文件關閉,以避免文件的數據丟失等錯誤。fclose函數調用的一般形式是:

正常完成關閉文件操作時,fclose函數返回值為0。如返回非零值則表示有錯誤發(fā)生。fclose(文件指針);9.3.3數據塊讀寫函數fread和fwtriteC語言提供了用于整塊數據的讀寫函數。可用來讀寫一組數據,如一個數組元素,一個結構變量的值等。函數fread和fwrite的原形分別如下:size_tfread(void*ptr,size_tsize,size_tn,FILE*stream);size_tfwrite(constvoid*ptr,size_tsize,size_tn,FILE*stream);對于函數fread而言,ptr是存放所讀入數據的內存區(qū)域的指針,而對于函數fwrite而言,prt是寫入到那個文件的信息的指針。變量n的值確定將讀/寫多少項,而每項的長度是由size決定的,size的類型為size_t,一般代表無符號整數。形參stream是指針變量,是指向原先打開的文件。9.3.3數據塊讀寫函數fread和fwtrite函數fread和fwrite都有返回值。函數fread返回讀入的項數,如果出錯或者達到文件的尾部,則返回值可能會小于n;函數fwrite返回寫入的項數,如果出錯,則該值將等于n。例如:

其意義是從fp所指的文件中,每次讀4個字節(jié)(一個實數)送入實數組fa中,連續(xù)讀5次,即讀5個實數到fa中。read(fa,4,5,fp);9.3.4格式化讀寫函數fscanf和fprintffscanf函數,fprintf函數與前面使用的scanf和printf函數的功能相似,都是格式化讀寫函數。兩者的區(qū)別在于fscanf函數和fprintf函數的讀寫對象不是鍵盤和顯示器,而是磁盤文件。函數fscanf和fprintf的原型分別如下:intfscanf(FILE*fp,constchar*format[,address,…]);intfprintf(FILE*fp,constchar*format[,address,…]);變元fp是函數fopen()返回的文件指針,而函數fprintf()和fscanf()是把I/O操作導向指明的文件。這兩個函數的調用格式為:fscanf(文件指針,格式字符串,輸入列表);fprintf(文件指針,格式字符串,輸出列表);9.3.5字符讀寫函數fgetc和fputc字符讀寫函數是以字符(字節(jié))為單位的讀寫函數。每次可從文件讀出或向文件寫入一個字符。讀字符函數fgetcfgetc函數的功能是從指定的文件中讀一個字符,函數調用的形式為:例如:其意義是從打開的文件fp中讀取一個字符并送入ch中。字符變量=fgetc(文件指針);ch=fgetc(fp);9.3.5字符讀寫函數fgetc和fputc1) 在fgetc函數調用中,讀取的文件必須是以讀或讀寫方式打開的。2) 讀取字符的結果也可以不向字符變量賦值,例如:

fgetc(fp);

但是讀出的字符不能保存。3)

在文件內部有一個位置指針。用來指向文件的當前讀寫字節(jié)。在文件打開時,該指針總是指向文件的第一個字節(jié)。使用fgetc函數后,該位置指針將向后移動一個字節(jié)。因此可連續(xù)多次使用fgetc函數,讀取多個字符。應注意文件指針和文件內部的位置指針不是一回事。文件指針是指向整個文件的,須在程序中定義說明,只要不重新賦值,文件指針的值是不變的。文件內部的位置指針用以指示文件內部的當前讀寫位置,每讀寫一次,該指針均向后移動,它不需在程序中定義說明,而是由系統(tǒng)自動設置的。9.3.5寫字符函數fputcfputc函數的功能是把一個字符寫入指定的文件中,函數調用的形式為:

其中,待寫入的字符量可以是字符常量或變量,例如:其意義是把字符a寫入fp所指向的文件中。fputc(字符量,文件指針);fputc('a',fp);字符讀寫函數fgetc和fputc1) 被寫入的文件可以用寫、讀寫、追加方式打開,用寫或讀寫方式打開一個已存在的文件時將清除原有的文件內容,寫入字符從文件首開始。如需保留原有文件內容,希望寫入的字符以文件末開始存放,必須以追加方式打開文件。被寫入的文件若不存在,則創(chuàng)建該文件。2) 每寫入一個字符,文件內部位置指針向后移動一個字節(jié)。3) fputc函數有一個返回值,如寫入成功則返回寫入的字符,否則返回一個EOF。可用此來判斷寫入是否成功。9.3.6字符串讀寫函數fgets和fputs讀字符串函數fgets函數的功能是從指定的文件中讀一個字符串到字符數組中,函數調用的形式為:

其中的n是一個正整數。表示從文件中讀出的字符串不超過n-1個字符。在讀入的最后一個字符后加上串結束標志'\0'。fgets(字符數組名,n,文件指針);例如:的意義是從fp所指的文件中讀出n-1個字符送入字符數組str中。fgets(str,n,fp);1) 在讀出n-1個字符之前,如遇到了換行符或EOF,則讀出結束。2) fgets函數也有返回值,其返回值是字符數組的首地址。9.3.6字符串讀寫函數fgets和fputs寫字符串函數fputsfputs函數的功能是向指定的文件寫入一個字符串,其調用形式為:

其中字符串可以是字符串常量,也可以是字符數組名,或指針變量,例如:其意義是把字符串“abcd”寫入fp所指的文件之中。fputs(字符串,文件指針);fputs(“abcd“,fp);9.3.7文件定位前面介紹的對文件的讀寫方式都是順序讀寫,即讀寫文件只能從頭開始,順序讀寫各個數據。但在實際問題中常要求只讀寫文件中某一指定的部分。為了解決這個問題可移動文件內部的位置指針到需要讀寫的位置,再進行讀寫,這種讀寫稱為隨機讀寫。實現隨機讀寫的關鍵是要按要求移動位置指針,這稱為文件的定位。移動文件內部位置指針的函數主要有兩個,

即rewind

函數和fseek函數。9.3.7文件定位rewind函數前面已多次使用過,其調用形式為:功能:把文件內部的位置指針移到文件首。rewind(文件指針);文件首位置定位rewind函數文件任意位置定位fseek函數fseek函數用來移動文件內部位置指針,其調用形式為:其中:“文件指針”指向被移動的文件。“位移量”表示移動的字節(jié)數,要求位移量是long型數據,以便在文件長度大于64KB時不會出錯。當用常量表示位移量時,要求加后綴“L”。fseek(文件指針,位移量,起始點);9.3.7文件定位“起始點”表示從何處開始計算位移量,規(guī)定的起始點有三種:文件首,當前位置和文件尾。起始點表示符號數字表示文件首SEEK_SET0當前位置SEEK_CUR1文件末尾SEEK_END2例如:其意義是把位置指針移到離文件首100個字節(jié)處。還要說明的是fseek函數一般用于二進制文件。在文本文件中由于要進行轉換,故往往計算的位置會出現錯誤。在移動位置指針之后,即可用前面介紹的任一種讀寫函數進行讀寫。由于一般是讀寫一個數據據塊,因此常用fread和fwrite函數。fseek(fp,100L,0);9.3.8文件檢測函數C語言中常用的文件檢測函數有以下幾個:文件結束檢測函數feof讀寫文件錯誤檢測函數ferror文件出錯標志和文件結束標志置零函數clearerr文件結束檢測函數feof函數調用格式:feof(文件指針);功能:判斷文件是否處于文件結束位置,如文件結束,則返回值為1,否則為0。9.3.8文件檢測函數讀寫文件出錯檢測函數ferror函數調用格式:ferror(文件指針);功能:檢查文件在用各種輸入輸出函數進行讀寫時是否出錯。如ferror返回值為0表示未出錯,否則表示有錯。文件出錯標志和文件結束標志置0函數clearerr函數調用格式:clearerr(文件指針);功能:本函數用于清除出錯標志和文件結束標志,使它們?yōu)?值。9.4文件函數應用綜合舉例#include<stdio.h>#include<stdlib.h>#include<conio.h>structstu{charname[10];intnum;intage;charaddr[15];};main(){

charch;inti;FILE*fp;Structstuboya[2],boyb[2],*pp,*qq;pp指向boya,qqpp=boya;qq=boyb;

//以讀/寫方式打開二進制文件“stu_list.txt”if((fp=fopen("stu_list.txt","wb+"))==NULL){printf("不能打開文件,任意鍵退出!");getch();exit(1);}

//輸入兩個學生數據

printf("\ninputdata\n");for(i=0;i<2;i++,pp++)scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);

pp=boya;for(i=0;i<2;i++,pp++){fprintf(fp,"%s%d%d%s\n",pp->name,pp->num,pp->age,pp->addr);

}關閉文件,保證緩沖區(qū)的信息寫入到文件中

fclose(fp);

//再次以只讀形式打開文件

if((fp=fopen(“stu_list.txt”,”r”))==NULL){printf(“不能打開文件,任意鍵退出”);getch();exit(1);

}把文件內部位置出兩個學生數據后,在屏幕上顯示

rewind(fp);for(i=0;i<2;i++,qq++){fscanf(fp,"%s%d%d%s\n",qq->name,&qq->num,&qq->age,qq->addr);}printf("\n\nname\tnumberageaddr\n");qq=boyb;for(i=0;i<2;i++,qq++){printf("%s\t%5d%7d%s\n",qq->name,\qq->num,qq->age,qq->addr);}fclose(fp);}例9.4文件函數應用綜合應用9.5C語言圖形程序設計基本概念圖形化界面是軟件的趨勢,圖形化界面具有界面友好、交互性強的特點,但圖形界面的開發(fā)相對來說會麻煩一些,因此難度也就大一些,一般來說,圖形界面的開發(fā),經常與屏幕的分辨率有關。在屏幕上進行繪制圖形,一般要按以下幾個步驟執(zhí)行:(1)把屏幕設置為圖形模式;(2)選擇背景與顯示實體的顏色;(3)計算圖形顯示坐標;(4)調用繪圖語句繪制實體9.5C語言圖形程序設計基本概念顯示器的工作方式文本方式

圖形方式屏幕上顯示的最小單位是字符。不同的文本方式對應相應的行數、列數和顏色。一像素作為屏幕上的最小單元,以屏幕的左上角為原點,位置為(0,0)。9.5C語言圖形程序設計基本概念

在屏幕上顯示圖形的方式稱為圖形模式。在圖形模式下,屏幕是由像素點組成的,像素點的多少決定了屏幕的分辨率。分辨率越高,顯示圖形越細致,質量越好。

如右圖所示1.屏幕由許多像素點組成;2.圖形的顯示效果取決于分辨率的高低;9.5C語言圖形程序設計基本概念(0,0)(1023,0)(0,767)(1023,767)1024×768分辨率像素坐標在圖形模式下,屏幕上每個像素的顯示位置用點坐標來描述的。點坐標系是以屏幕左上角為坐標原點(0,0),水平方向為X軸,自左向右;垂直方向為Y軸,自上向下。如下圖所示:9.6C語言中的圖形函數

C提供了十分豐富的圖形庫函數,共有70多個,所有圖形函數的原型均在頭文件“graphics.h”中定義。所以,在任何使用圖形函數的程序中,都要求其頭部包含文件graphics.h,即在程序文件的開頭寫上文件包含命令:

#include<graphics.h>同時將集成開發(fā)環(huán)境option/Linker中的graphics.lib選項設置為”on”。9.6.1初始化圖形系統(tǒng)函數initgraph

初始化圖形系統(tǒng)函數voidinitgraph(int*graphdriver,int*graphmode,char*pathtodriver)功能:將圖形驅動程序裝入內存,使屏幕顯示適配器設置為圖形模式,即圖形系統(tǒng)初始化;參數說明:1.graphdriver是一個整型值,用來指定要裝入的圖形驅動程序,指向存有顯卡類型編號(整數)的整型變量;該值在頭文件graphics.h中以枚舉的形式定義;2.graphmode是一個整型值,用來設置圖形顯示模式。圖形顯示模式決定了顯示的分辨率和顯示的顏色的多少等;3.pathtodriver是一個字符串,用來指明圖形驅動程序文件所在的路徑,圖形驅動程序文件以bgi為擴展名。9.6.1初始化圖形系統(tǒng)函數initgraph

enumgraphics_drivers{DETECT,//自動檢測CGA,MCGA,EGA,EGA64,EGAMONO,IBM8514,//1-6HERCMONO,ATT400,VGA,PC3270,//7-10CURRENT_DRAIVER=-1};enumgraphics_modes{…//省略CGA,VGA等顯示模式VGALO=0,//640×20016color4pagesVGAMED=1,//640×35016color2pagesVGAHI=2,//640×48016color1pagesPC3270HI=0,//720×3501pagesIBM8514LO=0,

//640×480256colorIBM8514HI=1,//1024×768256color};1.若驅動程序就在用戶當前目錄下,則path可為空字符串,否則應給出具體路徑名。以BC為例,一般情況下,在BC安裝目錄(假設暗轉在C盤),則該路徑為:C:\BC31,若寫在參數中則為“C:\\BC31”;2.前兩個參數實際上是整型指針,調用時應加上地址運算符“&”;9.6.1例9.5已知顯示器類型的圖形系統(tǒng)初始化

#include"graphics.h"main(){intgdriver,gmode;

detectgraph(&gdriver,&gmode);//測試結果存放于gdriver,gmode中if(gdriver<0){printf("thereisnotgraphicsdisplayer\n");exit(1);

}//無圖形顯示模式時,顯示信息,停止程序

printf("detectgraphicsdriveris#%d,modeis#%d\n",gdriver,gmode);//顯示硬件測試結果getch();//等待按一鍵結束initgraph(&gdriver,&gmode,“D:\\TC");//初始化圖形系統(tǒng)bar3d(10,20,50,80,0,0);//畫一條形圖

getch();//等待按一鍵結束

closegraph();//關閉圖形系統(tǒng),回文本模式}初始化圖形系統(tǒng)函數initgraph

例9.6未知顯示器類型的圖形系統(tǒng)初始化#include"graphics.h"main(){

intgdriver,gmode;

gdriver=CGA;//設置顯示模式CGA

gmode=CGAC0;//選用CGA圖形模式

initgraph(&gdriver,&gmode,“c:\\bc31\\bgi");

//初始化圖形系統(tǒng)bar3d(10,20,50,80,0,0);//畫一條形圖

getch();//等待按一鍵結束

closegraph();

//關閉圖形系統(tǒng),回到文本模式}9.6.1例9.7自動初始化圖形系統(tǒng)

初始化圖形系統(tǒng)函數initgraph

#include"graphics.h"main(){

intgdriver,gmode;

gdriver=DETECT;

initgraph(&gdriver,&gmode,“");

//初始化圖形系統(tǒng)bar3d(10,20,50,80,0,0);//畫一條形圖

getch();//等待按一鍵結束

closegraph();

//關閉圖形系統(tǒng),回到文本模式}9.6.2關閉圖形系統(tǒng)函數closegraph關閉圖形系統(tǒng)函數voidclosegraph(void)功能:關閉圖形系統(tǒng),釋放圖形系統(tǒng)所占的內存空間,并返回調用initgraph函數之前的顯示模式(通常是文本模式);

另外,將系統(tǒng)從圖形方式切換到文本方式的函數還有:voidfarrestorecrtmode(void)9.6.3設置畫筆當前顏色及屏幕背景色設置當前畫筆顏色函數voidsetcolor(intcolor)功能:用來設置當前畫筆的顏色,將影響待畫出的直線、圓、矩形等線條的顏色;設置屏幕背景色函數voidsetbkcolor(intcolor)功能:用來設置屏幕背景的顏色;在頭文件graphics.h中,以枚舉的形式定義了顏色:enumCOLORS{BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIGHTGRAY,DARKGRAY,LIGHTBLUE,LIGHTGREEN,LIGHTCYAN,LIGHTRED,LIGHTMAGENTA,YELLOW,WHITE};例如:設置當前畫筆顏色為綠色,可執(zhí)行語句:

setcolor(GREEN)或者setcolor(2)

設置屏幕背景顏色為藍色,可執(zhí)行語句:

setbkcolor(BLUE)或者setbkcolor(1)9.6.4畫點及獲取屏幕點顏色畫點函數voidputpixel(intx,inty,intcolor)功能:向屏幕指定坐標處畫一個給定顏色的點;獲取屏幕點顏色函數unsignedgetpixel(intx,inty)功能:用來指出屏幕上某一點的顏色是什么;例如:putpixel(100,80,RED)例如:c=getpixel(100,80)9.6.5設置線型及畫直線設置線型函數voidsetlinestyle(intlinestyle,unsigneduser_pattern,intthickness)功能:用于設置畫筆的當前線型及寬度;參數說明:參數linestyle即線型的枚舉常量如下:枚舉常量名整數值線型SOLID_LINE0實線DOTTED_LINE1虛線CENTER_LINE2中心線DASHE_LINE3破折號USERBIT_LINE4用戶自定義線型如果linestyle的參數取值為USERBIT_LINE,則參數user_pattern的值就是用戶自定義的線型。線型以二進制(共16位)的形式存放于參數user_pattern中,其中1點畫出,0不畫出。當linestyle取非USERBIT_LINE,

user_pattern取0值。參數thickness只有兩個值:NORM_WIDTH(整數值為1)和THICK_WIDTH(數值為3)

NORM_WIDTH畫細線,

THICK_WIDTH表示畫粗線9.6.5畫直線的相關函數voidline(intx1,inty1,intx2,inty2)功能:line函數在屏幕上的任意兩點之間畫一條直線段;

如:在坐標(10,20)、(150,50)的兩點畫一條直線

line(10,20,150,50);

函數moveto用于移動畫筆的當前位置到指定坐標位置,但移動過程中不畫線。

函數lineto配合函數moveto使用,則可在屏幕上畫出連續(xù)的折線。如畫一個以點(50,0),(100,0)及(60,80)為頂點的三角形:

moveto(50,0);

lineto(100,50);

lineto(60,80);Lineto(50,0);設置線型及畫直線voidlineto(intx,inty)void

moveto(intx,inty)9.6.6畫圓、橢圓、矩形及多邊形void

circle(intx,inty,intradius)voidellips(intx,inty,intstangle,intendangle,intxradius,intyradius)voidrectangle(intleft,inttop,intright,intbottom)voiddrawpoly(intnumpoints,int*polypoints)函數說明:1)函數circle的功能是以某點為圓心,用當前線型畫一個指定半徑的圓,如:

circle(100,80,30)即為以(100,80)為圓心,畫一個半徑30的圓;2)函數ellips用于在屏幕上畫一個橢圓。參數(x,y)是橢圓的中心坐標,stangle是起始角度,endangle結束角度,xradius和yradius分別為x軸和y軸的橢圓半徑;

ellips(150,100,0,180,40,30);3)函數rectangle的功能是畫一個矩形,參數(left,top)是左上角的坐標,參數(right,bottom)是矩形右下角的坐標。

rectangle(10,20,80,50);9.6.6畫圓、橢圓、矩形及多邊形函數說明:4)函數drawpoly的功能是按給定的頂點,畫一條連續(xù)折線。如果所畫的折線式封閉的,那么畫出的便是一個多邊形。參數numpoints為折線的頂點數,參數polypoints指向有頂點坐標的一維整型數組的第一個元素,數組中頂點的坐標按(x,y)依次存放。

如畫一個梯形,可執(zhí)行語句如下:

intv[]={50,10,100,10,120,60,30,60,50,10};

drawpoly(5,v);9.6.7填充圖形函數設置填充模式和填充顏色函數voidsetfillpattern(char*upattern,intcolor);void

setfillstyle(intpattern,intcolor);功能:setfillpattern是設置用戶定義的填充圖案及填充顏色;參數說明:參數upattern指向存有表述填充圖案(8×8方塊)的8個字節(jié)存儲區(qū)域,參數color為填充顏色:

如:charpattern[]={0xFF,0x81,

0x81,

0x81,

0x81,

0x81,

0x81,0xFF};setfillpattern(pattern,BLUE);9.6.7填充圖形函數Setfillstyle的功能是設置系統(tǒng)預設填充圖案及用戶指定的填充顏色。參數pattern的取值如右表,枚舉常量名整數值填充圖案EMPTY_FILL0背景色填充SOLID_FILL1單色填充LINE_FILL2…填充LTSLASH_FILL3///填充SLASH_FILL4粗///填充BKSLASH_FILL5粗\\\填充LTBKSLASH_FILL6\\\填充HATCH_FILL7淡影線填充XHATCH_FILL8交叉線填充INTERLEAVE_FILL9間隔線填充WID_DOT_FILL10稀疏空白點填充COLOSE_DOT_FILL11密集空白點填充如果用戶想使用自定義填充模式,應該使用setfillpattern函數而不是用setfillstyle函數的USER_FILL模式。9.6.7填充圖形函數填充指定區(qū)域函數void

floodfill(intx,inty,intborder);功能:將指定邊界色為border的封閉區(qū)域,用當前填充圖案的填充色來填充;參數說明:形參(x,y)為填充區(qū)域中的一點,參數border為區(qū)域的邊界顏色值。如:用綠色填充一個圓形區(qū)域(邊界紅色),可執(zhí)行語句:

setcolor(GREEN);

circle(80,60,30);

floodfile(80,63,RED);9.6.7填充圖形函數填充矩形、多邊形、橢圓、圓和扇形等函數:voidbar(intleft,inttop,intright,intbottom);voidfillpoly(intnumpoints,int*polypoints);voidfillellips(intx,inty,intxradius,intyradius);voidpeislice(intx,inty,intstangle,intendangle,intradius);voidsector(intx,inty,intstangle,intendangle,intxradius,intyradius);功能:函數bar和函數rectangle相似,不同的是函數bar用當前線型和顏色畫完矩形邊框后,還會用當前填充圖案和填充色填充該矩形;

函數fillpoly與函數drawpoly相似,不同的也是在畫完折線后,還會用當前填充圖案和填充色填充折線所圍起的區(qū)域;

函數fillellips和ellips也是填充和不填充的區(qū)別;

函數pieslice和函數sector的區(qū)別:

pieslice是填充圓形扇形,

sector是填充橢圓形扇形;9.7圖形方式下的文本常見操作函數

在圖形方式下主要繪制圖形,但還要輸出文本。為了有效地進行圖形操作,在圖形方式下開設“視口”(也稱“窗口”或“視見區(qū)”)也是極重要的,圖像方式下的文本操作函數是只在圖形區(qū)進行文本輸入/輸出的函數,BC++3.1只提供了對圖形進行字符串輸出的函數,但輸出字符的字型等是可控的。9.7.1視口操作函數視口操作函數是指用于圖形輸出的屏幕矩形區(qū)域,初始化圖形系統(tǒng)時,視口默認為整個屏幕。視口函數有:

voidfarsetviewport(intleft,inttop,intright,intbottom,intclip);

voidfargetviewport(structviewporttype*viewport);

voidfarclearviewport(void);功能:函數setviewport用于設置視口在屏幕中的位置和視口區(qū)的大小,參數(left,top)是視口左上角的坐標(屏幕坐標系中的坐標),參數(right,bottom)是視口右下角的坐標(屏幕坐標系中的坐標)。參數clip用來確定當繪制的圖形越過視口邊界時,是否對其裁剪。0-裁剪;非0-不裁剪;

函數getviewport返回當前視口區(qū)的信息,結果存入viewport中,viewport結構定義:Structviewporttype{intleft,top,right,bottom;intclip;};函數clearviewport清除當前視口;9.7.2圖形方式下的文字輸出相關函數:

settextstyle(intfont,intdirection,intcharsize);outtext(char*textstring);outtextxy(intx,inty,char*textstring);功能:函數settextstyle用于指定輸出字符串的字體、大小和方向。參數說明:函數中font確定所用字體的類型,bc31中包含了幾種英文字體,如表,其中8×8點陣字體放在圖形驅動程序中,而其他的矢量字體都是以CHR為擴展名,存放在系統(tǒng)初始化函數initgraph指定的目錄中或存放在當前目錄下。

參數direction確定輸入文字的方向,它只有兩個值:HORIZ_DIR(整數值為0)和VERT_DIR(整數值為1)。參數charsize確定文字的大小,取值范圍是0∽10.9.7.2圖形方式下的文字輸出枚舉常量名整數值字體類型DEFAULT_FONT08×8點陣字體TRIPLEX_FONT1三重矢量字體SMALL_FONT2小號矢量字體SANS_SERIF_FONT3無襯線矢量字體GOTHIC_FONT4哥特矢量字體文本操作函數outtext和outtextxy主要功能是在屏幕上輸出字符串,區(qū)別在于outtext在當前位置輸出,

outtextxy是在指定位置輸出。9.7.3屏幕圖形的保存和恢復相關函數:

getimage(intleft,inttop,intright,intbottom,void*bitmap);imagesize(intleft,inttop,intright,intbottom,void);putimage(intleft,inttop,void*bitmap,intop);功能及參數說明:

函數getimage可以把屏幕某一矩形區(qū)域的圖像保存到指定的內存中。參數(left,top)為矩形左上角坐標,參數(right,bottom)為矩形右下角坐標,參數bitmap為用于保存圖像的內存區(qū)地址。

函數imagsize用于計算保存圖形所需的存儲空間大??;

函數putimage是恢復函數getimage保存的圖像,并將其顯示到屏幕上。參數(left,top)為屏幕目標矩形區(qū)域的左上角坐標,參數bitmap為由函數getimage保存的圖像存放區(qū)域的地址,參數op為恢復方式,如下:9.7.3屏幕圖形的保存和恢復枚舉常量名整數值恢復方式COPY_PUT0原樣拷貝到屏幕上XOR_PUT1與屏幕上的點“異或”后寫入OR_PUT2與屏幕上的點“或”后寫入AND_PUT3與屏幕上的點“與”后寫入NOT_PUT4原圖像取反后寫到屏幕例:要將屏幕某一區(qū)域圖像復制到屏幕另一位置:void*buffer;//定義指針用于存放圖像存儲區(qū)地址;unsigneds;//用于存放存儲區(qū)大小s=imagesize(20,30,50,65);//計算所需內存的大小buffer=malloc(s);//動態(tài)分配所需的內存getimage(20,30,50,65,buffer)j;//保存矩形區(qū)圖像到buffer指向的內存區(qū);putimage(100,100,buffer,COPY_PUT);//以復制方式將圖像恢復到指定位置free(buffer);9.8綜合舉例例9.8

畫出一個搜索引擎的界面,用一個二維數組來存儲鼠標的畫圖

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論