二、C的图形模式编程2.1图形编程基础VC+EasyX库里提供了图形函数就可以在VC环境下进行图形编程。对图形函数的操作都是在视口(Viewport)上进行。用户可以在屏幕上定义大小不同的视口,若不定义视口大小,它就是整个屏幕。视口是在图形屏幕状态下的概念,用户可访问的最小单位是一个像素(像素这一术语最初用来指显示器上最小的、单独的发光点单元。然而现在,其含义拓宽为指图形显示器上的最小可访问点)。文本与图形都可以在视口上显示。图形视口的左上角坐标为(0,0)。例如:分辨率为640*480的视口像素点的定位显示器在图形模式下工作时,显示的单位是像素点,通过控制各像素点的颜色和灰度等级来形成图形。因此绘图的第一步是进行图形模式的初始化,系统进入绘图模式。(1)initgraph()图形初始化函数用法:HWNDinitgraph(intwidth,intheight,intflag=NULL);示例:以下局部代码创建一个尺寸为640x480的绘图环境:initgraph(640,480);例2-1:调用initgraph()设置640*480的图形模式,在屏幕中央显示如下的图形。参考代码:#includegraphics.h#includeconio.hintmain(){initgraph(640,480);line(200,240,440,240);line(320,120,320,360);getch();(640*480)的图形视口(0,0)639123...479xyclosegraph();return0;}[学习单步执行]试着单步执行刚才的程序,由于绘图和多线程等因素的限制,请务必按照以下步骤尝试(熟练了以后就不用了):1.将VC取消最大化,并缩小窗口,能看到代码就行。2.按一下F10(单步执行),会看到屏幕上出现一个黄色的小箭头,指示将要执行的代码。3.当箭头指向initgraph()语句时,按F10,能看到窗口发生了变化。4.将新的绘图窗口和VC并排放,相互不要有覆盖。这步很重要,否则绘图内容将会被VC窗口覆盖。5.F10执行getch后,记得激活绘图窗口,并按任意键,否则程序不会继续执行。6.closegraph后,直接按F5执行全部剩余程序,结束。单步执行很重要,可以让你知道程序执行到哪里是什么效果,哪条语句执行出了问题等等。例2-2:更进一步,打印出分辨率,并在屏幕中央显示如下的图形参考代码#includestdio.h#includegraphics.h#includeconio.h#defineWIDTH150/*矩形的宽度*/#defineHEIGHT100/*矩形的高度*/intstartX,startY;/*矩形的左上角坐标*/intmaxX;intmaxY;voidinit();/*图形模式的初始化*/voidshowText();/*显示文本*/voiddrawK();/*画图形*/intmain(){init();showText();drawK();closegraph();return0;}voidinit(){initgraph(640,480);maxX=getmaxx();maxY=getmaxy();setbkcolor(BLACK);/*设置背景色为黑色*/cleardevice();/*清屏*/}voidshowText(){charstr[50];sprintf(str,(%d,%d),maxX,maxY);/*将要显示的分辩率以字符串形式保存到str*/outtextxy(maxX/4,maxY/4,str);/*在指定位置显示字符串str*/}voiddrawK(){startX=(maxX-WIDTH)/2;startY=(maxY-HEIGHT)/2;setcolor(WHITE);rectangle(startX,startY,startX+WIDTH,startY+HEIGHT);setcolor(YELLOW);line(startX,startY,startX+WIDTH,startY+HEIGHT);line(startX+WIDTH,startY,startX,startY+HEIGHT);setcolor(RED);circle(maxX/2,maxY/2,30);getch();//暂停,任意健继续}例2-3:用若干个小矩形块画一个围墙的效果,如下图:参考代码:#includegraphics.h#includeconio.hintmaxX;intmaxY;voidinit(){initgraph(640,480);maxX=getmaxx()+1;maxY=getmaxy()+1;}voiddrawWall(void){inti,j;intleft,right,top,bottom;setbkcolor(BLACK);cleardevice();setlinecolor(WHITE);left=50;right=maxX-50;top=50;bottom=maxY-50;for(i=left;i=right;i+=10){rectangle(i,top,i+9,top+9);rectangle(i,bottom,i+9,bottom+9);}for(i=top;i=bottom;i+=10){rectangle(left,i,left+9,i+9);rectangle(right,i,right+9,i+9);}getch();/*暂停,任意健继续*/}intmain(){init();/*图形模式初始化*/drawWall();/*画围墙*/closegraph();/*关闭图形模式*/return0;}2.2学会更多的绘图函数一、常用的绘图函数1、画点、画线putpixel(x,y,c);//画点(x,y),颜色cline(x1,y1,x2,y2);//画直线(x1,y1)-(x2,y2),都是整型2、画(空心)圆、椭圆、矩形、画弧、多边形等circle(x,y,r);//画圆,圆心为(x,y),半径为rellipse(left,top,right,bottom);//画椭圆,参数为外切矩形的左上、右下角的坐标rectangle(left,top,right,bottom);//画矩形,参数为矩形的左上、右下角的坐标arc(intleft,inttop,intright,intbottom,doublestangle,doubleendangle);//画椭圆弧…3、画(实心)圆、椭圆、矩形等fillcircle(x,y,r);//画填充圆(有边框)。fillellipse(left,top,right,bottom);//画填充的椭圆(有边框)。fillrectangle(left,top,right,bottom));//画填充矩形(有边框)。solidcircle(x,y,r);//画填充圆(无边框)。solidellispe(left,top,right,bottom);//画填充的椭圆(无边框)。soliderectangle(left,top,right,bottom);//画填充圆(无边框)。…还有很多绘图函数,请参考绘图帮助文件。二、设置画线颜色voidsetlinecolor(COLORREFcolor);//设置画线颜色(1)常用的颜色常量可以用:BLACK黑DARKGRAY深灰BLUE蓝LIGHTBLUE亮蓝GREEN绿LIGHTGREEN亮绿CYAN青LIGHTCYAN亮青RED红LIGHTRED亮红MAGENTA紫LIGHTMAGENTA亮紫BROWN棕YELLOW黄LIGHTGRAY浅灰WHITE白(2)配出更多的颜色颜色除了前面写的16种以外,还可以自由配色。格式:RGB(r,g,b)r/g/b分别表示红色、绿色、蓝色,范围都是0~255。例如,RGB(255,0,0)表示纯红色。红色和绿色配成黄色,因此RGB(255,255,0)表示黄色。嫌调色麻烦可以用画笔里面的调色试试,调好了以后直接将数值抄过来就行。例如,画两条红色浓度为200的直线,可以这么写:setlinecolor(RGB(200,0,0));line(100,100,200,100);line(100,120,200,120);(3)用数字表示颜色除了用RGB(r,g,b)方式外,还可以用16进制表示颜色,格式:0xbbggrr例如,setlinecolor(0x0000ff)和setlinecolor(RGB(255,0,0))是等效的。例2-4:编程实现红色、蓝色交替画线#includegraphics.h#includestdio.h#includeconio.hintmain(){initgraph(640,480);for(inty=100;y200;y+=10){if(y/10%2==1)//判断奇数行偶数行setcolor(RGB(255,0,0));elsesetcolor(RGB(0,0,255));line(100,y,300,y);}getch();closegraph();return0;}例2-5:画一个圆形的渐变色。#includegraphics.h#includeconio.h#includemath.h#definePI3.14intmain(){initgraph(640,480);intc;doublea;intx,y,r=200;for(a=0;aPI*2;a+=0.0001){x=(int)(r*cos(a)+320+0.5);y=(int)(r*sin(a)+240+0.5);c=(int)(a*255/(2*PI)+0.5);setcolor(RGB(c,0,0));line(320,240,x,y);}getch();closegraph();return0;}作业:画10个颜色渐变的同心圆,半径以30递增,颜色为红在[0—255]内十等分。三、设置填充色和填充样式voidsetfillcolor(COLORREFcolor);voidsetfillstyle(intstyle,longhatch=NULL,IMAGE*ppattern=NULL);四、任意封闭图形的填充voidfloodfill(intx,inty,COLORREFborder);参数:x,y待填充区域内任意点的x,y坐标。border待填充区域的边界颜色,填充动作在该颜色围成的封闭区域内填充。2.3实现简单动画:所谓动画,其实是连续显示一系列图形而已。方法一:利用绘图函数和延时Sleep()函数相互配合,先画一幅图形,让它延迟一个时间(视觉暂留),然后擦除图像,在新位置再画另一幅,如此反复,形成动态效果。算法:while(1){在新位置绘制图像;延时;擦除图像;}延时函数:voidSleep(intn);功能:产生n毫秒的延时,程序暂停。例如延时3秒,可以用Sleep(3000);例2-6:实现一条直线从上到到下移动#includegraphics.h#includeconio.hvoidmain(){initgraph(640,480);for(inty=0;y480;y++){setcolor(GREEN);//绘制绿色直线line(0,y,639,y);Sleep(10);//延时setcolor(BLACK);//绘制黑色直线(即擦掉之前画的绿线)line(0,y,639,y);}closegraph();}例2-7:实现一个从左向右移动的圆。#includegraphics.h#includeconio.hvoidmain(){initgraph(640,480);for(intx=100;x540;x+=20){setcolor(YELLOW);//绘制黄线、绿色填充的圆setfillcolor(GREEN);fillcir