使用c语言easy—x库实现实时钟表

先了解一下easy-x库

EasyX 是针对 C++ 的图形库,可以帮助 C++语言初学者快速上手图形和游戏编程。
可以通过官网下载,文件很小,
easy-x的支持头文件是

#include<graphics.h>

下载之后双击打开会有所有easy-x函数的语法和作用,中文软件,上手很快在这里插入图片描述

分割线,开始钟表制作

这是最终的效果图
在这里插入图片描述

第一步:

新建画布

    initgraph(Width,High);

Width,High在开头定义为常量

第二步

在画布中央绘制一个圆
定义圆心坐标为(Width/2,High/2)

int center_x=Width/2;int center_y=High/2;

绘制一个圆,颜色为蓝色,半径为Width/5+20

setcolor(BLUE);circle(center_x,center_y,Width/5+20);

在这里插入图片描述

第三步

绘制秒针

	//定义秒针长度int secondlength=Width/5;//画秒针setlinestyle(PS_SOLID,2);//定义线的类型,宽度为2setcolor(BLUE);//定义颜色为蓝色line(center_x,center_y,secondend_x,secondend_y);

在这里插入图片描述

第三部

实现转动
思路:使用三角函数知识,控制secondend_x,secondend_y的移动

  1. 转动角度:每分钟转动2*PI,则每秒转动2*PI/60,获得当前系统时间的秒值,乘以每秒转动的角度,即可得出当前时间应该转动的角度
    注意:三角函数需要#include<math.h>支持
//实现秒针转动
SYSTEMTIME ti;//获取系统时间
GetLocalTime(&ti);//得当当前系统时间float secondangle=0;//秒针转动的角度secondangle=ti.wSecond*2*PI/60;//每秒转动的角度等于当前时间*2*PI/60secondend_x=center_x+secondlength*sin(secondangle);secondend_y=center_y-secondlength*cos(secondangle);

在这里插入图片描述
2. 动画的实现:思路:每次绘制完一帧图像后,绘制一个与背景颜色一样的秒针,隐藏前一个秒针,并使用while(1)实现死循环

SYSTEMTIME ti;//获取系统时间
while(1){GetLocalTime(&ti);//得当当前系统时间//实现秒针转动secondangle=ti.wSecond*2*PI/60;secondend_x=center_x+secondlength*sin(secondangle);secondend_y=center_y-secondlength*cos(secondangle);//画秒针setlinestyle(PS_SOLID,2);//定义线的类型,宽度为2setcolor(BLUE);//定义颜色为蓝色line(center_x,center_y,secondend_x,secondend_y);//隐藏前一个秒针setcolor(BLACK);line(center_x,center_y,secondend_x,secondend_y);}

但是我们发现图像一直在闪烁我们加上sleep也不行,easyx提供了批量绘图函数BeginBatchDraw();FlushBatchDraw();EndBatchDraw();
具体使用方法看百度
注意:sleep需要#include<conio.h>支持

SYSTEMTIME ti;//获取系统时间BeginBatchDraw();while(1){GetLocalTime(&ti);//得当当前系统时间//实现秒针转动secondangle=ti.wSecond*2*PI/60;secondend_x=center_x+secondlength*sin(secondangle);secondend_y=center_y-secondlength*cos(secondangle);//画秒针setlinestyle(PS_SOLID,2);//定义线的类型,宽度为2setcolor(BLUE);//定义颜色为蓝色line(center_x,center_y,secondend_x,secondend_y);FlushBatchDraw();Sleep(50);//隐藏前一个秒针setcolor(BLACK);line(center_x,center_y,secondend_x,secondend_y);}EndBatchDraw();

在这里插入图片描述

类似的,画出分针和时针,注意时针一个周期是12小时,所以时针的角度应该是
hourAngle=ti.wHour*2*PI/12;
注意代码结构,先是定义,然后FlushBatchDraw();批量绘制,最后隐藏
拿出代码

float secondangle=0;//秒针转动的角度float minuteangle=0;//分针转动的角float hourAngle=0;//定义时针转动的角SYSTEMTIME ti;//获取系统时间BeginBatchDraw();while(1){GetLocalTime(&ti);//得当当前系统时间//实现秒针转动secondangle=ti.wSecond*2*PI/60;secondend_x=center_x+secondlength*sin(secondangle);secondend_y=center_y-secondlength*cos(secondangle);//实现分针转动minuteangle=ti.wMinute*2*PI/60;minuteend_x=center_x+minutelength*sin(minuteangle);minuteend_y=center_y-minutelength*cos(minuteangle);//实现时针转动hourAngle=ti.wHour*2*PI/12;hourEnd_x=center_x+hourlength*sin(hourAngle);hourEnd_y=center_y-hourlength*cos(hourAngle);//画秒针setlinestyle(PS_SOLID,2);//定义线的类型,宽度为2setcolor(BLUE);//定义颜色为蓝色line(center_x,center_y,secondend_x,secondend_y);//画分针setlinestyle(PS_SOLID,2);//定义线的类型,宽度为2setcolor(YELLOW);//定义颜色为黄色line(center_x,center_y,minuteend_x,minuteend_y);//画分针setlinestyle(PS_SOLID,3);//定义线的类型,宽度为3setcolor(RED);//定义颜色为黄色line(center_x,center_y,hourEnd_x,hourEnd_y);setcolor(BLUE);FlushBatchDraw();Sleep(50);//隐藏前一个秒针setcolor(BLACK);line(center_x,center_y,secondend_x,secondend_y);//隐藏前一个分针	setcolor(BLACK);line(center_x,center_y,minuteend_x,minuteend_y);//隐藏前一个时针setcolor(BLACK);line(center_x,center_y,hourEnd_x,hourEnd_y);}EndBatchDraw();

在这里插入图片描述

最后,刻画表盘

同样是使用三角函数知识,可以类比指针画,我使用了一种及其复杂和智障的方法画,先画出了12,3,6,9,然后再一个一个刻画,写完才想到懒得改了
easyx中文字的输入用到outtextxy函数以下为outtextxy的用法和实例

outtextxy
这个函数用于在指定位置输出字符串。void outtextxy(int x,int y,LPCTSTR str
);void outtextxy(int x,int y,TCHAR c
);参数:x 
字符串输出时头字母的 x 轴的坐标值 
y 
字符串输出时头字母的 y 轴的坐标值。 
str 
待输出的字符串的指针。 
c 
待输出的字符。 
返回值:(无)说明:该函数不会改变当前位置。字符串常见的编码有两种:MBCS 和 Unicode。VC6 新建的项目默认为 MBCS 编码,VC2008 及高版本的 VC 默认为 Unicode 编码。LPCTSTR 可以同时适应两种编码。为了适应两种编码,请使用 TCHAR 字符串及相关函数。

来自easyx官网

TCHAR s[] = _T("*输入文字*");outtextxy(x_11+R/3-10, y_11+sqrt(3.0)/2*R+R/2, s);

最后贴上完整代码和最终效果

上面的代码是好几年前写的,新版本easyx已经放弃了之前的一些函数,有小伙伴反映代码错误很多,我已经在新版本环境下修改了,目前环境是vs2019+easyx 2018春风版,上面代码没有修改,思路是一样的下面贴上修改后的完整源码

#include<graphics.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#define High 480
#define Width 640
#define PI 3.1415926
int main()
{//初始化画布initgraph(Width, High);//定义钟表中点坐标int center_x = Width / 2;int center_y = High / 2;//定义秒针长度int secondlength = Width / 5;//定义分针长度int minutelength = secondlength - 50;//定义时针长度int hourlength = minutelength - 20;//定义秒针终点坐标int secondend_x, secondend_y;secondend_x = center_x + secondlength;secondend_y = center_y;//定义分针终点坐标int minuteend_x = center_x + minutelength;int minuteend_y = center_y;//定义时针终点坐标int hourEnd_x = center_x + hourlength;int hourEnd_y = center_y;setcolor(BLUE);circle(center_x, center_y, secondlength + 20);//绘制6:00setfillcolor(GREEN);solidcircle(Width / 2 + 4, High / 2 + secondlength + 15, 4);TCHAR s_6[5];_stprintf_s(s_6, _T("%d"), 6);        // 高版本 VC 推荐使用 _stprintf_s 函数outtextxy(Width / 2 - 2, High / 2 + secondlength - 5, s_6);//绘制12:00solidcircle(Width / 2, High / 2 - secondlength - 17, 4);TCHAR s_12[5];_stprintf_s(s_12, _T("%d"), 12);        // 高版本 VC 推荐使用 _stprintf_s 函数outtextxy(Width / 2 - 6, High / 2 - secondlength - 13, s_12);//绘制3:00solidcircle(center_x + secondlength + 17, center_y, 4);TCHAR s_3[5];_stprintf_s(s_3, _T("%d"), 3);        // 高版本 VC 推荐使用 _stprintf_s 函数outtextxy(center_x + secondlength, center_y - 5, s_3);//绘制9:00solidcircle(center_x - secondlength - 17, center_y, 4);TCHAR s_9[5];_stprintf_s(s_9, _T("%d"), 9);        // 高版本 VC 推荐使用 _stprintf_s 函数outtextxy(center_x - secondlength - 8, center_y - 5, s_9);//绘制其他刻度int R = secondlength + 20;int x_11, y_11;x_11 = Width / 2 - R / 2;//11:00刻度横坐标y_11 = High / 2 - sqrt(3.0) / 2 * R;//11:00刻度纵坐标solidcircle(x_11, y_11, 3);TCHAR s_11[5];_stprintf_s(s_11, _T("%d"), 11);        // 高版本 VC 推荐使用 _stprintf_s 函数outtextxy(x_11, y_11, s_11);int x_10, y_10;x_10 = Width / 2 - sqrt(3.0) / 2 * R;//10:00刻度横坐标y_10 = High / 2 - R / 2;//11:00刻度纵坐标solidcircle(x_10, y_10, 3);TCHAR s_10[5];_stprintf_s(s_10, _T("%d"), 10);        // 高版本 VC 推荐使用 _stprintf_s 函数outtextxy(x_10, y_10, s_10);int x_8, y_8;x_8 = x_10;y_8 = y_10 + R;solidcircle(x_8, y_8, 3);TCHAR s_8[5];_stprintf_s(s_8, _T("%d"), 8);        // 高版本 VC 推荐使用 _stprintf_s 函数outtextxy(x_8, y_8, s_8);int x_7, y_7;x_7 = x_11;y_7 = y_11 + sqrt(3.0) * R;solidcircle(x_7, y_7, 3);TCHAR s_7[5];_stprintf_s(s_7, _T("%d"), 7);        // 高版本 VC 推荐使用 _stprintf_s 函数outtextxy(x_7, y_7, s_7);int x_5, y_5;x_5 = x_7 + R;y_5 = y_7;solidcircle(x_5, y_5, 3);TCHAR s_5[5];_stprintf_s(s_5, _T("%d"), 5);        // 高版本 VC 推荐使用 _stprintf_s 函数outtextxy(x_5, y_5, s_5);int x_4, y_4;x_4 = x_8 + sqrt(3.0) * R;y_4 = y_8;solidcircle(x_4, y_4, 3);TCHAR s_4[5];_stprintf_s(s_4, _T("%d"), 4);        // 高版本 VC 推荐使用 _stprintf_s 函数outtextxy(x_4, y_4, s_4);int x_2, y_2;x_2 = x_10 + sqrt(3.0) * R;y_2 = y_10;solidcircle(x_2, y_2, 3);TCHAR s_2[5];_stprintf_s(s_2, _T("%d"), 2);        // 高版本 VC 推荐使用 _stprintf_s 函数outtextxy(x_2, y_2, s_2);int x_1, y_1;x_1 = x_11 + R;y_1 = y_11;solidcircle(x_1, y_1, 3);TCHAR s_1[5];_stprintf_s(s_1, _T("%d"), 1);        // 高版本 VC 推荐使用 _stprintf_s 函数outtextxy(x_1, y_1, s_1);float secondangle = 0;//秒针转动的角度float minuteangle = 0;//分针转动的角float hourAngle = 0;//定义时针转动的角SYSTEMTIME ti;//获取系统时间BeginBatchDraw();while (1){GetLocalTime(&ti);//得当当前系统时间//实现秒针转动secondangle = ti.wSecond * 2 * PI / 60;secondend_x = center_x + secondlength * sin(secondangle);secondend_y = center_y - secondlength * cos(secondangle);//实现分针转动minuteangle = ti.wMinute * 2 * PI / 60;minuteend_x = center_x + minutelength * sin(minuteangle);minuteend_y = center_y - minutelength * cos(minuteangle);//实现时针转动hourAngle = ti.wHour * 2 * PI / 12;hourEnd_x = center_x + hourlength * sin(hourAngle);hourEnd_y = center_y - hourlength * cos(hourAngle);//画秒针setlinestyle(PS_SOLID, 2);//定义线的类型,宽度为2setcolor(BLUE);//定义颜色为蓝色line(center_x, center_y, secondend_x, secondend_y);//画分针setlinestyle(PS_SOLID, 2);//定义线的类型,宽度为2setcolor(YELLOW);//定义颜色为黄色line(center_x, center_y, minuteend_x, minuteend_y);//画分针setlinestyle(PS_SOLID, 3);//定义线的类型,宽度为3setcolor(RED);//定义颜色为黄色line(center_x, center_y, hourEnd_x, hourEnd_y);setcolor(BLUE);TCHAR s[] = _T("*小张钟表*");outtextxy(x_11 + R / 3 - 10, y_11 + sqrt(3.0) / 2 * R + R / 2, s);FlushBatchDraw();Sleep(50);//隐藏前一个秒针setcolor(BLACK);line(center_x, center_y, secondend_x, secondend_y);//隐藏前一个分针	setcolor(BLACK);line(center_x, center_y, minuteend_x, minuteend_y);//隐藏前一个时针setcolor(BLACK);line(center_x, center_y, hourEnd_x, hourEnd_y);}EndBatchDraw();_getch();closegraph();system("pause");return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java基础—方法重载(overload)

一、方法的重载 方法名一样&#xff0c;但参数不一样&#xff0c;这就是重载(overload)。 所谓的参数不一样&#xff0c;主要有两点&#xff1a;第一是参数的个数不一样&#xff0c;第二是参数的类型不一样。只要这两方面有其中的一方面不一样就可以构成方法的重载了。 1 packa…

word 编辑域中的汉字_word中插入的cad对象无法双击编辑问题解决记录

昨日&#xff0c;安装了天正插件5.0后&#xff0c;插入word中的cad图无法编辑了&#xff0c;弹出提示的大意是检查是否安装了cad或者是否关闭了CAD中所有的弹窗。在此之前&#xff0c;计算机装了office2010和cad2014及cad2018&#xff0c;office自动关联cad2018&#xff0c;即使…

php实现注册登陆验证

欢迎界面很简单&#xff0c;直接放上代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head&…

iOS touch事件单击双击区分响应

如果您的 iPhone 应用里有个 view&#xff0c;既有单击操作又有双击操作。用户双击 view 时&#xff0c;总是先执行一遍单击的操作再执行双击的操作。所以直接判断时就会发现不能直接进入双击操作。下面是区分 touch 事件是单击还是双击的方法 -(void)singleTap{ NSLog(&quo…

搭建高可用的redis集群,避免standalone模式带给你的苦难

现在项目上用redis的话&#xff0c;很少说不用集群的情况&#xff0c;毕竟如果生产上只有一台redis会有极大的风险&#xff0c;比如机器挂掉&#xff0c;或者内存爆掉&#xff0c;就比如我们生产环境 曾今也遭遇到这种情况&#xff0c;导致redis内存不够挂掉的情况&#xff0c;…

python计算a的平方加b的平方_NumPy计算范数2的平方

老实说&#xff0c;没有比np.inner或np.dot更快的了。如果你觉得中间变量很烦人&#xff0c;你可以创建一个lambda函数&#xff1a;sqeuclidean lambda x: np.inner(x, x)np.inner和np.dot利用BLAS例程&#xff0c;几乎肯定比标准的元素乘法加和快。In [1]: %%timeit -n 1 -r …

php连接MySQL

先说一下我踩了三天的坑 我在这之前用mysql申请了一个数据库&#xff0c;然后用php连接一直连接不上&#xff0c;试了许多办法&#xff0c;都不行 下载MySQL时显示3306端口被占用&#xff0c;所以选了3307 一直报错&#xff0c;三天后&#xff0c;终于知道了&#xff0c;你用的…

SVG动画

动画原理 SVG动画&#xff0c;就是元素的属性值关于时间的变化。 如下图来说&#xff0c;元素的某个属性值的起始值&#xff08;from&#xff09;到结束值&#xff08;to&#xff09;在一个时间段&#xff08;duration&#xff09;根据时间函数&#xff08;timing-function&…

bootstrap弹出的模态框水平垂直居中的实现

学习javascript从入门到放弃&#xff01;&#xff0c;这是第一篇随笔&#xff0c;经验不足&#xff0c;如有不当之处&#xff0c;还望指出。好了废话不多说直接切入正题吧 1.bootstrap默认的model写法&#xff1a; //触发模态框的button <button data-toggle"modal&quo…

python开发实践教程_Python开发实践教程

前言第一章 通过求三角形面积步入Python程序世界 案例1-1 求三角形面积 导读 知识梳理与扩展 小结 练习一第二章 常用运算、使用自定义函数 案例2-1 用函数的方法计算三角形面积 导读 案例2-2 开发一个求三角形面积的工具包 知识梳理与扩展 小结 练习二第三章 分支、循环和列表…

正则表达式 PHP

正则表达式的常用函数&#xff1a; 先写一个函数show&#xff0c;用来输出数组&#xff0c;使代码看起来方便&#xff0c;且把经常重复用到的量放在前面 function show($varnull) {if(empty($var))//检测变量是否为空{echo null;}elseif (is_array($var)||is_object($var))//…

iis发布网站怎么支持.json文件

转载于:https://www.cnblogs.com/daizhipeng/p/5622839.html

PHP Cookie和Session

cookie cookle常用来识别用户&#xff0c;可以理解为浏览器留下的一种文件&#xff0c;cookie可以分为会话cookie和硬盘cookie两种&#xff0c;会话cookie生命周期短&#xff0c;浏览器关闭即销毁&#xff0c;硬盘cookie生命周期由开发者设定&#xff0c;可长可短 1.创建cook…

浏览器渲染机制

1. 明白浏览器渲染的目的 可访问性&#xff08;Accessability&#xff09;、加载性能和重构灵活性一直是前端工程师们关心的主题。 其中加载性能与浏览器的渲染机制深深挂钩&#xff0c;弄明白浏览器背后的渲染机制&#xff0c;才能在日常的前端的开发中明白如何进行性能优化。…

java中List Set Map使用

Testpublic void run(){ArrayList<String> list new ArrayList<String>();list.add( "美女");list.add( "帅哥");list.add( "芙蓉姐姐" );for (int i 0; i < list.size(); i) {String strlist.get(i);System. out.println(str);…

python免费开源工具推荐_年薪200万的程序员,推荐这10大Python免费开源工具!

原标题&#xff1a;年薪200万的程序员&#xff0c;推荐这10大Python免费开源工具&#xff01;毫无疑问&#xff0c;Python是最流行的语言之一&#xff0c;其成功的原因之一是它为科学计算提供了广泛的报道。 在这里&#xff0c;我们仔细研究用于机器学习和数据科学的十大Python…

通过Yeoman快速搭建AngularJS webapp应用的实践

这里主要记录关于使用yeoman快速构建angluarJS的前端应用的实践&#xff1a; 安装node、yeoman等过程略去 1、首页我们可以在公共的脚手架中找到自己想要的脚手架&#xff0c;官方脚手架库的地址 Yeoman generators: http://yeoman.io/generators/ 这里我们选择官方团队出的ang…

[Objective-C]编程艺术 笔记整理

看了《禅与 Objective-C 编程艺术》&#xff0c;发现不少平时不注意的或注意但没有系统总结的东西&#xff0c;特此记录一下。 这次没有整理完&#xff0c;后续更新会结合手里的一些其他资料整理。 新博客wossoneri.com传送门 完整的介绍看这两个链接Google开源项目风格指南禅与…

python大数据工程师 培训_大数据工程师学习之路

大数据的作用&#xff1a;发现过去事件的特征预测未来最优化选择职位划分&#xff1a;数据产品经理数据分析师->商业敏感性&#xff0c;产品经理的助手数据研发工程师数据挖掘工程师/数据科学家需要准备的技术知识&#xff1a;Linux操作系统与网络编程&#xff1a;进程/线程…

python序列

python序列 列表 python变量不存放值&#xff0c;之存放值的引用&#xff0c;所以列表中元素可以是不同类型 1.常用方法 1.1 增加元素 append,在末尾插入元素 extend&#xff0c;将一个列表整体插入到尾部 insert&#xff0c;将某个元素插入到特定位 /*&#xff0c;拼合…