C语言实现的数字时钟代码 有倒计时功能 用fltk
时间: 2024-02-20 18:59:44 浏览: 171
好的,以下是使用 C 语言和 FLTK 库实现数字时钟和倒计时功能的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Output.H>
// 定义时钟和倒计时的窗口大小
#define WINDOW_WIDTH 350
#define WINDOW_HEIGHT 150
// 定义时钟和倒计时的文本显示区域
#define CLOCK_X 50
#define CLOCK_Y 30
#define CLOCK_WIDTH 100
#define CLOCK_HEIGHT 30
#define COUNTDOWN_X 220
#define COUNTDOWN_Y 30
#define COUNTDOWN_WIDTH 100
#define COUNTDOWN_HEIGHT 30
// 定义倒计时的按钮
#define START_BUTTON_X 140
#define START_BUTTON_Y 80
#define START_BUTTON_WIDTH 70
#define START_BUTTON_HEIGHT 30
// 定义倒计时的秒数
#define COUNTDOWN_SECONDS 60
// 时钟和倒计时的回调函数
void clock_callback(void* data);
void countdown_callback(void* data);
// 时钟和倒计时的计时器
Fl_Timeout* clock_timer;
Fl_Timeout* countdown_timer;
// 时钟和倒计时的文本显示
Fl_Output* clock_output;
Fl_Output* countdown_output;
// 倒计时的按钮
Fl_Button* start_button;
// 时钟和倒计时的时间结构体
struct tm clock_time;
struct tm countdown_time;
int main(int argc, char** argv) {
// 初始化 FLTK 库
Fl::scheme("gtk+");
Fl::set_font(FL_HELVETICA_BOLD, "Arial");
// 创建窗口
Fl_Window* window = new Fl_Window(WINDOW_WIDTH, WINDOW_HEIGHT, "数字时钟");
// 创建时钟的文本显示
clock_output = new Fl_Output(CLOCK_X, CLOCK_Y, CLOCK_WIDTH, CLOCK_HEIGHT, "");
clock_output->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
clock_output->textsize(20);
// 创建倒计时的文本显示
countdown_output = new Fl_Output(COUNTDOWN_X, COUNTDOWN_Y, COUNTDOWN_WIDTH, COUNTDOWN_HEIGHT, "");
countdown_output->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
countdown_output->textsize(20);
// 创建开始倒计时的按钮
start_button = new Fl_Button(START_BUTTON_X, START_BUTTON_Y, START_BUTTON_WIDTH, START_BUTTON_HEIGHT, "开始");
start_button->callback(countdown_callback);
// 显示窗口
window->end();
window->show(argc, argv);
// 开始时钟的计时器
clock_timer = Fl::add_timeout(0.0, clock_callback, NULL);
// 进入 FLTK 主循环
return Fl::run();
}
void clock_callback(void* data) {
// 获取当前时间
time_t current_time = time(NULL);
localtime_r(¤t_time, &clock_time);
// 更新时钟的文本显示
char clock_text[9];
snprintf(clock_text, 9, "%02d:%02d:%02d", clock_time.tm_hour, clock_time.tm_min, clock_time.tm_sec);
clock_output->value(clock_text);
// 继续时钟的计时器
clock_timer = Fl::add_timeout(1.0, clock_callback, NULL);
}
void countdown_callback(void* data) {
// 禁用倒计时的按钮
start_button->deactivate();
// 设置倒计时的时间
time_t current_time = time(NULL) + COUNTDOWN_SECONDS;
localtime_r(¤t_time, &countdown_time);
// 更新倒计时的文本显示
char countdown_text[9];
snprintf(countdown_text, 9, "%02d:%02d:%02d", countdown_time.tm_hour, countdown_time.tm_min, countdown_time.tm_sec);
countdown_output->value(countdown_text);
// 开始倒计时的计时器
countdown_timer = Fl::add_timeout(1.0, [](void* data){
// 获取当前时间
time_t current_time = time(NULL);
localtime_r(¤t_time, &countdown_time);
// 更新倒计时的文本显示
char countdown_text[9];
snprintf(countdown_text, 9, "%02d:%02d:%02d", countdown_time.tm_hour, countdown_time.tm_min, countdown_time.tm_sec);
countdown_output->value(countdown_text);
// 判断是否倒计时结束
if (current_time >= (time_t)(countdown_time.tm_year + 1900) * 31536000 + countdown_time.tm_yday * 86400 + countdown_time.tm_hour * 3600 + countdown_time.tm_min * 60 + countdown_time.tm_sec) {
// 停止倒计时的计时器
countdown_timer->stop();
// 更新倒计时的文本显示
countdown_output->value("00:00:00");
// 启用倒计时的按钮
start_button->activate();
}
}, NULL);
}
```
在这个示例代码中,我们首先使用 FLTK 库创建了一个窗口,并在窗口中创建了时钟和倒计时的文本显示以及倒计时的按钮。然后,我们使用 FLTK 库的计时器功能,分别实现了时钟和倒计时的计时器,并在时钟和倒计时的计时器回调函数中更新了时钟和倒计时的文本显示。最后,我们在倒计时的按钮回调函数中实现了倒计时的功能,并在倒计时的计时器回调函数中更新了倒计时的文本显示,并在倒计时结束后重新启用了倒计时的按钮。
阅读全文