下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 VC6

VC6.0简单绘图说明

VC6

原谅俄没你想象中旳坚强
2017-09-27 0人阅读 举报 0 0 暂无简介

简介:本文档为《VC6doc》,可适用于综合领域

第二章VC简单绘图说明许多学编程的都是从C语言开始入门的而目前的现状是:有些学校以TurboC为环境讲C语言只是TurboC的环境实在太老了复制粘贴都很不方便。有些学校直接拿VC来讲C语言因为VC的编辑和调试环境都很优秀并且VC有适合教学的免费版本。可惜在VC下只能做一些文字性的练习题想画条直线画个圆都很难还要注册窗口类、建消息循环等等初学者会受严重打击的。初学编程想要绘图就得用TC很是无奈。还有计算机图形学这门课程的重点是绘图算法而不是Windows编程。所以许多老师不得不用TC教学因为Windows绘图太复杂了会偏离教学的重点。新的图形学的书有不少是用的OpenGL可是门槛依然很高。要给初学者一个简单的学习平台就要VC的开发平台和TC的简单的绘图功能于是就有了这个EasyX库我们需要在VC下下载安装EasyX库下载地址:http:wwweasyxcn。下面是VC下简单绘图函数的基本说明。系统支持操作系统版本:Windows及以上系统。编译环境版本:VisualC(xx)(xx)。安装请先将下载的压缩包解压缩然后执行Setuphta并跟随提示安装。安装程序会检测已经安装的VC版本并根据选择将对应的h和lib文件安装至VC的include和lib文件夹内。安装程序不会修改注册表或者本机的任何文件。如果需要手动安装请根据下面的文件列表说明将安装包里的相关文件分别复制到VC对应的include和lib文件夹内或者将include和lib文件夹放到任意位置然后修改VC中的Lib和Include的引用路径。卸载由于安装程序并不改写注册表因此在“添加删除程序”中不会看到EasyX的卸载项。如需卸载请执行相应版本的Setuphta并根据提示卸载文件列表说明下载的压缩包里文件列表及对应说明如下:压缩包 ├include<文件夹> │ └graphicsh   *程序需要引用的头文件* ├lib<文件夹> │ ├amd<文件夹> │ │ ├graphicswlib *VCVCMBCS库文件(x)* │ │ └graphicswulib *VCVCUnicode库文件(x)* │ ├graphicslib  *VCMBCS库文件* │ ├graphicsulib  *VCUnicode库文件* │ ├graphicswlib  *VCVCMBCS库文件(x)* │ └graphicswulib  *VCVCUnicode库文件(x)* ├EasyXHelpchm   *帮助文件* └Setuphta    *安装程序项目依赖*使用上基本和TurboC没太大区别。启动VisualC创建一个控制台项目(WinConsoleApplication)然后添加一个新的代码文件(cpp)并引用graphicsh头文件就可以了。来看一个简单例子:【例】画一个圆。#include<graphicsh>   *就是需要引用这个图形库*#include<conioh>voidmain(){  initgraph(,) *这里和TC略有区别*  circle(,,)*画圆圆心(,)半径*  getch()       *按任意键继续*  closegraph()     *关闭图形界面*} TC绘图有不少区别的比如颜色上TC只有色而这个库支持了真彩色。还有这个库增加了鼠标、批量绘图、读取图片(点阵或矢量)等功能。几个基本概念颜色EasyX使用bit真彩色不再支持调色板模式。表示颜色有以下几种办法:)用预定义颜色常量如下表所示:常量值颜色 常量值颜色BLACK黑DARKGRAYx深灰BLUExA蓝LIGHTBLUExFC亮蓝GREENxA绿LIGHTGREENxFC亮绿CYANxAA青LIGHTCYANxFCFC亮青REDxA红LIGHTREDxFC亮红MAGENTAxAA紫LIGHTMAGENTAxFCFC亮紫BROWNxA棕YELLOWxFCFC黄LIGHTGRAYxAAA浅灰WHITExFCFCFC白表预定义颜色常量)用进制的颜色表示形式为:xbbggrr(bb=蓝gg=绿rr=红))用RGB宏合成颜色。详见RGB。)用HSLtoRGB、HSVtoRGB转换其它色彩模型到RGB颜色。详见HSLtoRGB、HSVtoRGB。以下是部分设置前景色的方法:setcolor(xff)setcolor(BLUE)setcolor(RGB(,,))setcolor(HSLtoRGB(,,))坐标在EasyX中坐标分两种:逻辑坐标和物理坐标。)逻辑坐标逻辑坐标是在程序中用于绘图的坐标体系。坐标默认的原点在屏幕的左上角X轴向右为正Y轴向下为正度量单位是像素。坐标原点可以通过setorigin()函数修改坐标轴方向可以通过setaspectratio()函数修改缩放比例可以通过setaspectratio()函数修改。在本书中凡是没有注明的坐标均指逻辑坐标。)物理坐标物理坐标是描述设备的坐标体系。坐标原点在屏幕的左上角X轴向右为正Y轴向下为正度量单位是像素。坐标原点坐标轴方向缩放比例都不能改变。设备所谓“设备”简单来说就是绘图表面。在EasyX中设备分两种一种是默认的绘图窗口另一种是IMAGE对象。通过SetWorkingImage()函数可以设置当前用于绘图的设备。设置当前用于绘图的设备后所有的绘图函数都会绘制在该设备上。函数说明EasyX函数共分以下几大类:绘图环境相关函数颜色表示及相关函数绘制图形相关函数文字输出相关函数图像处理相关函数鼠标相关函数其它函数。函数的详细说明详见附录A。简单绘图【例】实现一个简单绘图。#include<graphicsh>      *绘图库头文件绘图语句需要*#include<conioh>        *控制台输入输出头文件getch()语句需要*voidmain(){  initgraph(,)    *初始化x的绘图屏幕*  line(,,,)  *画线(,)(,)*  line(,,,)  *画线(,)(,)*  getch()          *按任意键*  closegraph()        *关闭绘图屏幕*}说明:创建的绘图屏幕x表示横向有个点纵向有个点。注意:左上角是原点(,)也就是说y轴和数学的y轴是相反的。getch实现按任意键功能按任意键后程序继续执行。否则程序会立刻执行closegraph以至于看不到绘制的内容。【练习题】)用线条画出更多的图形要求不少于条直线并熟悉调试过程。常用的绘图语句常用的绘图语句line(x,y,x,y)*画直线(x,y)(x,y)都是整型*circle(x,y,r)*画圆圆心为(x,y)半径为r*putpixel(x,y,c)*画点(x,y)颜色c*还有很多如画椭圆、圆弧、矩形、多边形等等请参考节函数说明。设置颜色setcolor(c)  *设置绘图颜色如setcolor(RED)设置为红色等*常用的颜色常量可以用:BLACK黑   DARKGRAY深灰BLUE蓝   LIGHTBLUE亮蓝GREEN绿  LIGHTGREEN亮绿CYAN青   LIGHTCYAN亮青RED 红   LIGHTRED 亮红MAGENTA紫  LIGHTMAGENTA 亮紫BROWN棕  YELLOW黄LIGHTGRAY浅灰  WHITE白配出更多的颜色颜色除了前面写的种以外还可以自由配色。格式:RGB(r,g,b)rgb分别表示红色、绿色、蓝色范围都是~。例如RGB(,,)表示纯红色。红色和绿色配成黄色因此RGB(,,)表示黄色。嫌调色麻烦可以用画笔里面的调色试试调好了以后直接将数值抄过来就行。例如画两条红色浓度为的直线可以写:setcolor(RGB(,,))line(,,,)line(,,,)用数字表示颜色除了用RGB(r,g,b)方式外还可以用进制表示颜色格式:xrrggbb例如setcolor(xff)和setcolor(RGB(,,))是等效的。延时语句这个很简单Sleep(n)就可以表示n毫秒的延时。例如延时秒可以用Sleep()【练习题】)绘制更丰富的图形内容不低于行。)将延时语句适当的插入上一小节的练习题的代码中看看执行效果。结合流程控制语句来绘图熟练使用循环语句来控制程序流程。【例】使用for循环语句画条直线。#include<graphicsh>#include<conioh>voidmain(){ initgraph(,) for(inty=y<y=)    line(,y,,y) getch() closegraph()}【例】修改一下循环的范围和间隔。#include<graphicsh>#include<conioh>voidmain(){  initgraph(,) for(inty=y<y) {   setcolor(RGB(,,y))   line(,y,,y) } getch() closegraph()}熟练使用判断语句来控制程序流程。【例】配合if语句实现红色、蓝色交替画线。#include<graphicsh>#include<conioh>voidmain(){ initgraph(,) for(inty=y<y=) {    if(y==)  *判断奇数行偶数行*      setcolor(RGB(,,))    else      setcolor(RGB(,,))    line(,y,,y) } getch() closegraph()}【练习题】)画围棋棋盘。)画中国象棋的棋盘)画国际象棋的棋盘看手册找到颜色填充语句实现过期象棋棋盘的区块填充。数学知识在绘图中的运用数学在绘图中起着重要作用。绘一个全屏的渐变色问题例如如果需要将将~的颜色和~的y轴对应起来:c表示颜色范围~y表示y轴范围~于是:c=yc=y*=y*说明:先算乘法再算除法可以提高精度。【例】绘一个全屏的渐变色。#include<graphicsh>#include<conioh>voidmain(){ initgraph(,) intc for(inty=y<y) {    c=y*    setcolor(RGB(,,c))    line(,y,,y) } getch() closegraph()}画一个圆形的渐变色问题首先我们要用到圆形的基本公式:x*xy*y=r*r让弧度从~*然后需要根据弧度和半径算出(xy)用pi表示圆周率用r表示半径用a表示弧度(小数)用c表示颜色。于是:x=r*cos(a)y=r*sin(a)c=a*(*pi)【例】画一个圆形的渐变色。#include<graphicsh>#include<conioh>#include<mathh>voidmain(){ initgraph(,)  intc  doublea  intx,y,r=  for(a=a<PI*a=)  {    x=(int)(r*cos(a))    y=(int)(r*sin(a))    c=(int)(a*(*PI))    setcolor(RGB(c,,))    line(,,x,y)  }  getch()  closegraph()}实现简单动画所谓动画其实是连续显示一系列图形而已。结合到程序上我们需要以下几个步骤:绘制图像延时擦掉图像循环以上即可实现动画。【例】举一个例子我们实现一条直线从上往下移动。#include<graphicsh>#include<conioh>voidmain(){ initgraph(,)  for(inty=y<y)  {    *绘制绿色直线*    setcolor(GREEN)       line(,y,,y)     Sleep()   *延时**绘制黑色直线(即擦掉之前画的绿线)*    setcolor(BLACK)      line(,y,,y)  }  closegraph()}【例】再看一个例子实现一个圆从左往右跳动。#include<graphicsh>#include<conioh>voidmain(){  initgraph(,)  for(intx=x<x=)    {   *绘制黄线、绿色填充的圆  *     setcolor(YELLOW)    setfillstyle(GREEN)    fillcircle(x,,)        Sleep()  *延时*    *绘制黑线、黑色填充的圆*    setcolor(BLACK)    setfillstyle(BLACK)    fillcircle(x,,)  }  closegraph()}说明:移动的间距小、延时短动画就会越细腻。但当画面较复杂时会带来画面的闪烁。【练习题】)绘制一个沿度移动的球碰到窗口边界后反弹。捕获按键实现动画的简单控制最常用的一个捕获按键的函数:getch()前几课都把这个函数当作“按任意键继续”来用现在我们用变量保存这个按键:charc=getch()然后再做判断即可。不过程序执行到getch()是会阻塞的直到用户有按键才能继续执行。可游戏中总不能因为等待按键而停止游戏执行吧?所以要有一个函数判断是否有用户按键:kbhit()这个函数返回当前是否有用户按键如果有再用getch()获取即可这样是不会阻塞的。即:charcif(kbhit())c=getch()【例】如果有按键就输出相关按键。否则输出“”。每隔毫秒输出一次。按ESC退出。注:ESC的ASCII码是。#include<graphicsh>#include<stdioh>#include<conioh>voidmain(){  charc=  while(c!=)  {    if(kbhit())      c=getch()    else      c=''        printf("c",c)    Sleep()  }}结合上一课的简单动画就可以做出来靠按键移动的图形了。【例】实现as控制圆的左右移动。#include<graphicsh>#include<conioh>voidmain(){  initgraph(,)    intx=    *画初始图形*  setcolor(YELLOW)  setfillstyle(GREEN)  fillcircle(x,,)    charc  while(c!=)  {    *获取按键*    c=getch()        *先擦掉上次显示的旧图形*    setcolor(BLACK)    setfillstyle(BLACK)    fillcircle(x,,)        *根据输入计算新的坐标*    switch(c)    {      case'a':x=break      case'd':x=break      case:break    }        *绘制新的图形*    setcolor(YELLOW)    setfillstyle(GREEN)    fillcircle(x,,)        *延时*    Sleep()  }    closegraph()}【练习题】请继续完成这个程序实现以下功能:)上下的控制)边界检测)结合kbhit实现惯性移动(即按一下方向键圆就会一直向这个方向移动)注:上下左右等按键的控制会返回个字符。由于该系列教程面向初学者因此有兴趣的请查看MSDN。用函数简化相同图案的制作实际中有许多类似的图案如果一一单独绘制太麻烦。于是我们需要一个公用的绘制过程就是函数。例如我们需要画个三角形位于不同的位置。我们可以将绘制单个三角形的过程写成函数函数内是一个独立的程序段这个绘制过程很简单。然后在需要绘制的时候调用这个函数即可。可以通过参数来解决细微差异(图案的坐标、颜色等)。【例】画个位于不同位置的三角形。#include<graphicsh>#include<conioh>*在坐标(x,y)处用颜色c绘制三角形*voidsanjiaoxing(intx,inty,intc){  *设置画线颜色*  setcolor(c)  *画三角形的三条边*  line(x,y,x,y)  line(x,y,x,y)  line(x,y,x,y)}voidmain(){  initgraph(,)*初始化图形窗口*  sanjiaoxing(,,RED)  sanjiaoxing(,,BLUE)  sanjiaoxing(,,GREEN)  sanjiaoxing(,,BLUE)  sanjiaoxing(,,GREEN)  sanjiaoxing(,,GREEN)  getch()*按任意键继续*  closegraph()*关闭图形窗口*}【例】结合循环等控制条件绘制更复杂漂亮的图案。#include<graphicsh>#include<conioh>voidsanjiaoxing(intx,inty,intcolor){  *设置画线颜色*  setcolor(color)  *画三角形的三条边*  line(x,y,x,y)  line(x,y,x,y)  line(x,y,x,y)}voidmain(){  initgraph(,)*初始化图形窗口*  for(intx=x<x=)    for(inty=y<y=)sanjiaoxing(x,y,RGB(x*,y*,))  getch()*按任意键继续*  closegraph()*关闭图形窗口*}运行效果如下图:图运行效果图【练习题】)绘制Windows自带游戏“扫雷”的初始界面。绘图中的位运算位运算和绘图有什么关系?先举个例子来个感性认识:使用XOR运算可以实现擦除图形后不破坏背景这在时钟程序中绘制表针是很有用的。稍后我们会给出这样的例子。位运算的运算法则位运算主要分种:NOT、AND、OR、XOR位运算的运算对象是二进制数(十进制要转换为二进制计算机会自动转换)。运算法则如下:)NOT表示“取反”将二进制位的变、变。C语言用符号~表示。如:二进制:~=用十进制表示就是:~=)AND表示“并且”只有两数的对应二进制位都为结果的二进制位才为否则结果的二进制位为。C语言用符号表示。如:二进制:=用十进制表示就是:=)OR表示“或者”两数的对应二进制位只要有一个是结果的二进制位就是否则结果的二进制位为。C语言用符号|表示。如:二进制:|=用十进制表示就是:|=)XOR表示“异或”两数的对应二进制位不同结果的二进制位为相同结果的二进制位为。C语言用符号^表示。如:二进制:^=以上只是简单介绍一下详细的还是请大家看C语言教程上的讲解。位运算的应用位运算的应用很多例如AND和OR在获取和设置标志位时经常使用。更多的以后大家会逐渐遇到暂时先记下有这么回事。这里着重说一下XOR运算它有一个重要的特性:(a^b)^b=a也就是说a^b之后可能是某些其它数字但是只要再^b一下就又成了a。一些简单的加密就用的XOR的这个特性。至于绘图假如a是背景图案b是将要绘制的图案只要用XOR方式绘图连续绘两次那么背景是不变的。【例】一个简单的绘图XOR运算演示。#include<graphicsh>#include<conioh>voidmain(){  initgraph(,) *初始化x的绘图窗口*  setlinestyle(PSSOLID,,)*设置线宽为这样效果明显*  rectangle(,,,)*画一个矩形当作背景图案*  setwritemode(RXORPEN)*设置XOR绘图模式*  setcolor(RED)  *设置画线颜色*  line(,,,) *画线*  getch()   *等待按任意键*  line(,,,) *画线(XOR方式重复画线会恢复背景图案)*  getch()   *等待按任意键*  closegraph()  *关闭绘图窗口*}运行一下看到第一次画线后矩形与直线相交的部分颜色变成了青色青色就是白色和红色XOR的值。当再次以红色画线时青色部分消失了还原为完整的白色矩形框。【例】写一个钟表程序三个表针用的都是XOR方式绘制。#include<graphicsh>#include<conioh>#include<mathh>voidDraw(inthour,intminute,intsecond){  doubleahour,amin,asec   *时、分、秒针的弧度值*  intxhour,yhour,xmin,ymin,xsec,ysec*时、分、秒针的末端位置*  *计算时、分、秒针的弧度值*  asec=second**PI  amin=minute**PIasec  ahour=hour**PIamin  *计算时、分、秒针的末端位置*  xsec=(int)(*sin(asec))  ysec=(int)(*cos(asec))  xmin=(int)(*sin(amin))  ymin=(int)(*cos(amin))  xhour=(int)(*sin(ahour))  yhour=(int)(*cos(ahour))  *画时针*  setlinestyle(PSSOLID,,)  setcolor(WHITE)  line(,,xhour,yhour)  *画分针*  setlinestyle(PSSOLID,,)  setcolor(LIGHTGRAY)  line(,,xmin,ymin)  *画秒针*  setlinestyle(PSSOLID,,)  setcolor(RED)  line(,,xsec,ysec)}voidmain(){  initgraph(,) *初始化x的绘图窗口*  *绘制一个简单的表盘*  circle(,,)  circle(,,)  circle(,,)  outtextxy(,,"BestAns")  *设置XOR绘图模式*  setwritemode(RXORPEN)*设置XOR绘图模式*  *绘制表针*  SYSTEMTIMEti  *定义变量保存当前时间*  while(!kbhit())  *按任意键退出钟表程序*  {    GetLocalTime(ti)    *获取当前时间*    Draw(tiwHour,tiwMinute,tiwSecond) *画表针*    Sleep()    *延时秒*    Draw(tiwHour,tiwMinute,tiwSecond) *擦表针(擦表针和画表针的过程是一样的)*  }  closegraph()  *关闭绘图窗口*}【练习题】)最后给出的绘制时钟的例子很不完善有不少问题。请完善该程序。例如样式上表盘上没有刻度没有数字指针靠中心的一端应该长出来一点点表盘太简单。还有就是尝试发现并改进功能实现上的问题。用鼠标控制绘图捕获鼠标消息就像捕获按键消息一样简单。对于按键通常我们会先检查是否有按键然后定义一个变量保存按键再然后根据该按键的值执行相应的程序。对于鼠标道理是一样的。先写个代码对比一下:获取按键:       获取鼠标:charc         MOUSEMSGmif(kbhit())      if(MouseHit())c=getch()      m=GetMouseMsg()很简单吧。由于鼠标消息的内容太多不像按键那么简单因此需要用一个结构体来保存。通过该结构体我们可以获取鼠标的如下信息:structMOUSEMSG{  UINTuMsg   *当前鼠标消息*  boolmkCtrl  *Ctrl键是否按下*  boolmkShift *Shift键是否按下*  boolmkLButton*鼠标左键是否按下*  boolmkMButton*鼠标中键是否按下*  boolmkRButton*鼠标右键是否按下*  intx     *当前鼠标x坐标*  inty     *当前鼠标y坐标*  intwheel   *鼠标滚轮滚动值*}其中“当前鼠标消息”可能是以下值:WMMOUSEMOVE  鼠标移动消息WMMOUSEWHEEL  鼠标滚轮拨动消息WMLBUTTONDOWN 左键按下消息WMLBUTTONUP  左键弹起消息WMLBUTTONDBLCLK连续快按两下鼠标左键消息WMMBUTTONDOWN 中键按下消息WMMBUTTONUP  中键弹起消息WMMBUTTONDBLCLK 连续快按两下鼠标中键消息WMRBUTTONDOWN 右键按下消息WMRBUTTONUP  右键弹起消息WMRBUTTONDBLCLK连续快按两下鼠标右键消息例如判断获取的消息是否是鼠标左键按下可以用:if(muMsg==WMLBUTTONDOWN)【例】用红色的点标出鼠标移动的轨迹按左键画一个小方块按Ctrl左键画一个大方块按右键退出。#include<graphicsh>#include<timeh>#include<conioh>voidmain(){  *初始化图形窗口*  initgraph(,)  MOUSEMSGm    *定义鼠标消息*  while(true)  {    *获取一条鼠标消息*    m=GetMouseMsg()    switch(muMsg)    {      caseWMMOUSEMOVE:        *鼠标移动的时候画红色的小点*        putpixel(mx,my,RED)        break      caseWMLBUTTONDOWN:        *如果点左键的同时按下了Ctrl键*        if(mmkCtrl)          *画一个大方块*          rectangle(mx,my,mx,my)        else          *画一个小方块*          rectangle(mx,my,mx,my)        break      caseWMRBUTTONUP:        return  *按鼠标右键退出程序*    }  }  *关闭图形窗口*  closegraph()}【练习题】)画一个填充的三角形用鼠标选择三角形的三个顶点。提示:可以用fillpoly函数画多边形。)写一个“格子涂色”的游戏要求:屏幕上有x的格子屏幕底部有类似画笔中的选色区(随便放上一些常用的颜色)按一下鼠标左键选择选择区的颜色后就作为当前颜色然后再点屏幕上的格子就可以用刚才的颜色填涂相应格子。随机函数游戏中许多情况都是随即发生的。还有一些图案程序例如屏保也是随即运动的。这就需要用随机函数。)随机函数随机函数很简单只有一个:rand()该函数返回~之间的一个整数。(不需要记住这个数字大概知道这个范围就行了)该函数在头文件<stdlibh>中使用前记得引用。【例】简单写个程序测试一下随机函数的使用。#include<stdioh>#include<stdlibh>voidmain(){  intr  for(inti=i<i)  {    r=rand()    printf("dn",r)  }}执行后可以看到输出了个随机数字。)指定范围的随机函数实际中我们经常要产生指定范围的随机函数通常我们用求余数的办法。例如产生~之间的随机数只需要将任意产生的随机数除以求余数即可。求余数的运算符号是我们可以这样做:  r=rand()修改前面的测试程序执行后可以看到产生的数字都是小于的。如果是~之间的怎样求呢?  r=rand()无论产生什么样范围的随机函数都是通过各种运算将随机数的范围,修改为自己需要的范围。)随机种子做了多次试验我们会发现一个问题:虽然产生的数字是随机的但每次产生的数字序列都一样。为了解决这个问题我们需要用“随机种子”。随机函数的产生原理简单来说就是:前一个随机函数的值决定下一个随机函数的值。根据这个原理我们可以知道:只要第一个随机函数的值确定了那么后面数字序列就是确定的。如果我们想的得到不同的数字序列我们需要确定第一个随机函数的值对于设置第一个随机函数的值叫做设置“随机种子”。易知随机种子设置一次即可。设置随机种子的函数如下:srand(种子)通常我们用当前时间来做随机种子:srand((unsigned)time())因为使用time函数所以记得引用<timeh>。)绘图中的应用【例】在屏幕上任意位置画任意颜色的点(按任意键退出)。#include<graphicsh>#include<stdlibh>#include<conioh>#include<timeh>voidmain(){  srand((unsigned)time())  initgraph(,)  intx,y,c  while(!kbhit())  {    x=rand()    y=rand()    c=RGB(rand(),rand(),rand())    putpixel(x,y,c)  }  closegraph()}【练习题】)绘制一个沿度移动的球这个球为任意方向运动碰到边界后任意反弹。数组数组可以实现批量操作。一维数组【例】我们产生个随机数产生后先保存起来然后输出最大。voidmain(){  intn  inti  for(i=i<i)    ni=rand()  *按生成的顺序逆序输出*  for(i=i>=i)    printf("dn",ni)  *找出最大的*  intmax=  for(i=i<i)  {    if(ni>max)      max=ni  }  printf("最大的数字是:dn",max)}【例】绘制一个从屏幕上边任意位置往下落的白色点。#include<graphicsh>#include<stdlibh>#include<conioh>#include<timeh>voidmain(){  srand((unsigned)time())  initgraph(,)  intx=rand()  *点的x坐标*  inty=    *点的y坐标*  while(!kbhit())  {    *擦掉前一个点*    putpixel(x,y,BLACK)    *计算新坐标*    y=    if(y>=)break    *绘制新点*    putpixel(x,y,WHITE)    Sleep()  }  closegraph()}【例】利用数组来产生个随机下落的点。并且每个点落到底部后就回到顶部重新往下落。#include<graphicsh>#include<stdlibh>#include<conioh>#include<timeh>voidmain(){  srand((unsigned)time())  initgraph(,)  *定义点的坐标数组*  intx      *点的x坐标*  inty      *点的y坐标*  inti  *初始化点的初始坐标*  for(i=i<i)  {    xi=rand()    yi=rand()  }  while(!kbhit())  {    for(i=i<i)    {      *擦掉前一个点*      putpixel(xi,yi,BLACK)      *计算新坐标*      yi=      if(yi>=)yi=      *绘制新点*      putpixel(xi,yi,WHITE)    }    Sleep()  }  closegraph()}二维数组理解了一维数组再看二维数组及更多维数组就简单多了看下面程序理解一下二维数组:【例】屏幕上有x的方格按随机顺序在将~的数字写到每个格子上。考虑:我们需要记录这些格子哪些写过数字哪些没写数字。我们用一个二维数组来记录:boolcell写过数字后我们将相应数组的值设置为true。#include<graphicsh>#include<stdlibh>#include<conioh>#include<stdioh>#include<timeh>voidmain(){  intx,y  charnum  srand((unsigned)time())  initgraph(,)  *画格子*  for(x=x<=x=)    for(y=y<=y=)    {      line(x,,x,)      line(,y,,y)    }  *定义二维数组*  boolcell  *初始化二维数组*  for(x=x<x)    for(y=y<y)      cellxy=false  *在每个格子上写数字*  for(inti=i<=i)  {    *找到一个没有写数字的随机格子*    do    {      x=rand()      y=rand()    }while(cellxy==true)    *标记该格子已用*    cellxy=true    *在格子上写数字*    sprintf(num,"d",i)    outtextxy(x*,y*,num)  }  getch()  closegraph()}【练习题】)回顾一下上一小节的练习题绘制一个任意反弹的球。这次将程序修改成屏幕上有个任意反弹的球。)如果反弹的不是球而是点呢?再将某些点之间用线连起来就可以做一个屏保“变幻线”的程序了。试试做一个。)写“涂格子(也叫点灯)”的游戏。详细规则可以试玩网上的各种版本。)写个俄罗斯方块。)写贪吃蛇、扫雷。getimageputimageloadimagsaveimageIMAGE的用法getimageputimageloadimagesaveimage这一组命令和IMAGE对象可以实现图像处理的相关功能下面逐个介绍。加载图片实现加载图片主要分三步:)定义IMAGE对象)读取图片至IMAGE对象)显示IMAGE对象到需要的位置。【例】加载一张jpg格式的图片。#include<graphicsh>#include<conioh>voidmain(){  initgraph(,)  IMAGEimg  *定义IMAGE对象*  loadimage(img,"C:testjpg")  *读取图片到img对象中*  putimage(,,img)  *在坐标(,)位置显示IMAGE对象*  getch()  closegraph()}注意要显示的图片是C:testjpg你可以修改为自己的图片路径。如果只需要加载图片到绘图窗体上那么请将loadimage的第一个参数设置为即可这样就不需要定义IMAGE对象了。保存屏幕区域和加载图片类似我们可以从屏幕的某个区域加载图像至IMAGE对象然后再putimage到需要的地方。获取屏幕区域的代码格式:getimage(IMAGEimg,intx,inty,intw,inth)参数说明:  img:保存该屏幕区域的IMAGE对象  x,y:区域的左上角坐标  w,h:区域的宽和高(注意:不是右下角坐标)。【例】将屏幕的某个区域加载图像至IMAGE对象。#include<graphicsh>#include<conioh>voidmain(){  initgraph(,)  *定义IMAGE对象*  IMAGEimg  *绘制内容*  circle(,,)  line(,,,)  line(,,,)  *保存区域至img对象*  getimage(img,,,,)  *将img对对象显示在屏幕的某个位置*  putimage(,,img)  getch()  closegraph()}移动复杂的图案复杂的图案如果要移动每次都重新绘制显然效率很低移动的时候会出现严重的屏幕闪烁。而getimageputimage的效率十分高我们可以将复杂的图案用getimage保存下来然后再逐步putimage实现复杂图案的移动。【练习题】)用线条、圆等各种基础绘图语句画一个“汽车”然后用getimageputimage实现该“汽车”的平滑移动。)自己学一下帮助中BeginBatchDrawFlushBatchDrawEndBatchDraw三个函数可以进一步优化“平滑移动”的效果。这三个命令挺简单的一看就懂。通过位运算实现颜色的分离与处理颜色基础在EasyX库中颜色是一个int类型的数据转换为进制后的颜色格式是xbbggrr其中bbggrr分别表示两位十六进制的蓝绿红颜色值每种颜色的范围是x~xff转换为十进制就是~。举几个颜色标示的例子:•颜色 直接表示 RGB宏标示•纯绿色 xff RGB(,,)•青色 xffff RGB(,,) 注:青=蓝绿•中灰色 xfff RGB(,,)•黄色 xffff RGB(,,) 注:黄=红绿例如设置绘图颜色为黄色可以多种方法例如:•setcolor(YELLOW)•setcolor(RGB(,,))•setcolor(xffff)获取颜色getpixel是用来获取屏幕颜色的函数其返回值为int类型的颜色。例如:intc=getpixel(,)  *该语句将返回坐标(,)位置的颜色。*颜色分离与处理有时候我们需要修改颜色某一位的值这时可以通过位运算来实现。比如我们想把某一个点的颜色的红色部分去掉可以这么做:intc=getpixel(,)c=xffffputpixel(,)【例】将图片左半部中的红色“去掉”了就像是显示器“缺色”的效果。#include<graphicsh>#include<conioh>voidmain(){  initgraph(,)    *读取图片*  loadimage(,"c:testjpg")    intc  for(intx=x<x)    for(inty=y<y)    {      c=getpixel(x,y)      c=(xff(cxff))|(xff(cxff))|(xff(cxff))      putpixel(x,y,c)    }        getch()    closegraph()}继续实践找到这行:c=xffff我们修改为:c=(xff(cxff))|(xff(cxff))|(xff(cxff))在执行看看效果就成了照片的底片效果。注:通过宏GetRValueGetGValueGetBValue可以直接获取COLORREF中的颜色分量详见帮助。【练习题】)实现提高降低图像亮度的程序。)自己搜索“灰度算法”实现彩色图像转换为灰度图像。窗体句柄窗体句柄窗体句柄是Windows下窗口的标识可以理解为窗口的ID。WindowsSDK中的许多窗口操作函数都需要指明窗体句柄也就是说有了句柄我们可以通过WindowsSDK中的API实现许多高级的窗体控制。函数原型窗体句柄为HWND类型通过GetHWnd()函数可以返回绘图窗体的句柄。其函数原型是:HWNDGetHWnd()使用句柄举个例子设置窗体标题文字的WindowsAPI为:BOOLSetWindowText(HWNDhWnd,LPCTSTRlpString)参数:hWnd:要设置标题文字的窗口句柄lpString:窗体的标题文字是一个指向字符串的指针。返回值:设置成功与否。【例】设置窗体标题文字。#include<graphicsh>#include<conioh>voidmain(){  initgraph(,) *获取窗口句柄* HWNDhwnd=GetHWnd() *设置窗口标题文字* SetWindowText(hwnd,"HelloWorld!") getch() closegraph()}说明:更多的窗体控制函数请参考MSDN。设备上下文句柄EasyX的绘图函数最初是模仿的BGI的函数命名。为了让大家借此学习WindowsGDI绘图EasyX增加了获取HDC句柄的功能。对于WindowsGDI中的绘图函数很多都需要一个HDC句柄。我们用GetImageHDC()函数获取该句柄然后就可以使用WindowsGDI了。【例】获取HDC句柄。#include<graphicsh>#include<conioh>voidmain(){  *初始化绘图窗口并获取HDC句柄*  initgraph(,)  HDChdc=GetImageHDC()  *以下是标准WindowsGDI操作画一条线(相关语句请查阅MSDN)*  MoveToEx(hdc,,,)  LineTo(hdc,,)  *标准WindowsGDI操作结束*    *使之前的WindowsGDI操作生效*  FlushBatchDraw()  *按任意键返回*  getch()  closegraph()}【例】针对IMAGE对象使用GDI绘图函数。#include<graphicsh>#include<conioh>voidmain(){  *初始化绘图窗口*  initgraph(,)  *创建x的IMAGE对象并获取其HDC句柄*  IMAGEimg(,)  HDChdc=GetImageHDC(img)  *以下是标准WindowsGDI操作画一条线(相关语句请查阅MSDN)*  MoveToEx(hdc,,,)  LineTo(hdc,,)  *标准WindowsGDI操作结束*    *将img贴到绘图窗口上:*  putimage(,,img)  *按任意键返回*  getch()  closegraph()}注意:通过GetImageHDC()获取绘图窗口的HDC时绘图后需要执行FlushBatchDraw()使之生效获取IMAGE的HDC无需执行FlushBatchDraw()。这次的内容虽然少但是WindowsGDI的内容相当多所以完成本节的学习还是很不容易的。WindowsGDI并没有设置颜色这样的函数需要创建画笔(画刷)并选入画笔(画刷)并且在不用的时候记得删除。WindowsGDI相当的丰富这里就不多做介绍了感兴趣的请参考相关书籍。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/31

VC6

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利