要用C语言实现一个圆形时钟,我们需要使用图形库来绘制图形元素。可以在 Code::Blocks 中使用 WinBGIm 库绘制一个圆盘时钟(模拟时钟),能看到一个圆盘时钟,小时、分钟和秒钟指针实时更新。

1、下载安装 WinBGIm 库

WinBGIm(Windows Borland Graphics Interface Library for MinGW)库是一个用于在 Windows 上运行 BGI(Borland Graphics Interface)程序的图形库。它是为 MinGW 编译器设计的,但也兼容其他一些编译器。WinBGIm 是 Borland C++ 的 BGI 图形库的一个移植版本,允许在现代 Windows 环境中使用传统的 BGI 图形功能。

下载地址:

https://winbgim.codecutter.org/

https://github.com/ahmedshakill/WinBGIm-64/releases/tag/v1.0.1

下载的压缩包中提取文件。可以获得多个文件,包括 graphics.hwinbgim.hlibbgi.a

2、配置 Code::Blocks

1)复制头文件和库文件

将 graphics.h 和 winbgim.h 复制到 Code::Blocks 的 include 目录中,通常位于:

C:\Program Files (x86)\CodeBlocks\MinGW\include

libbgi.a复制到 Code::Blocks 的 lib 目录中,通常位于:

C:\Program Files (x86)\CodeBlocks\MinGW\lib

2)配置编译器和链接器

打开 Code::Blocks。创建一个新的控制台应用程序项目。在项目中,右键点击项目名称,选择 Build options。在 Linker settings 选项卡中,点击 Add 按钮,并添加 libbgi.a

在 Other linker options 中,添加以下内容:

-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32

3、项目代码

用于绘制圆盘时钟的完整代码,如下,

#include <graphics.h>
#include <math.h>
#include <time.h>
#include <stdio.h>

#define PI 3.14159

void drawClockFace(int xCenter, int yCenter, int radius) {
    // 画圆
    circle(xCenter, yCenter, radius);

    // 画小时刻度
    for (int i = 0; i < 12; i++) {
        int angle = i * 30; // 360 / 12 = 每小时30度
        int xOuter = xCenter + (radius - 10) * cos(angle * PI / 180);
        int yOuter = yCenter + (radius - 10) * sin(angle * PI / 180);
        int xInner = xCenter + (radius - 20) * cos(angle * PI / 180);
        int yInner = yCenter + (radius - 20) * sin(angle * PI / 180);
        line(xOuter, yOuter, xInner, yInner);
    }
}

void drawHand(int xCenter, int yCenter, int length, double angle) {
    int x = xCenter + length * cos(angle);
    int y = yCenter + length * sin(angle);
    line(xCenter, yCenter, x, y);
}

void updateClock(int xCenter, int yCenter, int radius) {
    time_t rawtime;
    struct tm *timeinfo;

    time(&rawtime);
    timeinfo = localtime(&rawtime);

    int hours = timeinfo->tm_hour % 12;
    int minutes = timeinfo->tm_min;
    int seconds = timeinfo->tm_sec;

    // 将当前时间转换为角度
    double hourAngle = (hours + minutes / 60.0) * 30 * PI / 180 - PI / 2;
    double minuteAngle = (minutes + seconds / 60.0) * 6 * PI / 180 - PI / 2;
    double secondAngle = seconds * 6 * PI / 180 - PI / 2;

    // 画时钟指针
    setcolor(WHITE);
    drawHand(xCenter, yCenter, radius - 50, hourAngle);
    drawHand(xCenter, yCenter, radius - 20, minuteAngle);
    setcolor(RED);
    drawHand(xCenter, yCenter, radius - 10, secondAngle);
}

int main() {
    int gd = DETECT, gm;
    initgraph(&gd, &gm, "");

    int xCenter = getmaxx() / 2;
    int yCenter = getmaxy() / 2;
    int radius = 200;

    while (!kbhit()) {
        cleardevice();
        drawClockFace(xCenter, yCenter, radius);
        updateClock(xCenter, yCenter, radius);
        delay(1000);
    }

    closegraph();
    return 0;
}

效果如下:

httpswwwcjavapycom

推荐文档