您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 招标投标 > 基于EasyX图形库的多线程绘图应用
龙源期刊网图形库的多线程绘图应用作者:张煜昕来源:《电脑知识与技术》2018年第30期摘要:EasyX是C++语言进行图形化编程和游戏编程的一种图形库,可以用几何图形构造各种造型及动画,也可以加载图像文件增强其质感。多线程是并发执行的技术,在同一时间完成多项任务,实现能够在同一时间并行执行多个方法,进而提升整体处理性能。通过绘制钟表指针动画、背景音乐、图形颜色变换以及文字闪烁等需求,采用EasyX图形库和多线程技术来完成,其运行稳定,效果良好。关键词:EasyX多线程绘图中图分类号:TP311文献标识码:A文章编号:1009-3044(2018)30-0226-031模拟钟表整体设计钟表整体设计包括界面设计和程序设计两部分。界面设计中体现背景图案(应用putimage方法)、背景音乐(应用mciSendString方法)、指针的形状与颜色(应用setlinestyle,setlinecolor方法)、动画的图形及文字(应用setwritemode方法)。程序设计主要考虑应用多线程技术来完成各种效果的并行调用,使得整体效果达到最佳,程序流程图如图1所示。2EasyX图形库配置根据开发环境选择相应的安装包,下载链接:http://,选择Setup.hta文件进行安装,系统会自动检查你所安装的开发环境,你单击安装就可以了。若自动安装失败,则需要手动配置,将easyx\include文件夹中的两个文件easyx.h和graphics.h拷贝到VisualStudio所在的安装目录VC\include文件夹中,再将easyx\lib\amd64文件夹中的easyx.lib和easyxw.lib拷贝到VisualStudio所在的安装目录VC\lib\amd64文件夹中,最后将easyx\lib文件夹中的四个文件(easyx.lib,easyx6.lib,easyxw.lib,easyxw6.lib)拷贝到VisualStudio所在的安装目录VC\lib文件夹中,EasyX手动配置已完成,就可以使用图形库了。3钟表静态界面设计程序需添加包含文件“graphics.h”“conio.h”“math.h”“windows.h”和“Mmsystem.h”。钟表界面设计包括背景加载(图片和音乐),表盘绘制。程序应用“WINMM.LIB”库文件,调用mciSendString()函数打开、播放mp3格式文件,函数参数写法参考自定义函数Voice()。表盘界面大小应用initgraph()设置,背景加载应用loadimage()和putimage()完成,绘制文字及图形采用EasyX图形库中的函数完成,代码如下所示。龙源期刊网(lib,WINMM.LIB)#definePI3.14159265359voidDial_plate(){initgraph(640,480);SetConsoleTitle(Lerwerwe);//初始化640x480的绘图窗口IMAGEimg;loadimage(&img,_T(123.jpg));putimage(0,0,&img);//插入背景图//绘制一个简单的表盘circle(320,240,2);setcolor(YELLOW);setfillcolor(LIGHTBLUE);fillcircle(320,240,160);setcolor(GREEN);setfillcolor(WHITE);//设置颜色龙源期刊网(320,240,60);outtextxy(260,310,_T(学习使我超快乐));//绘制刻度outtextxy(320,85,_T(12));outtextxy(320+150*sin(PI/6),240-150*cos(PI/6),_T(1));outtextxy(320+150*sin(PI/3),240-150*cos(PI/3),_T(2));outtextxy(320+145*sin(2*PI/3),240-145*cos(2*PI/3),_T(4));outtextxy(320+140*sin(5*PI/6),240-140*cos(5*PI/6),_T(5));outtextxy(320,380,_T(6));outtextxy(320+145*sin(7*PI/6),240-145*cos(7*PI/6),_T(7));outtextxy(320+150*sin(8*PI/6),240-150*cos(8*PI/6),_T(8));outtextxy(165,240,_T(9));outtextxy(320+150*sin(10*PI/6),240-150*cos(10*PI/6),_T(10));outtextxy(320+150*sin(11*PI/6),240-150*cos(11*PI/6),_T(11));outtextxy(470,240,_T(3));}voidVoice(){mciSendString(_T(openKalimba.mp3aliasbkmusic),NULL,0,NULL);mciSendString(_T(playbkmusicrepeat),NULL,0,NULL);}4多线程绘图技术应用龙源期刊网()和ThreadProc_B()。创建线程函数必须按相应格式定义,返回值类型为DWORD_stdcall,形参类型为LPVOID。ThreadProc_A()函数实施2秒变化文字颜色,ThreadProc_B()函数实施中心圆填充颜色的变化,Draw(inthour,intminute,intsecond)函数动态绘制时针、分针及秒针的位置,时间通过系统函数GetLocalTime()获取,程序运行界面如图2所示,两个线程函数及指针绘制函数代码如下。DWORD_stdcallThreadProc_A(LPVOIDlpParameter){while(true){if(flag){settextcolor(BLUE);flag=false;}else{settextcolor(YELLOW);flag=true;}outtextxy(260,330,_T(西安思源学院));Sleep(2000);}}DWORD_stdcallThreadProc_B(LPVOIDlpParameter){booleanflag1=true;龙源期刊网(true){if(flag){setfillcolor(RED);fillcircle(320,240,60);flag=false;}else{setfillcolor(WHITE);fillcircle(320,240,60);flag=true;}Sleep(500);}}voidDraw(inthour,intminute,intsecond){doublea_hour,a_min,a_sec;//时、分、秒针的弧度值intx_hour,y_hour,x_min,y_min,x_sec,y_sec;//时、分、秒针的末端位置intxh,yh,xm,ym,xs,ys;//时、分、秒针长出来的部分//计算时、分、秒针的弧度值a_sec=second*2*PI/60;a_min=minute*2*PI/60+a_sec/60;龙源期刊网=hour*2*PI/12+a_min/12;//计算时、分、秒针的末端位置x_sec=320+(int)(120*sin(a_sec));y_sec=240-(int)(120*cos(a_sec));x_min=320+(int)(100*sin(a_min));y_min=240-(int)(100*cos(a_min));x_hour=320+(int)(70*sin(a_hour));y_hour=240-(int)(70*cos(a_hour));xh=320-(int)(25*sin(a_hour));//计算长出部分的端点坐标yh=240+(int)(25*cos(a_hour));xm=320-(int)(20*sin(a_min));ym=240+(int)(20*cos(a_min));xs=320-(int)(15*sin(a_sec));ys=240+(int)(15*cos(a_sec));//画时针setlinestyle(PS_SOLID,10,NULL);setlinecolor(WHITE);line(320,240,x_hour,y_hour);line(320,240,xh,yh);//画分针setlinestyle(PS_SOLID,6,NULL);龙源期刊网(LIGHTGRAY);line(320,240,x_min,y_min);line(320,240,xm,ym);//画秒针setlinestyle(PS_SOLID,2,NULL);setlinecolor(RED);line(320,240,x_sec,y_sec);line(320,240,xs,ys);}voidmain(){Dial_plate();Voice();CreateThread(NULL,0,ThreadProc_A,NULL,0,NULL);CreateThread(NULL,0,ThreadProc_B,NULL,0,NULL);//设置XOR绘图模式setwritemode(R2_XORPEN);//设置XOR绘图模式//绘制表针SYSTEMTIMEti;//定义变量保存当前时间while(!_kbhit())//按任意键退出钟表程序{GetLocalTime(&ti);//获取当前时间龙源期刊网(ti.wHour,ti.wMinute,ti.wSecond);//画表针Sleep(1000);//延时1Draw(ti.wHour,ti.wMinute,ti.wSecond);//擦表针}closegraph();//关闭绘图窗口}主函数顺序调用Dial_plate()、Voice()完成静态界面展示,紧接着启动两个线程,分别启动线程函数ThreadProc_A()和ThreadProc_B(),实现背景颜色的变化。应用_kbhit()函数判断是否有按键事件发生,若没有,获取系统时间,间隔一秒绘制时针、分针和秒针,若有单击事件,程序退出。5结束语EasyX图形库是实现复杂图形展示、模拟动画的利器,它缩短程序开发的周期,增强程序的渲染程度,减少程序员的编码量,图形库配置简单,是VS集成开发环境很好的图形库,EasyX图形库有很丰富的参考资料,值得我们掌握。要实现多个独立的动画效果,采用多线程技术,创建多线程来实现也是不错的选择。参考文献:[1]宋雅娟,边晶.基于easyX动画案例开发导向的C语言程序设计课程教学方法研究[J].长春大学学报,2018,28(06):111-115+119.[2]赵敏,庞蕊.基于EasyX图形库的C语言课程改革研究与实践[J].电脑知识与技术,2015(32).[3]孙经纬,孙广中,詹石岩,等.SA*:一种多线程路径规划算法[J].地球信息科学学报,2018,20(06):753-761.[4]李琳.探讨C++编程中避免代码冗余的技巧[J].电脑知识与技术,20
本文标题:基于EasyX图形库的多线程绘图应用
链接地址:https://www.777doc.com/doc-4184805 .html