C语言编写创意时钟

教育   2024-09-04 22:50   宁夏  

前言

诚然,此程序虽短小精悍,却让人深思良久,印证了‘大道至简’的真谛。在追求极致的道路上,即便是最简单的任务,其背后的深度与广度亦不容忽视。将平凡之事雕琢至极致,不仅是技艺的展现,更是心灵的修行。画图,远非简单地标记坐标,它是创意的火花与逻辑的精妙交织,蕴含着无限的思路探索与技巧磨练。

原图

思路

该创意时钟的构成很简单,在编写中我主要使用了无边框的填充的圆角矩形(solidroundrect)这个函数。我们要绘制该图案,首先就是要观察和分析,看看它存在什么规律。

面对复杂的背景线条,直接逐条绘制无疑效率低下。通过取色器细致观察,我们发现了隐藏的规律——线条从上至下,其色彩遵循着RGB值依次递减8的微妙变化。这一发现引领我们采用更为高效的策略:利用for循环结构,自动化生成这一渐变的背景效果。

其次是时间的显示,每个数字条的长度不同,而且还需要动态加载。我们可以确定这个时间就是当前时间,所以我们需要获取一个当前时间。与传统学习模式不同,编程的魅力在于其应用性,它鼓励我们面对难题时主动寻求解决方案。无论是借助搜索引擎的广泛资源,还是利用现代AI技术的智能辅助,都是我们在编程旅程中不可或缺的伙伴。它们不仅能帮助我们快速解决眼前的小问题,更在潜移默化中拓宽了我们的知识边界,提升了我们的编程效率与创新能力。

为了编写一个函数,能够灵活地显示所有数字,关键在于精准地控制每个数字条的特性。我们通过引入三个关键变量来实现这一目标:x用于定位数字条的水平位置,num反映其代表的数值(间接影响高度),而many则直接决定了数字条的长度。这三个变量协同工作,不仅简化了对数字条属性的描述,还方便我们调用绘制。

源码

///////////////////////////////////////////////////// 程序名称:创意时钟// 编译环境:Mictosoft Visual Studio 2022, EasyX_20200315(beta)// 作  者:luoyh <2864292458@qq.com>// 最后修改:2024-9-4// 公 众 号:C语言研究//
#define _CRT_SECURE_NO_WARNINGS#include<graphics.h>#include<conio.h>#include<time.h>// 绘制背景void DrawBK();/// <summary>/// 绘制数字条函数/// </summary>/// <param name="x">数字位置</param>/// <param name="num">数字</param>/// <param name="many">数字长度</param>void DrawNUM(int x, int num, int many);int main(){ initgraph(600, 400); // 定义一个time_t变量来存储秒数 time_t rawtime; // 定义一个tm结构体指针来存储转换后的时间 struct tm* timeinfo; BeginBatchDraw(); while (true) { // 获取时间 // 获取当前时间 time(&rawtime); // 将秒数转换为本地时间 timeinfo = localtime(&rawtime); int hour_1 = timeinfo->tm_hour / 10; int hour_2 = timeinfo->tm_hour % 10; int min_1 = timeinfo->tm_min / 10; int min_2 = timeinfo->tm_min % 10; int sec_1 = timeinfo->tm_sec / 10; int sec_2 = timeinfo->tm_sec % 10; FlushBatchDraw(); DrawBK(); DrawNUM(0, hour_1, 3); DrawNUM(1, hour_2, 10); DrawNUM(2, min_1, 6); DrawNUM(3, min_2, 10); DrawNUM(4, sec_1, 6); DrawNUM(5, sec_2, 10); } EndBatchDraw(); _getch(); return 0;}
void DrawBK(){ int starx = 0; for (int i = 0; i < 13; i++) { setlinecolor(RGB(113 - 8 * i, 113 - 8 * i, 113 - 8 * i)); setlinestyle(PS_SOLID | PS_ENDCAP_FLAT, 50); line(starx + i * 95, -25, starx - 750 + i * 95, 420); } // 中间横条 setfillcolor(RGB(51, 51, 51)); solidroundrect(163, 143+40, 443, 163+40, 20, 20); setfillcolor(RGB(59, 59, 59)); solidroundrect(160, 140+40, 440, 160+40, 20, 20);}
void DrawNUM(int x, int num, int many){ int MYX = 180 + x * 45; int MYY = 140+40 - num * 20; int ENDY = MYY + many * 20; int ENDX = MYX + 20; setfillcolor(RGB(37, 37, 37)); solidroundrect(MYX, MYY, ENDX, ENDY, 20, 20); settextstyle(18, 0, _T("微软雅黑")); settextcolor(WHITE); setbkmode(TRANSPARENT); TCHAR str[25]; for (int i = 0; i < many; i++) { RECT r = { MYX, MYY + 20 * i, MYX + 22, MYY + 20 + 20 * i }; _stprintf_s(str, _T("%d"), i); drawtext(str, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); }}

最终效果

编写过程

C语言研究
写给自己的笔记,时常写写,时常看看,仅此而已。