《C語言程序設(shè)計項目化教程》課件第5章_第1頁
《C語言程序設(shè)計項目化教程》課件第5章_第2頁
《C語言程序設(shè)計項目化教程》課件第5章_第3頁
《C語言程序設(shè)計項目化教程》課件第5章_第4頁
《C語言程序設(shè)計項目化教程》課件第5章_第5頁
已閱讀5頁,還剩243頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

項目5計?算?器?開?發(fā)5.1問題情境5.2問題分析5.3項目設(shè)計與實施5.4知識拓展5.5應(yīng)用實踐

計算器是Windows操作系統(tǒng)提供的一個附件功能??梢杂肰isualBasic、VisualC++等編制計算器,由于這些程序提供了控件,所以實現(xiàn)相對容易。TurboC沒有控件,但我們可以利用它所具有的函數(shù)模仿畫出其界面,實現(xiàn)計算器的基本功能,進行浮點數(shù)的加、減、乘、除、乘方、求模運算。5.1問題情境

實現(xiàn)計算器功能,首先是輸出計算器圖形樣式,然后通過按鍵的方式實現(xiàn)數(shù)值運算。

TurboC通常工作方式是字符文本模式,要顯示圖形,調(diào)用圖形函數(shù),則必須進入圖形工作方式,此時可以利用initgraph函數(shù)。5.2問題分析為了布局合理,操作方便,要根據(jù)窗口大小設(shè)計按鈕的大小和位置。顯示的按鈕利用bar、rectangle函數(shù)畫矩形顯示,按鈕上的文字用outtextxy函數(shù)輸出。

由于在圖形模式下,光標是不可見的,為了能正確地選擇按鈕,需自己設(shè)計一個光標圖形,利用putimage函數(shù)實現(xiàn)光標的顯示和隱藏。計算器的操作需要通過鍵盤實現(xiàn),bioskey函數(shù)可用來讀取用戶所按鍵的信息。如果按下的是Alt

+

x鍵可以結(jié)束程序。如果按下的是光標鍵,顯示光標相應(yīng)移動位置。如果按下回車鍵,判斷所按的字符,進行相應(yīng)處理:

(1)當(dāng)所選為數(shù)字或小數(shù)點時,則先判斷是否為負數(shù)。如果是負數(shù)則將該字符連接到字符串中,否則只連接所選的數(shù)字或小數(shù)點,并顯示數(shù)據(jù)。

(2)當(dāng)所選為“-”時,先判斷有無操作數(shù)。沒有,則為負數(shù),做負數(shù)標記,否則是做減法,做減法標志,并將當(dāng)前的操作數(shù)保存。

(3)當(dāng)所選為“+”、“*”、“/”、“^”、“%”時,處理方式一樣,均是先保存第一個操作數(shù),做運算標志,準備接收第二個操作數(shù)。

(4)當(dāng)所選為“=”時,根據(jù)運算符標志進行相應(yīng)運算,將結(jié)果顯示。

(5)當(dāng)所選為“C”時,表示清零,將第一個和第二個操作數(shù)均置0。

(6)當(dāng)所選為“Q”時,則運算結(jié)束。

數(shù)據(jù)和結(jié)果的顯示,依然用outtextxy函數(shù)實現(xiàn)。

按照本項目的任務(wù)要求,采用模塊化的程序設(shè)計思想,將計算器開發(fā)系統(tǒng)劃分成畫邊框模塊、圖形系統(tǒng)初始化模塊、計算器設(shè)計模塊、窗口設(shè)計模塊、鼠標圖形設(shè)計模塊、按鍵設(shè)計模塊等;各模塊中的數(shù)據(jù)處理采用在TC環(huán)境下,依照圖形處理及窗口設(shè)計形式來實施具體任務(wù),并在主程序中完成各模塊的調(diào)用。5.3項目設(shè)計與實施通過本項目的學(xué)習(xí),初步了解視口的概念并掌握C語言TurboC圖形操作的基本知識、鍵盤上特殊鍵的獲取及圖形方式下光標的顯示等,并理解用戶界面編程的基本步驟、結(jié)構(gòu)、語法規(guī)則及圖形圖像標準庫函數(shù)的使用,掌握通過C語言實現(xiàn)DOS功能調(diào)用、通過控制臺進行數(shù)據(jù)輸入和數(shù)據(jù)輸出,學(xué)會在TC環(huán)境下實現(xiàn)C語言圖形圖像程序設(shè)計的基本操作。

【項目分析】

計算器開發(fā)的設(shè)計思路如下:

(1)在C語言圖形工作方式下,合理設(shè)置邊框、按鈕、鼠標及加減乘除乘方等運算功能,掌握圖形圖像程序設(shè)計的基本操作。

(2)采用模塊化設(shè)計思想,將項目設(shè)計按照其功能劃分成圖形系統(tǒng)初始化、計算器設(shè)計、窗口設(shè)計等系列模塊。在設(shè)計中,注意各模塊與Windows系統(tǒng)在顯示方式、窗口布局、系統(tǒng)參數(shù)等方面的合理性及一致性。

(3)通過設(shè)計一個仿真計算器界面完成具體的操作和計算功能。通過本程序訓(xùn)練學(xué)生程序設(shè)計的基本技能,掌握字符串的表示方法和字符串函數(shù)的功能、轉(zhuǎn)換函數(shù)的用法、TurboC圖形操作的基本知識、鍵盤上特殊鍵的獲取及圖形方式下光標的顯示,初步了解視口的概念。

【項目實施】

源程序如下(運行環(huán)境:TurboC2.0):

#include<dos.h> /*DOS接口函數(shù)*/

#include<math.h> /*數(shù)學(xué)函數(shù)的定義*/

#include<conio.h> /*屏幕操作函數(shù)*/

#include<stdio.h> /*I/O函數(shù)*/

#include<stdlib.h> /*庫函數(shù)*/

#include<stdarg.h> /*變量長度參數(shù)表*/

#include<graphics.h> /*圖形函數(shù)*/

#include<string.h> /*字符串函數(shù)*/

#include<ctype.h> /*字符操作函數(shù)*/

#defineUP0x48 /*光標上移鍵*/

#defineDOWN0x50 /*光標下移鍵*/

#defineLEFT0x4b /*光標左移鍵*/

#defineRIGHT0x4d /*光標右移鍵*/

#defineENTER0x0d /*回車鍵*/

void*rar; /*全局變量,保存光標圖像*/

structpalettetypepalette; /*使用調(diào)色板信息*/

intGraphDriver; /*圖形設(shè)備驅(qū)動*/

intGraphMode; /*圖形模式值*/

intErrorCode; /*錯誤代碼*/

intMaxColors; /*可用顏色的最大數(shù)值*/

intMaxX,MaxY; /*屏幕的最大分辨率*/

doubleAspectRatio; /*屏幕的像素比*/

voiddrawboder(void); /*畫邊框函數(shù)*/

voidinitialize(void); /*初始化函數(shù)*/

voidcomputer(void); /*計算器計算函數(shù)*/

voidchangetextstyle(intfont,intdirection,intcharsize); /*改變文本樣式函數(shù)*/

voidmwindow(char*header); /*窗口函數(shù)*/

intspecialkey(void); /*獲取特殊鍵函數(shù)*/

intarrow(); /*設(shè)置箭頭光標函數(shù)*/

/*主函數(shù)*/

intmain()

{initialize(); /*設(shè)置系統(tǒng)進入圖形模式*/

computer(); /*運行計算器*/

closegraph(); /*系統(tǒng)關(guān)閉圖形模式返回文本模式*/

return(0); /*結(jié)束程序*/

}

/*設(shè)置系統(tǒng)進入圖形模式*/

voidinitialize(void)

{intxasp,yasp; /*用于讀x和y方向縱橫比*/

GraphDriver=DETECT; /*自動檢測顯示器*/

initgraph(&GraphDriver,&GraphMode,"");

/*初始化圖形系統(tǒng)*/

ErrorCode=graphresult(); /*讀初始化結(jié)果*/

if(ErrorCode!=grOk) /*如果初始化時出現(xiàn)錯誤*/

{printf("GraphicsSystemError:%s\n",

grapherrormsg(ErrorCode); /*顯示錯誤代碼*/

exit(1);/*退出*/

}

getpalette(&palette); /*讀面板信息*/

MaxColors=getmaxcolor()+1; /*讀取顏色的最大值*/

MaxX=getmaxx(); /*讀屏幕尺寸*/

MaxY=getmaxy(); /*讀屏幕尺寸*/

getaspectratio(&xasp,&yasp); /*拷貝縱橫比到變量中*/

AspectRatio=(double)xasp/(double)yasp; /*計算縱橫比值*/

}

/*計算器函數(shù)*/

voidcomputer(void)

{structviewporttypevp; /*定義視口類型變量*/

intcolor,height,width;

intx,y,x0,y0,i,j,v,m,n,act,flag=1;

floatnum1=0,num2=0,result; /*操作數(shù)和計算結(jié)果變量*/

charcnum[5],str2[20]={""},c,temp[20]={""};

charstr1[]="1230.456+-789*/Qc=^%";

/*定義字符串在按鈕圖形上顯示的符號*/

mwindow("Calculator"); /*顯示主窗口*/

color=7; /*設(shè)置灰顏色值*/

getviewsettings(&vp); /*讀取當(dāng)前窗口的大小*/

width=(vp.right+1)/10; /*設(shè)置按鈕寬度*/

height=(vp.bottom-10)/10; /*設(shè)置按鈕高度*/

x=width/2; /*設(shè)置x的坐標值*/

y=height/2; /*設(shè)置y的坐標值*/

setfillstyle(SOLID_FILL,color+3);

bar(x+width*2,y,x+7*width,y+height);

/*畫一個二維矩形條顯示運算數(shù)和結(jié)果*/

setcolor(color+3); /*設(shè)置淡綠色邊框線*/

rectangle(x+width*2,y,x+7*width,y+height);

/*畫一個矩形邊框線*/

setcolor(RED); /*設(shè)置顏色為紅色*/

outtextxy(x+3*width,y+height/2,"0."); /*輸出字符串"0."*/

x=2*width-width/2; /*設(shè)置x的坐標值*/

y=2*height+height/2; /*設(shè)置y的坐標值*/

for(j=0;j<4;++j) /*畫按鈕*/

{for(i=0;i<5;++i)

{setfillstyle(SOLID_FILL,color);

setcolor(RED);

bar(x,y,x+width,y+height); /*畫一個矩形條*/

rectangle(x,y,x+width,y+height);

sprintf(str2,"%c",str1[j*5+i]);

/*將字符保存到str2中*/

outtextxy(x+(width/2),y+height/2,str2);

x=x+width+(width/2); /*移動列坐標*/

}

y+=(height/2)*3; /*移動行坐標*/

x=2*width-width/2; /*復(fù)位列坐標*/

}

x0=2*width;y0=3*height;

x=x0;y=y0;

gotoxy(x,y); /*移動光標到x,y位置*/

arrow(); /*顯示光標*/

putimage(x,y,rar,XOR_PUT);

m=0;n=0;

strcpy(str2,""); /*設(shè)置str2為空串*/

while((v=specialkey())!=45) /*當(dāng)壓下Alt

+

x鍵時結(jié)束程序*/

{while((v=specialkey())!=ENTER) /*當(dāng)壓下鍵不是回車時*/

{

putimage(x,y,rar,XOR_PUT);

if(v==RIGHT) /*右移箭頭時新位置計算*/

if(x>=x0+6*width) /*如果右移到尾,則移動到最左邊*/

{x=x0;m=0;}

else /*否則,右移到下一個位置*/

{x=x+width+width/2;m++;}

if(v==LEFT) /*左移箭頭時新位置計算*/

if(x<=x0) /*如果左移到頭,則移動到最右邊*/

{x=x0+6*width;m=4;}

else /*否則,左移到前一個位置*/

{x=x-width-width/2;m--;}

if(v==UP) /*上移箭頭時新位置計算*/

if(y<=y0) /*如果上移到頭,則移動到最下邊*/

{y=y0+4*height+height/2;n=3;}

else /*否則,移到上邊一個字符位置*/

{y=y-height-height/2;n--;}

if(v==DOWN) /*下移箭頭時新位置計算*/

if(y>=7*height) /*如果下移到尾,則移動到最上邊*/

{y=y0;n=0;}

else /*否則,移到下邊一個字符位置*/

{y=y+height+height/2;n++;}

putimage(x,y,rar,XOR_PUT); /*在新的位置顯示光標箭頭*/

}

c=str1[n*5+m]; /*將字符保存到變量c中*/

if(isdigit(c)||c=='.') /*判斷是否是數(shù)字或小數(shù)點*/

{if(flag==-1) /*如果標志為

-1,表明為負數(shù)*/

{strcpy(str2,"-"); /*將負號連接到字符串中*/

flag=1; /*將標志值恢復(fù)為1*/

}

sprintf(temp,"%c",c); /*將字符保存到字符串變量temp中*/

strcat(str2,temp); /*將temp中的字符串連接到str2中*/

setfillstyle(SOLID_FILL,color+3);

bar(2*width+width/2,height/2,15*width/2,3*height/2);

outtextxy(5*width,height,str2); /*顯示字符串*/

}

if(c=='+')

{num1=atof(str2); /*將第一個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/

strcpy(str2,""); /*將str2清空*/

act=1; /*做計算加法標志值*/

setfillstyle(SOLID_FILL,color+3); /*設(shè)置用淡綠色實體填充*/

bar(2*width+width/2,height/2,15*width/2,3*height/2);/*畫矩形*/

outtextxy(5*width,height,"+"); /*顯示字符串*/

}

if(c=='-')

{if(strcmp(str2,"")==0) /*如果str2為空,說明是負號*/

flag=-1; /*設(shè)置負數(shù)標志*/

else

{num1=atof(str2); /*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/

strcpy(str2,""); /*將str2清空*/

act=2; /*做計算減法標志值*/

setfillstyle(SOLID_FILL,color+3);

bar(2*width+width/2,height/2,15*width/2,3*height/2);

outtextxy(5*width,height,"-");

}

}

if(c=='*')

{num1=atof(str2);

strcpy(str2,"");

act=3; /*做計算乘法標志值*/

setfillstyle(SOLID_FILL,color+3);

bar(2*width+width/2,height/2,15*width/2,3*height/2);

outtextxy(5*width,height,"*");

}

if(c=='/')

{num1=atof(str2);

strcpy(str2,"");

act=4; /*做計算除法標志值*/

setfillstyle(SOLID_FILL,color+3);

bar(2*width+width/2,height/2,15*width/2,3*height/2);

outtextxy(5*width,height,"/");

}

if(c=='^')

{num1=atof(str2);

strcpy(str2,"");

act=5; /*做計算乘方標志值*/

setfillstyle(SOLID_FILL,color+3);

bar(2*width+width/2,height/2,15*width/2,3*height/2);

outtextxy(5*width,height,"^");

}

if(c=='%')

{num1=atof(str2);

strcpy(str2,"");

act=6; /*做計算模運算乘方標志值*/

setfillstyle(SOLID_FILL,color+3);

bar(2*width+width/2,height/2,15*width/2,3*height/2);

outtextxy(5*width,height,"%");

}

if(c=='=')

{num2=atof(str2); /*將第二個操作數(shù)轉(zhuǎn)換為浮點數(shù)*/

switch(act) /*根據(jù)運算符號計算*/

{case1:result=num1+num2;break; /*做加法*/

case2:result=num1-num2;break; /*做減法*/

case3:result=num1*num2;break; /*做乘法*/

case4:result=num1/num2;break; /*做除法*/

case5:result=pow(num1,num2);break; /*做x的y次方*/

case6:result=fmod(num1,num2);break;/*做模運算*/

}

setfillstyle(SOLID_FILL,color+3); /*設(shè)置用淡綠色實體填充*/

bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆蓋結(jié)果區(qū)*/

sprintf(temp,"%f",result); /*將結(jié)果保存到temp中*/

outtextxy(5*width,height,temp); /*顯示結(jié)果*/

strcpy(str2,temp); /*將結(jié)果復(fù)制到str2中*/

}

if(c=='c')

{num1=0;num2=0;flag=1; /*將兩個操作數(shù)復(fù)位0,符號標志為1*/

strcpy(str2,""); /*將str2清空*/

setfillstyle(SOLID_FILL,color+3); /*設(shè)置用淡綠色實體填充*/

bar(2*width+width/2,height/2,15*width/2,3*height/2); /*覆蓋結(jié)果區(qū)*/

outtextxy(5*width,height,"0."); /*顯示字符串*/

}

if(c=='Q')exit(0); /*如果選擇了q回車,結(jié)束計算程序*/

}

putimage(x,y,rar,XOR_PUT); /*在退出之前消去光標箭頭*/

return; /*返回*/

}

/*窗口函數(shù)*/

voidmwindow(char*header)

{

intheight;

cleardevice(); /*清除圖形屏幕*/

setcolor(MaxColors-1); /*設(shè)置當(dāng)前顏色為白色*/

setviewport(20,20,MaxX/2,MaxY/2,1); /*設(shè)置視口大小*/

height=textheight("H"); /*讀取基本文本大小*/

settextstyle(DEFAULT_FONT,HORIZ_DIR,1); /*設(shè)置文本樣式*/

settextjustify(CENTER_TEXT,TOP_TEXT); /*設(shè)置字符排列方式*/

outtextxy(MaxX/4,2,header); /*輸出標題*/

setviewport(20,20+height+4,MaxX/2+4,MaxY/2+20,1);/*設(shè)置視口大小*/

drawboder(); /*畫邊框*/

}

voiddrawboder(void) /*畫邊框*/

{

structviewporttypevp; /*定義視口類型變量*/

setcolor(MaxColors-1); /*設(shè)置當(dāng)前顏色為白色 */

setlinestyle(SOLID_LINE,0,NORM_WIDTH); /*設(shè)置畫線方式*/

getviewsettings(&vp); /*將當(dāng)前視口信息裝入vp所指的結(jié)構(gòu)中*/

rectangle(0,0,vp.right-vp.left,vp.bottom-vp.top);

}

/*設(shè)計鼠標圖形函數(shù)*/

intarrow()

{

intsize;

intraw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4}; /*定義多邊形坐標*/

setfillstyle(SOLID_FILL,2); /*設(shè)置填充模式*/

fillpoly(8,raw); /*畫出一光標箭頭*/

size=imagesize(4,4,16,16); /*測試圖像大小*/

rar=malloc(size); /*分配內(nèi)存區(qū)域*/

getimage(4,4,16,16,rar); /*存放光標箭頭圖像*/

putimage(4,4,rar,XOR_PUT); /*消去光標箭頭圖像*/

return0;

}

/*按鍵函數(shù)*/

intspecialkey(void)

{

intkey;

while(bioskey⑴==0); /*等待鍵盤輸入*/

key=bioskey(0); /*鍵盤輸入*/

key=key&0xff?key&0xff:key>>8; /*只取特殊鍵的掃描值,其余為0*/

return(key); /*返回鍵值*/

}程序運行結(jié)果如圖5-1所示。其中,Q鍵的作用是退出,C鍵的作用是清零。該計算器可實現(xiàn)加、減、乘、除及乘方的基本運算,且每完成一項運算后需按C鍵清零,方可進行下一項運算的實施。圖5-1計算器操作界面圖

【項目總結(jié)】

C語言是結(jié)構(gòu)化、模塊化、可編譯的通用程序設(shè)計語言,由于其強大的功能、豐富的表達能力、高效的代碼、良好的可移植性和靈活性及較強的硬件控制能力等特點,已被廣泛用于系統(tǒng)軟件、實用程序及應(yīng)用軟件的開發(fā)之中。同時,C語言還具有很強的圖形功能,它所提供的一個包含有70多個圖形函數(shù)的獨立圖形庫,為編程人員繪制豐富多彩的圖形界面提供了途徑。

【知識總結(jié)】

菜單、圖形與窗口設(shè)計是應(yīng)用程序開發(fā)的重要方面。MicrosoftWindowsXP由于具有友好交互、操作簡單、功能豐富的特點,深得計算機大眾用戶的喜愛,并占據(jù)了很大PC操作系統(tǒng)的市場份額。因此,一個良好的軟件必須要有一個良好的人機界面,以方便用戶使用和操作。項目5主要是在TC環(huán)境下,實現(xiàn)C語言中菜單、圖形與窗口等基本功能的圖形圖像設(shè)計。

下面將著重說明如何使用C語言的視頻庫函數(shù)和系統(tǒng)調(diào)用進行菜單、圖形、窗口程序的設(shè)計。5.3.1文本窗口

C語言默認的文本窗口為整個屏幕,共有80列25行的文本單元,每個單元包括一個字符和一個屬性,字符即ASCII碼字符,屬性規(guī)定該字符的顏色和強度。

1.文本窗口的定義

C語言可以定義屏幕上的一個矩形域作為窗口。窗口定義之后,使用有關(guān)窗口的輸入輸出函數(shù)就可以只在此窗口內(nèi)進行文本的操作而不超出窗口的邊界。使用window()函數(shù)定義窗口,window()函數(shù)原型為

voidwindow(intleft,inttop,intright,intbottom);提示:window()庫函數(shù)原型在頭文件conio.h中。實際上在C語言程序設(shè)計中,所有關(guān)于文本窗口的函數(shù)原型均在conio.h頭文件中,所以需要在程序一開始要加上#include"conio.h"包含命令,以保證文本窗口操作函數(shù)的正常調(diào)用。

window()函數(shù)中的形式參數(shù)(intleft,inttop)是文本窗口左上角的坐標,形式參數(shù)(intright,intbottom)是文本窗口右下角的坐標。其中(left,top)和(right,bottom)的取值是相對于整個屏幕而言的。

C語言規(guī)定整個屏幕的左上角坐標為(1,1),右下角坐標為(80,25),并規(guī)定沿水平方向為x軸,方向朝右;沿垂直方向為y軸,方向朝下。若window()函數(shù)中的坐標超過了屏幕坐標的界限,則文本窗口的定義就失去了意義,也就是說窗口的定義將不起作用,但程序編譯鏈接期間并不出錯。

另外,一個屏幕可以定義多個窗口,但現(xiàn)行窗口只能有一個(因為C程序所編譯出來的可執(zhí)行文件一般均運行在以DOS為基本操作系統(tǒng)的單任務(wù)環(huán)境下)。當(dāng)需要使用另一窗口時,可將定義該窗口的window()函數(shù)再調(diào)用一次,此時該窗口便成為了現(xiàn)行窗口。例如,定義一個窗口左上角在屏幕(20,5)處,大小為30列20行的窗口,命令行可寫成:

window(20,5,49,24);/*窗口坐標定位要準確*/

2.文本窗口顏色的設(shè)置

文本窗口顏色的設(shè)置分別包括窗口背景顏色的設(shè)置和窗口內(nèi)顯示字符顏色的設(shè)置。

textbackground()函數(shù)用于設(shè)置文本窗口的背景顏色,其調(diào)用格式為

voidtextbackground(intcolor);

textcolor()函數(shù)用于設(shè)置文本窗口所顯示字符的顏色,其調(diào)用格式為

voidtextcolor(intcolor);

textbackground()函數(shù)和textcolor()函數(shù)參數(shù)中關(guān)于顏色的定義如表5.1所示。表5-1中的符號常量與相應(yīng)的數(shù)值等價,二者可以互換。例如,設(shè)定藍色背景可以使用textbackground⑴;也可以使用textbackground(BLUE),兩者沒有任何區(qū)別,只不過后者比較容易記憶,一目了然。同時,有些顏色僅適用于字符,窗口背景色不能使用。

表5-1文本窗口顏色設(shè)置參數(shù)對照表圖5-2textattr()參數(shù)數(shù)位對照表另外,C語言還提供了一個函數(shù),可以同時設(shè)置文本字符和背景顏色。這個函數(shù)的調(diào)用格式為

voidtextattr(intattr);

其中,參數(shù)attr的值表示顏色編碼信息。attr每一位代表的含義如圖5-2所示。

圖5-2中,低4位cccc設(shè)置字符顏色(0~15),4~6三位bbb設(shè)置背景顏色(0~7),第7位B設(shè)置字符是否閃爍。

假如要設(shè)置一個藍底黃字,定義方法為

textattr(YELLOW+(BLUE<<4));

若再要求字符閃爍,則定義變?yōu)?/p>

textattr(128+YELLOW+(BLUE<<4));注意:

(1)對于背景只有0到7共8種顏色,若取大于7小于15的數(shù),則代表的顏色與減7后的值對應(yīng)的顏色相同。

(2)用textbackground()和textcolor()函數(shù)設(shè)置了窗口的背景與字符顏色后,在沒有用clrscr()函數(shù)清除窗口之前,顏色不會改變。直到使用了函數(shù)clrscr(),整個窗口和隨后輸出到窗口中的文本字符才會變成新顏色。

(3)用textattr()函數(shù)時,背景顏色應(yīng)左移4位,才能使3位背景顏色移到正確數(shù)位。注意并體會textattr()函數(shù)示例中“BLUE<<4”的寫法。下面這個程序?qū)⑹褂藐P(guān)于窗口大小的定義、顏色的設(shè)置等函數(shù),在屏幕的不同位置定義7個窗口,其背景色分別使用了7種不同的顏色。

【例5.1】按照不同窗口背景色在屏幕上輸出多個文本窗口。

源程序如下:

/*程序功能:按照不同窗口背景色在屏幕上輸出多個文本窗口*/

#include"conio.h"

#include"stdio.h"

main()

{

inti;

textbackground(0); /*設(shè)置屏幕背景色*/

clrscr(); /*清除文本屏幕*/

for(i=1;i<8;i++)

{window(10+i*5,5+i,30+i*5,15+i); /*定義文本窗口*/

textbackground(i); /*定義窗口背景色*/

clrscr(); /*清除窗口*/

}

getch();

}程序運行后,將在屏幕上以不同背景顏色重疊顯示出7個文本窗口,并將當(dāng)前窗口定位于最后一個淡灰色窗口。按任意按鍵后程序正常退出。

3.窗口內(nèi)文本的輸入/輸出函數(shù)

(1)輸出函數(shù)。

C語言文本窗口內(nèi)實現(xiàn)文本輸出的函數(shù)包括:

intcprintf("<格式化字符串>",<變量表>);

intcputs(char*string);

intputch(intch);

說明:

cprintf()函數(shù)輸出一個格式化的字符串或數(shù)值到窗口中。它與printf()函數(shù)的用法完全一樣,區(qū)別在于cprintf()函數(shù)的輸出受窗口限制,而printf()函數(shù)的輸出為整個屏幕。②

cputs()函數(shù)輸出一個字符串到屏幕上。它與puts()函數(shù)的用法完全一樣,只是受窗口大小的限制。

putch()函數(shù)輸出一個字符到窗口內(nèi)。

注意:

①使用以上幾種函數(shù),當(dāng)輸出超出窗口的右邊界時會自動轉(zhuǎn)到窗口下一行的開始處繼續(xù)輸出。

②當(dāng)窗口內(nèi)填滿內(nèi)容仍沒有結(jié)束輸出時,窗口屏幕將會自動逐行上卷直到文本輸出結(jié)束為止。

(2)輸入函數(shù)。

實現(xiàn)C語言窗口內(nèi)文本的輸入函數(shù)為

intgetche(void);

說明:getche()函數(shù)類似于getch()函數(shù),都實現(xiàn)從鍵盤上獲得一個字符。兩者唯一的區(qū)別是:getch()函數(shù)在鍵入字符時,在屏幕上并不顯示,而getche()函數(shù)在屏幕上顯示鍵入的字符,且如果輸入字符超過了窗口右邊界,則會被自動轉(zhuǎn)移到下一行的開始位置。

【例5.2】在每個顯示的文本窗口內(nèi)輸出字符串。

源程序如下:

/*程序功能:在每個顯示的文本窗口內(nèi)輸出字符串*/

#include"stdio.h"

#include"conio.h"

main()

{inti;

textbackground(0); /*設(shè)置屏幕背景色*/

clrscr(); /*清除文本屏幕*/

for(i=1;i<8;i++)

{

window(10+i*5,5+i,30+i*5,15+i); /*定義文本窗口*/

textbackground(i); /*定義窗口背景色*/

clrscr();

/*清除窗口*/

cprintf("the%dstwindows",i);

getch();

}

}程序運行后,將會在指定位置顯示文本窗口的同時,在窗口內(nèi)以缺省白色顯示指定的字符串。按任意鍵后繼續(xù)彈出另一個文本窗口并顯示相應(yīng)字符串,依次顯示7個不同顏色的文本窗口及相應(yīng)字符串。

4.屏幕操作函數(shù)

C語言實現(xiàn)屏幕操作的庫函數(shù)主要包括:

voidclrscr(void);

clrscr()函數(shù)的功能是清除當(dāng)前窗口中的文本內(nèi)容,并把光標定位在窗口的左上角(1,1)處。

voidclreol(void);

clreol()函數(shù)的功能是清除當(dāng)前窗口中從光標位置到當(dāng)前行尾的所有字符,但光標位置保持不變。

voidgotoxy(x,y);

gotoxy()函數(shù)的功能是用來定位光標在當(dāng)前窗口中的位置。這里x、y是指光標要定位處的坐標(相對于窗口而言)。當(dāng)x、y超出了窗口的大小時,該函數(shù)就不起作用了。

intgettext(intxl,intyl,intx2,inty2,void*buffer);

intputtext(intx1,inty1,intx2,inty2,void*buffer);

gettext()函數(shù)的功能是將屏幕上指定矩形區(qū)域內(nèi)的文本內(nèi)容存入buffer指針指向的一個內(nèi)存空間。內(nèi)存的大小為:所用字節(jié)大小=行數(shù)*列數(shù)*2。其中,行數(shù)=y2-y1+1;列數(shù)=x2-x1+1。puttext()函數(shù)的功能則是將gettext()函數(shù)存入內(nèi)存buffer中的文字內(nèi)容輸出到屏幕上指定的位置。

intmovetext(intx1,inty1,intx2,inty2,intx3,inty3);

movetext()函數(shù)的功能是將屏幕上左上角為(x1,y1)、右下角為(x2,y2)的一矩形窗口內(nèi)的文本內(nèi)容拷貝到左上角為(x3,y3)的新的位置。該函數(shù)的坐標也是相對于整個屏幕而言的。

注意:

(1)

gettext()函數(shù)和puttext()函數(shù)中的坐標是對整個屏幕而言的,即是屏幕的絕對坐標,而不是相對窗口的坐標。

(2)

movetext()函數(shù)是拷貝而不是移動窗口區(qū)域內(nèi)容,即使用該函數(shù)后,原位置區(qū)域的文本內(nèi)容仍然存在。

【例5.3】文本窗口的內(nèi)容復(fù)制及移動。

源程序如下:

/*程序功能:文本窗口的內(nèi)容復(fù)制及移動*/

#include"stdio.h"

#include"conio.h"

main()

{inti;

char*f[]={"LoadF3","PickAlt-F3","New","SaveF2","Writeto","Directory",

"Changedir","Osshell","QuitAlt-X"};

charbuf[11*16*2]; /*定義實現(xiàn)對文本窗口內(nèi)容存儲的指針*/

clrscr();

textcolor(YELLOW);

textbackground(BLUE);

clrscr(); /*初始化整個屏幕顯示模式*/

gettext(10,2,24,11,buf); /*將指定區(qū)域文本窗口內(nèi)容存儲到指針buf中*/

window(10,2,24,11);

textbackground(RED);

textcolor(YELLOW);

clrscr(); /*定義并顯示一個文本窗口*/

for(i=0;i<9;i++)

{gotoxy(1,i+1);

cprintf("%s",f[i]); /*在文本窗口內(nèi)逐行顯示相應(yīng)字符串*/

}

getch();

movetext(10,2,24,11,40,10); /*復(fù)制指定文本窗口到另一位置*/

puttext(10,2,24,11,buf); /*在原位置恢復(fù)buf原存儲內(nèi)容*/

getch();

}

程序運行結(jié)果顯示了一個含有文本信息的文本窗口的整體移動操作。其具體實現(xiàn)方法為:程序首先定義了一個藍底黃字的整屏,隨后在存儲了由左上角坐標(10,2)、右下角坐標(24,11)組成區(qū)域的原始內(nèi)容(藍底黃字)后,在相同位置重新打開了一個紅底黃字的文本窗口,并顯示了9行信息。按任意鍵后,首先將當(dāng)前坐標為(10,2)、(24,11)所定義文本窗口的內(nèi)容復(fù)制到左上角坐標(40,10)處,而后將原buf存儲的初始文本窗口原始內(nèi)容(藍底黃字)又重新顯示到原始位置。程序運行后,給人的感覺是,文本窗口及其內(nèi)容在鍵入任意鍵后實現(xiàn)了整體的移動。

5.其他操作函數(shù)

C語言經(jīng)常使用的涉及文本窗口操作的還包括其他一些函數(shù):

voidhighvideo(void);

highvideo()函數(shù)的功能是設(shè)置顯示器高亮度顯示字符。

voidlowvideo(void);

lowvideo()函數(shù)的功能是設(shè)置顯示器低亮度顯示字符。

intwherex(void);

intwherey(void);

wherex()函數(shù)和wherey()函數(shù)的功能是返回當(dāng)前窗口光標x、y坐標值。關(guān)于文本窗口的其他操作函數(shù)在此不一一介紹,具體在實際應(yīng)用中,可參照C語言函數(shù)速查表或在TurboC2.0編輯環(huán)境中,利用相應(yīng)幫助信息進一步獲取。

【例5.4】帶邊框文本窗口設(shè)計示例。

源程序如下:

/*程序功能:帶邊框文本窗口設(shè)計示例*/

#include"stdio.h"

#include"conio.h"

main()

{inti;

textbackground(YELLOW);

textcolor(BLACK); /*設(shè)置顏色*/

gotoxy(10,2);

putch(0xda); /*作單線邊框左上角*/

for(i=1;i<30;i++)putch(0xc4); /*作上邊框*/

putch(0xbf); /*作右上角*/

for(i=3;i<9;i++)

{gotoxy(10,i);putch(0xb3); /*作左邊框*/

gotoxy(40,i);putch(0xb3); /*作右邊框*/

}

gotoxy(10,9);

putch(0xc0); /*作左下角*/

for(i=1;i<30;i++)putch(0xc4); /*作下邊框*/

putch(0xd9); /*作右下角*/

window(11,3,39,8); /*定義窗口*/

clrscr();

cprintf("thisisasinglelineboldofwindow\n");

window(1,1,80,25);

textbackground(BLUE);

textcolor(CYAN);

gotoxy(60,12);

putch(0xc9); /*作雙線邊框左上角*/

for(i=1;i<10;i++)putch(0xcd); /*作上邊框*/

putch(0xbb); /*作右上角*/

for(i=13;i<22;i++)

{gotoxy(60,i);putch(0xba); /*作左邊框*/

gotoxy(70,i);putch(0xba); /*作右邊框*/

}

gotoxy(60,22);

putch(0xc8); /*作左下角*/

for(i=1;i<10;i++)putch(0xcd); /*作下邊框*/

putch(0xbc); /*作右下角*/

window(61,13,69,21); /*定義窗口*/

clrscr();

cprintf("thisisadoublelineboldofwindow\n");

window(1,1,80,25);

}

注意:實際程序設(shè)計中,文本窗口大小的定義應(yīng)該比邊框略小(文本窗口包含在邊框區(qū)域內(nèi)),以免文本輸出破壞了邊框的顯示。

【例5.5】利用光條技術(shù)實現(xiàn)對窗口菜單的模擬操作。

源程序如下:

/*程序功能:利用光條技術(shù)實現(xiàn)對窗口菜單的模擬操作*/

#include"dos.h"

#include"conio.h"

main()

{inti,key=0;

char*f[]={"LoadF3","PickAlt-F3","New","SaveF2","Writeto",

"Directory","Changedir","Osshell","QuitAlt-X"};

textcolor(YELLOW);

textbackground(BLUE); /*設(shè)置文本窗口的顏色*/

gotoxy(10,2);

putch(0xda); /*作一單線邊框的文本窗口*/

for(i=1;i<15;i++)putch(0xc4);

putch(0xbf); /*作右上角*/

for(i=3;i<12;i++)

{gotoxy(10,i);putch(0xb3); /*作左邊框*/

gotoxy(25,i);putch(0xb3); /*作右邊框*/

}

gotoxy(10,12);

putch(0xc0); /*作左下角*/

for(i=1;i<15;i++)putch(0xc4); /*作下邊框*/

putch(0xd9); /*作右下角*/

window(11,3,25,11); /*定義窗口*/

for(i=0;i<9;i++)

{gotoxy(1,i+1);

cputs(f[i]); /*輸出菜單選項*/

}

i=0;

gotoxy(1,1);

textbackground(MAGENTA); /*在第一行菜單項上顯示顏色棒*/

cputs(f[0]);

gotoxy(1,1);

while(key!=45) /*輸入為Alt

+

X時退出*/

{while(bioskey(1)==0); /*等待鍵盤輸入*/

key=bioskey(0);

key=key&0xff?0:key>>8; /*只取特殊鍵值*/

gotoxy(1,i+1);

textbackground(BLUE);

cputs(f[i]); /*恢復(fù)原來的顏色*/

if(key==72)i=i==0?8:i-1; /*上移箭頭將光標上移一行*/

if(key==80)i=i==8?0:i+1; /*下移箭頭將光標下移一行*/

gotoxy(1,i+1);

textbackground(MAGENTA); /*在新行上顯示顏色棒*/

cputs(f[i]);

window(11,3,25,11);

}

}說明:

(1)光條技術(shù)是指文本菜單上的顏色棒可通過箭頭鍵(←、↑、→、↓)作相應(yīng)移動的一種程序?qū)崿F(xiàn)技術(shù)。程序執(zhí)行后可選擇相應(yīng)的動作,同傳統(tǒng)的輸入字符式菜單選擇操作(如DOS命令中的fdisk分區(qū)命令)相比具有簡單、直觀和方便的特點,為大多數(shù)菜單程序設(shè)計所采用。

(2)程序中的光條移動主要靠bioskey()函數(shù)返回特殊鍵進行控制,是在不同背景顏色下將字串重寫所產(chǎn)生的一種視覺效果。

(3)本程序主要表現(xiàn)一個簡單菜單的選擇移動操作,僅作為一個樣例。如針對不同菜單選項實施相應(yīng)的操作,可在輸入判斷中加入對所選擇i值的判斷,以進行相應(yīng)子程序的調(diào)用。5.3.2圖形操作

C語言提供了非常豐富的圖形函數(shù),類似于文本窗口函數(shù)的使用,所有圖形函數(shù)的原型均包含在graphics.h頭文件中。

1.圖形函數(shù)的分類

根據(jù)C語言所提供圖形函數(shù)的功能分類,其主要包括7類函數(shù)。

(1)圖形系統(tǒng)控制函數(shù)。

圖形系統(tǒng)控制函數(shù)initgraph()用于初始化系統(tǒng),以將硬件置于圖形模式下;用detectgraph()函數(shù)來選擇一個驅(qū)動程序和顯示模式;用getdrivername()函數(shù)找出驅(qū)動程序的名字;用getmodename()函數(shù)找出模式名;用setgraphmode()函數(shù)改變圖形模式;用closegraph()函數(shù)關(guān)閉圖形系統(tǒng)。

(2)繪圖及填充函數(shù)。

C語言繪圖函數(shù)可以畫出彩色的線、弧、圓、橢圓、矩形、扇形以及二、三維的條形圖、多邊形及由這些圖形組成的規(guī)則或不規(guī)則的圖形;可以用11種預(yù)定義的模式或自定義模式來填充任何有界區(qū)域;可以控制畫線的粗細、格式及當(dāng)前位置的定位。

例如:arccircle()、drawpoly()、line()、rectangle()等函數(shù)用于畫線段或其他基礎(chǔ)圖形;用floodfill()函數(shù)填充圖形,或者用bar()、fillellipse()、sector()等函數(shù)將繪圖/填充合為一體;用setlinestyle()函數(shù)設(shè)定畫線的粗細;用setfillstyle()函數(shù)選擇一個預(yù)定義的填充模式;用moveto()函數(shù)可以移動當(dāng)前位置等。

(3)屏幕及視口管理函數(shù)。

該類函數(shù)將完成對圖形模式下在屏幕上定義一視口,并利用函數(shù)完成對緩沖區(qū)活動頁的指定。例如:清屏函數(shù)cleardevice();用getpixel()、putpixel()函數(shù)分別取得或繪制指定坐標位置的像元。

(4)正文輸出函數(shù)。

該類函數(shù)完成圖形模式下各類正文的輸出。例如:輸出正文用outtext()和outtextxy()函數(shù);用settextjustify()函數(shù)控制輸出正文的對齊方式;用settextstyle()函數(shù)選擇字符字體、方向及大小等。

(5)顏色控制函數(shù)。

該類函數(shù)主要完成圖形模式下設(shè)置和返回當(dāng)前背景色或者繪圖色。例如:用getbkcolor()、getcolor()函數(shù)返回當(dāng)前的背景色和繪圖色;用setbkcolor()、setcolor()函數(shù)分別設(shè)置當(dāng)前的背景色和繪圖色。

(6)錯誤處理函數(shù)。

如果調(diào)用圖形函數(shù)時出現(xiàn)錯誤,就需要通過程序中的相應(yīng)函數(shù)返回內(nèi)部錯誤代碼,以方便程序的判斷和調(diào)試。

(7)狀態(tài)查詢函數(shù)。

該類函數(shù)主要用于完成對圖形系統(tǒng)下當(dāng)前各種狀態(tài)的查詢,例如:getgraphmode()函數(shù)返回當(dāng)前圖形驅(qū)動程序模式;gettextsettings()函數(shù)返回當(dāng)前字符字體、正文顯示方向、字符放大系數(shù)等信息。

2.進入C語言的繪圖世界

【例5.6】C語言圖形程序設(shè)計簡單示例。

源程序如下:

/*程序功能:C語言圖形程序設(shè)計簡單示例*/

#include"graphics.h" /*使用圖形函數(shù)必須包含graphics.h頭文件*/

main()

{

intgraphdriver=DETECT,graphmode;

initgraph(&graphdriver,&graphmode,""); /*初始化屏幕格式*/

cleardrvice();

setactivepage(0);

setvisualpage(0);

setlinestyle(4,0xff00,1); /*定義輸出線條格式*/

rectangle(100,100,300,200); /*在屏幕上輸出一個矩形框*/

getch();

closegraph();

}

程序運行結(jié)果如下:

BGIError:Graphicsnotinitialized(use'initgraph')

說明:

(1)程序未能正常輸入所設(shè)定的矩形框,而是顯示“BGIError”錯誤信息。這是因為在C語言使用繪圖系統(tǒng)時,除了在源程序中嵌入頭文件graphics.h以外,在鏈接成可執(zhí)行文件時,還需要使用圖形庫文件graphics.lib。如果編程人員所使用的C語言編譯環(huán)境在TurboC系統(tǒng)安裝時,沒有將graphics.lib文件接入模式庫中,所有涉及圖形操作的執(zhí)行程序均會出現(xiàn)類似的問題。

(2)解決辦法。利用C語言下tlib.exe文件將graphics.lib文件鏈接進入模式庫。其中tlib.exe文件是TurboC集成系統(tǒng)提供的一個庫管理程序,它能將一個庫加到另一個庫中。由于tlib.exe文件缺省在TurboC默認安裝子目錄下(此處設(shè)定為C:\tc);graphics.lib文件缺省在C:\tc\lib子目錄下,所以具體操作步驟為

C:\>cdtc\lib↙

C:\TC\LIB>..\tlibcs+graphics.lib↙

C:\TC\LIB>..\tlibcc+graphics.lib↙

C:\TC\LIB>..\tlibcm+graphics.lib↙

C:\TC\LIB>..\tlibcl+graphics.lib↙

C:\TC\LIB>..\tlibch+graphics.lib↙

這些DOS命令行操作將graphics.lib文件分別添加到TurboC的5個模式庫中。此時,重新編譯并運行例5.4程序,屏幕將輸出一個利用虛線繪制的矩形框。

3.圖形模式的初始化

不同的顯示器適配器具有不同的圖形分辨率。即使是同一顯示器,在不同顯示模式下也有不同圖形分辨率。因此,在屏幕作圖之前,必須根據(jù)顯示器適配器種類將顯示器設(shè)置成為某種圖形模式。在未設(shè)置圖形模式之前,系統(tǒng)默認屏幕為文本模式(80列、25行字符模式),此時所有的圖形函數(shù)均不能工作。設(shè)置屏幕為圖形模式,可用圖形初始化函數(shù):

voidfarinitgraph(intfar*gdriver,intfar*gmode,char*path);

說明:

(1)

gdriver和gmode分別表示圖形驅(qū)動器和模式;path是指圖形驅(qū)動程序所在的目錄路徑。有關(guān)圖形驅(qū)動器、圖形模式的符號常數(shù)及對應(yīng)的分辨率如表5-2所示。

表5-2gdrive、gmode參數(shù)對照表(2)

path指向圖形驅(qū)動程序所在的路徑,即指定(.bgi)文件所存放的路徑。若沒有指定,則系統(tǒng)在指定的路徑和當(dāng)前目錄下尋找

.bgi文件。

例如,如果使用圖形初始化函數(shù)設(shè)置VGA高分辨率圖形模式,則程序段如下:

intgdriver,gmode;

gdriver=VGA;

gmode=VGAHI;

initgraph(&gdriver,&gmode,"");但有時編程人員并不知道所用的圖形顯示器適配器種類,或者需要將編寫的程序用于不同圖形驅(qū)動器。這時,就可使用C語言提供的自動檢測顯示器硬件的函數(shù),其調(diào)用格式為

voidfardetectgraph(int*gdriver,*gmode);

其中,gdriver和gmode的意義與上面相同,則程序段如下:

intgdriver,gmode;

detectgraph(&gdriver,&gmode); /*自動測試硬件*/

initgraph(&gdriver,&gmode,""); /*根據(jù)測試結(jié)果初始化圖形模式*/這時候,程序先對圖形顯示器自動檢測,然后再根據(jù)檢測結(jié)果,利用圖形初始化函數(shù)對顯示器進行初始化設(shè)置。

同時,C程序還提供了一種更簡單的方法,即用driver=DETECT語句后再跟initgraph()函數(shù)就行了。采用這種方法后,就如同例5.6程序段一開始對屏幕初始化的便捷語句。既然圖形化程序設(shè)計要初始化屏幕,同理,C語言圖形化程序運行完成后,還需要將屏幕恢復(fù)到初期文本窗口環(huán)境。因此,C語言提供了退出圖形狀態(tài)的函數(shù)closegraph()來完成此功能,其調(diào)用格式為

voidfarclosegraph(void);

調(diào)用該函數(shù)后,程序即可退出圖形狀態(tài)而進入文本方式(TurboC默認方式),并釋放用于保存圖形驅(qū)動程序和字體的系統(tǒng)內(nèi)存。

4.背景和作圖顏色的設(shè)置

對于圖形模式下屏幕顏色的

溫馨提示

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

評論

0/150

提交評論