C语言绘制钟表

教育   2024-09-24 21:16   宁夏  

前言

绘制钟表作为编程项目,始终吸引着众多学习者的兴趣,它不仅是编程技能的一次实践,也是创意与美学融合的良好载体。随着科技的进步,传统钟表已逐步被电子钟表所取代,而电子钟表的设计更是趋向多元化,无论是追求视觉震撼的炫酷风格,还是崇尚简洁雅致的简约风格,都成为了现代设计的潮流。这些丰富多样的钟表样式,无一不依赖于编程技术的支持与创新,通过代码实现时间的精准展示与个性化呈现,让时间的流动更加生动有趣。因此,掌握钟表绘制的编程技能,不仅是对技术能力的锻炼,也是向美学与创意领域迈进的重要一步。

如果你想给自己设计一款钟表样式,你会设计成什么样子呢?在前面的文章中我发表过一个很炫酷的钟表样式,如下所示:

简约

在当下,简约风格备受推崇,它倡导以最少的色彩、最精炼的要素,营造出清新、宁静的视觉体验。今天,我们将运用C语言这一强大的编程语言,来绘制一款简约风格的钟表。这款钟表将遵循“少即是多”的设计理念,通过精准的代码实现时间的展示,同时保持界面的简洁与雅致,让时间的流转在简洁的线条与数字间优雅呈现。

源码

///////////////////////////////////////////////////// 程序名称:绘制钟表// 编译环境:Mictosoft Visual Studio 2022, EasyX_20200315(beta)// 作  者:luoyh <2864292458@qq.com>// 公 众 号:C语言研究// 最后修改:2024-9-24//
#include <graphics.h> #include <windows.h> #include <stdio.h>#include <conio.h> #include <math.h>
#define PI acos(-1.0)void DralDial();void DrawHand(int hour, int minute, int second);void digital(int h, int m, int s);
int main(void){ initgraph(500, 500); setbkcolor(BLACK); cleardevice(); SYSTEMTIME t; //定义变量保存当前时间 setbkmode(TRANSPARENT); BeginBatchDraw(); while (!_kbhit()) { GetLocalTime(&t); //获取当前时间 DralDial(); //画表盘 DrawHand(t.wHour, t.wMinute, t.wSecond); //画表针 //digital(t.wHour, t.wMinute, t.wSecond); // 显示时间 FlushBatchDraw(); Beep(8000, 50); Sleep(1000); cleardevice(); } EndBatchDraw(); closegraph(); return 0;}
/*画表盘*/void DralDial(){ int x1, y1, x2, y2; setlinecolor(RGB(100, 100, 100)); setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE, 1); for (int i = 0; i <= 59; i++) { // 画60条短线 x1 = (int)(250 + (sin(i * PI / 30) * 205)); y1 = (int)(250 - (cos(i * PI / 30) * 205)); x2 = (int)(250 + (sin(i * PI / 30) * 215)); y2 = (int)(250 - (cos(i * PI / 30) * 215)); if (i % 5) { line(x1, y1, x2, y2); } } settextcolor(WHITE); //写表盘数字 for (int n = 0; n < 12; n++) { wchar_t s[10]; swprintf_s(s, 10, L"%d", 12 - n); // int 类型转换成 char 类型 settextstyle(80, 0, _T("微软雅黑")); // 定义字符串长和宽,居中 int w, h; w = textwidth(s); h = textheight(s); outtextxy(int(160 * cos(n * 2 * PI / 12 + PI / 2) - w / 2) + 250, -int(160 * sin(n * 2 * PI / 12 + PI / 2) + h / 2) + 250, s); } for (int n = 0; n < 12; n++) { wchar_t s[10]; swprintf_s(s, 10, L"%02d", (12 - n) * 5); // int 类型转换成 char 类型 settextstyle(25, 0, _T("微软雅黑")); // 定义字符串长和宽,居中 int w, h; w = textwidth(s); h = textheight(s); outtextxy(int(210 * cos(n * 2 * PI / 12 + PI / 2) - w / 2) + 250, -int(210 * sin(n * 2 * PI / 12 + PI / 2) + h / 2) + 250, s); }}
//画指针 void DrawHand(int hour, int minute, int second){ int xhour, yhour, xminute, yminute, xsecond, ysecond; //表心坐标系指针坐标 xhour = (int)(110 * sin(hour * PI / 6 + minute * PI / 360 + second * PI / 1800)); yhour = (int)(110 * cos(hour * PI / 6 + minute * PI / 360 + second * PI / 1800)); xminute = (int)(200 * sin(minute * PI / 30 + second * PI / 1800)); yminute = (int)(200 * cos(minute * PI / 30 + second * PI / 1800)); xsecond = (int)(215 * sin(second * PI / 30)); ysecond = (int)(215 * cos(second * PI / 30)); //画时针 setlinecolor(WHITE); setlinestyle(PS_SOLID, 6); line(250 + xhour, 250 - yhour, 250, 250); setlinestyle(PS_SOLID, 14); line(250 + xhour, 250 - yhour, 250 + xhour / 3, 250 - yhour / 3); //画分针 setlinestyle(PS_SOLID, 6); line(250 + xminute, 250 - yminute, 250, 250); setlinestyle(PS_SOLID, 14); line(250 + xminute, 250 - yminute, 250 + xminute / 5, 250 - yminute / 5); //画秒针 setfillcolor(WHITE); solidcircle(250, 250, 8); setlinecolor(RGB(190, 151, 118)); setlinestyle(PS_SOLID, 3); circle(250, 250, 5); line(250 + xsecond, 250 - ysecond, 250 - xsecond / 5, 250 + ysecond / 5); setfillcolor(RGB(35, 0, 0)); solidcircle(250, 250, 3);}
// 显示数字时钟void digital(int h, int m, int s){ // 画显示当前时间的三个小矩形 setlinecolor(LIGHTGRAY); // 设置边框颜色为浅灰色 setfillcolor(WHITE); // 设置填充颜色为白色 fillrectangle(250 - 40 - 13, 300, 250 - 40 + 13, 300 + 26); fillrectangle(250 - 13, 300, 250 + 13, 300 + 26); fillrectangle(250 + 40 - 13, 300, 290 + 13, 300 + 26); // 显示当前时间 settextstyle(24, 0, _T("微软雅黑")); wchar_t a[10]; int w; settextcolor(BLACK); swprintf_s(a, 10, L"%02d", h); w = textwidth(a); outtextxy(250 - 40 - w / 2, 300, a); swprintf_s(a, 10, L"%02d", m); w = textwidth(a); outtextxy(250 - w / 2, 300, a); swprintf_s(a, 10, L"%02d", s); w = textwidth(a); outtextxy(250 + 40 - w / 2, 300, a);}
动态效果

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