本文《基于EasyX图形库的多线程绘图应用》由手机部落整理,仅供参考。如果觉得很不错,欢迎点评和分享~感谢你的阅读与支持!

张煜昕

摘要:EasyX 是C++语言进行图形化编程和游戏编程的一种图形库,可以用几何图形构造各种造型及动画,也可以加载图像文件增强其质感。多线程是并发执行的技术,在同一时间完成多项任务,实现能够在同一时间并行执行多个方法,进而提升整体处理性能。通过绘制钟表指针动画、背景音乐、图形颜色变换以及文字闪烁等需求,采用EasyX图形库和多线程技术来完成,其运行稳定,效果良好。

关键词:EasyX多线程绘图

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)30-0226-03

1 模拟钟表整体设计

钟表整体设计包括界面设计和程序设计两部分。界面设计中体现背景图案(应用putimage方法)、背景音乐(应用mciSendString方法)、指针的形状与颜色(应用setlinestyle,setlinecolor方法)、动画的图形及文字(应用setwritemode方法)。程序设计主要考虑应用多线程技术来完成各种效果的并行调用,使得整体效果达到最佳,程序流程图如图1所示。

2 EasyX图形库配置

根据开发环境选择相应的安装包,下载链接:http://www.easyx.cn/downloads/,选择Setup.hta文件进行安装,系统会自动检查你所安装的开发环境,你单击安装就可以了。若自动安装失败,则需要手动配置,将easyx\include文件夹中的两个文件easyx.h和graphics.h拷贝到Visual Studio所在的安装目录VC\include文件夹中,再将easyx\lib\amd64文件夹中的easyx.lib和easyxw.lib拷贝到Visual Studio所在的安装目录VC\lib\amd64文件夹中,最后将easyx\lib文件夹中的四个文件(easyx.lib,easyx6.lib,easyxw.lib,easyxw6.lib)拷贝到Visual Studio所在的安装目录VC\lib文件夹中,EasyX手动配置已完成,就可以使用图形库了。

3 钟表静态界面设计

程序需添加包含文件“graphics.h”“conio.h”“math.h”“windows.h”和“Mmsystem.h”。钟表界面设计包括背景加载(图片和音乐),表盘绘制。程序应用“WINMM.LIB”库文件,调用mciSendString()函数打开、播放mp3格式文件,函数参数写法参考自定义函数Voice()。表盘界面大小应用initgraph()设置,背景加载应用loadimage()和putimage()完成,绘制文字及图形采用EasyX图形库中的函数完成,代码如下所示。

#include

#include

#include

#include

#include

#pragma comment(lib, "WINMM.LIB")

#define PI 3.14159265359

voidDial_plate()

{

initgraph(640, 480);

SetConsoleTitle(L"erwerwe");

// 初始化640 x 480 的繪图窗口

IMAGE img;

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);//设置颜色

fillcircle(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"));

}

void Voice()

{

mciSendString(_T("open Kalimba.mp3 alias bkmusic"), NULL, 0, NULL);

mciSendString(_T("play bkmusic repeat"), NULL, 0, NULL);

}

4 多线程绘图技术应用

根据表盘特效要求创建线程函数ThreadProc_A()和ThreadProc_B()。创建线程函数必须按相应格式定义,返回值类型为DWORD _ stdcall,形参类型为LPVOID。ThreadProc_A()函数实施2秒变化文字颜色,ThreadProc_B()函数实施中心圆填充颜色的变化,Draw(int hour, int minute, int second)函数动态绘制时针、分针及秒针的位置,时间通过系统函数GetLocalTime()获取,程序运行界面如图2所示,两个线程函数及指针绘制函数代码如下。

DWORD _stdcallThreadProc_A(LPVOID lpParameter)

{while (true)

{

if (flag)

{settextcolor(BLUE);

flag = false;

}

else

{

settextcolor(YELLOW);

flag = true;

}

outtextxy(260, 330, _T("西安思源学院"));

Sleep(2000);

}

}

DWORD _stdcallThreadProc_B(LPVOID lpParameter)

{boolean flag1=true;

while(true)

{if (flag)

{setfillcolor(RED);

fillcircle(320, 240, 60);

flag = false;

}

else

{setfillcolor(WHITE);

fillcircle(320, 240, 60);

flag = true;

}

Sleep(500);

}

}

void Draw(int hour, int minute, int second)

{

double a_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;

a_hour = 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);

setlinecolor(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);

}

void main()

{

Dial_plate();

Voice();

CreateThread(NULL,0,ThreadProc_A,NULL,0,NULL);

CreateThread(NULL,0,ThreadProc_B,NULL,0,NULL);

// 设置XOR 绘图模式

setwritemode(R2_XORPEN); // 设置XOR 绘图模式

// 绘制表针

SYSTEMTIME ti; // 定义变量保存当前时间

while (!_kbhit()) // 按任意键退出钟表程序

{

GetLocalTime(&ti;); // 获取当前时间

Draw(ti.wHour, ti.wMinute, ti.wSecond); // 画表针

Sleep(1000); // 延时1

Draw(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].電脑知识与技术,2017,13(32):101-102.

【通联编辑:朱宝贵】

用easyx画电子钟_基于EasyX图形库的多线程绘图应用相关推荐

  1. 用easyx画电子钟_实时钟表 · Joker/EasyX - Gitee.com

    #include #include #include #define high 480 #define width 640 #define PI 3.14159 int main() { initgr ...

  2. 用easyx画五角星_【洛谷日报#195】有个东西叫EasyX

    同样,你也可以来 SD!LTF - 博客园​cnblogs.com 众所周知,控制台可以变得图形化 关于C++控制台上的图形界面,除了一堆printf("--------------&quo ...

  3. 用easyx画电子钟_Canvas入门-利用Canvas绘制好玩的电子时钟

    在这之前 你需要了解一下方法的使用: beginPath() closePath() moveTo() lineTo() fill() stroke() fillRect() clearRect() ...

  4. c语言基于easyX樱花特效,C++基于easyx图形库实现推箱子游戏

    本文实例为大家分享了C++实现推箱子游戏的具体代码,供大家参考,具体内容如下 头文件: #include #include //#include #include #include #include ...

  5. 用easyx画五角星_冷军画了一把破剪刀, 竟然卖到了160万,被专家抨击:乱涂鸦!得奖后专家顿时不说话了...

    本文转自:美术生 ID:mssxcx 最近看到一篇报道 冷军画了一把破烂的剪刀 卖了162.4万(天价)? 这是营销还是创作? △冷军<突变--有刺的剪刀> 这一幅破烂的剪刀中真实的剪刀静 ...

  6. python用matplotlib画五角星_基于Matplotlib的Python绘图

    # 使用该法,不用写plt.show(),以及可以边写边运行 %matplotlib notebook import matplotlib.pyplot as plt plt.rcParams['fo ...

  7. 基于vue的svg画线_基于SVG的Vue图组件库

    基于vue的svg画线 图表 (diagram-vue) A vue component library of diagrams. Vue组件图库. View Demo 查看演示 Download S ...

  8. python画球鞋_基于Python爬虫原理的篮球鞋选择程序的设计与实现

    基于 Python 爬虫原理的篮球鞋选择程序的设计与实现 张世元 [期刊名称] <通讯世界> [年 ( 卷 ), 期] 2019(026)002 [摘要] 伴随着篮球鞋工艺的进步及产业升级 ...

  9. 单片机控制两个步进电机画圆_基于单片机的步进电机转速控制设计详解(附程序)...

    步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角.这 ...

最新文章

  1. ghostwin10系统后不小心重新分区了,其它分区的资料如何找回
  2. Android 8.0 学习(17)---Android8.0中对指纹的新要求
  3. RPC框架的实现原理是什么?-开课吧
  4. NLP --- 命名体识别(NER)
  5. 面经 | NLP算法岗(百度)
  6. 删除数组对象 相同的值 制定数组对象
  7. 【asm基础】使用vs创建asm库
  8. 基于Web的酒店客房管理系统
  9. Element UI 中国省市区级联数据js
  10. Spring Aop(入门篇)
  11. JAVA集合中常见的List和Map用法
  12. navicat连接mysql2003错误_navicat连接失败出现2003怎么办
  13. 如何区分PNP型和NPN型?
  14. 债券数据集:绿色债券数据集、历时新发、发行债券、DCM定价估值四大指标数据
  15. UVALive 4850 Installations——思维
  16. 森浦资讯是一家怎么样的公司
  17. python3常用标准库
  18. Java 基础学习记录
  19. 你以为SSL是安全的吗?
  20. 微信小程序image组件频闪问题

热门文章

  1. 千千静听声控精灵(语音识别)
  2. 搬运! Windbg调试命令详解
  3. nonlinear systems 学习笔记
  4. 【上位机教程】CANopen通信一体化步进电机调试软件操作
  5. 【记录-EXCEL不同表数据匹配】
  6. 从批量图片中找出相同的图片
  7. 资源3(ZY3)号卫星NAD-FWD数据制作DEM
  8. EMC经典问答85问(47-49问)
  9. 空间二连杆机器人标准DH法和改进DH法建系实例
  10. 2012年北邮网研上机