前言
诚然,此程序虽短小精悍,却让人深思良久,印证了‘大道至简’的真谛。在追求极致的道路上,即便是最简单的任务,其背后的深度与广度亦不容忽视。将平凡之事雕琢至极致,不仅是技艺的展现,更是心灵的修行。画图,远非简单地标记坐标,它是创意的火花与逻辑的精妙交织,蕴含着无限的思路探索与技巧磨练。
原图
思路
该创意时钟的构成很简单,在编写中我主要使用了无边框的填充的圆角矩形(solidroundrect)这个函数。我们要绘制该图案,首先就是要观察和分析,看看它存在什么规律。
面对复杂的背景线条,直接逐条绘制无疑效率低下。通过取色器细致观察,我们发现了隐藏的规律——线条从上至下,其色彩遵循着RGB值依次递减8的微妙变化。这一发现引领我们采用更为高效的策略:利用for循环结构,自动化生成这一渐变的背景效果。
其次是时间的显示,每个数字条的长度不同,而且还需要动态加载。我们可以确定这个时间就是当前时间,所以我们需要获取一个当前时间。与传统学习模式不同,编程的魅力在于其应用性,它鼓励我们面对难题时主动寻求解决方案。无论是借助搜索引擎的广泛资源,还是利用现代AI技术的智能辅助,都是我们在编程旅程中不可或缺的伙伴。它们不仅能帮助我们快速解决眼前的小问题,更在潜移默化中拓宽了我们的知识边界,提升了我们的编程效率与创新能力。
为了编写一个函数,能够灵活地显示所有数字,关键在于精准地控制每个数字条的特性。我们通过引入三个关键变量来实现这一目标:x用于定位数字条的水平位置,num反映其代表的数值(间接影响高度),而many则直接决定了数字条的长度。这三个变量协同工作,不仅简化了对数字条属性的描述,还方便我们调用绘制。
源码
///////////////////////////////////////////////////
// 程序名称:创意时钟
// 编译环境:Mictosoft Visual Studio 2022, EasyX_20200315(beta)
// 作 者:luoyh <2864292458@qq.com>
// 最后修改:2024-9-4
// 公 众 号:C语言研究
//
// 绘制背景
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);
}
}
最终效果