C++ 时钟

#include <chrono>
//获取当前时间作为开始时间
std::chrono::high_resolution_clock::time_point m_startTime = std::chrono::high_resolution_clock::now(); 
 //获取当前时间作为结束时间
std::chrono::high_resolution_clock::time_point m_endTime = std::chrono::high_resolution_clock::now();
//开始到结束的时间间隔
//其中std::ratio<1,1000>代表时间单位,此处即1/1000s = ms,如果是<1,50>就是1/50s
std::chrono::duration<int, std::ratio<1,1000>> time_span_ms = std::chrono::duration_cast<std::duration<int,std::ratio<1,1000>>>(m_endTime - m_startTime);
程序清单 按以下步骤向视图类(CClockView)添加下列数据成员及成员函数。 (1) 添加表示年、月、日、时、分、秒的变量。 int year; int month; int day; int hour; int minute; int second; (2) 添加秒表的计数变量。 int watch; (3) 添加时钟的画笔及画刷变量。 CPen m_HouPen, m_MinPen, m_SecPen; // 各种针的画笔 CBrush m_MarkBrush; // 表盘标记的画刷 (4) 添加时钟控制变量。 CPoint m_Center; // 表的中心 double m_Radius; // 表的半径 CPoint m_Hour [2], m_OldHour [2]; // 时针当前及前一次位置 CPoint m_Minute [2], m_OldMin [2]; // 分针当前及前一次位置 CPoint m_Second [2], m_OldSec [2]; // 秒针当前及前一次位置 (5) 添加秒表的两个按钮位置变量。 CRect m_WatchStart; CRect m_WatchStop; (6) 添加两个函数,计算时钟各指针位置。 void SetClock (int hour, int minute, int second); CPoint GetPoint (int nLenth, int nValue); (7) 在视图类构造函数中增加初始化语句: CClockView::~CClockView() { //设定时间 year=2010; month=11; day=22; hour=0; minute=0; second=0; //设定画笔画刷 m_HouPen.CreatePen(PS_SOLID,5,RGB(255,0,0));//时针画笔 m_MinPen.CreatePen(PS_SOLID,3,RGB(0,0,250));//分针画笔 m_SecPen.CreatePen(PS_SOLID,1,RGB(0,0,0));//秒针画笔 m_MarkBrush.CreateSolidBrush(RGB(250,250,0)); //设定表芯位置 m_Center.x=222; m_Center.y=222; //设定时钟半径 m_Radius=222; //计算指针位置 SetClock(hour,minute,second); //设定秒表计数器及按钮位置 watch=0; m_WatchStart=CRect(480,310,560,340);//启动按钮 m_WatchStop=CRect(590,310,670,340);//停止按钮 } 编写指针位置函数SetClock和GETpOINT。 首先在ClockView.cpp文件头部下添加下面两行代码,以便进行数学计算。 #define PI 3.14159265258 #include"math.h" 然后添加下列代码: //计算个指针位置的函数 void CClockView::SetClock(int hour,int minute,int second) { hour=hour*5; hour=hour+minute/12; //保存时针原位置 m_OldHour[0]=m_Hour[0]; m_OldHour[1]=m_Hour[1];
### 绘制时钟图形或模拟时钟的实现方法 在C++中绘制时钟图形或模拟时钟,通常需要结合图形库来完成。以下是一个使用Qt框架的示例,展示如何利用其绘图功能实现一个简单的时钟模拟。 #### 使用Qt绘制时钟 Qt是一个跨平台的C++图形用户界面应用程序开发框架,提供了丰富的绘图工具和事件处理机制,非常适合用于绘制时钟等动态图形[^1]。以下是实现步骤: 1. **创建Qt项目**:首先需要创建一个基于Qt的应用程序项目,并确保包含`QWidget`或`QMainWindow`作为主窗口。 2. **重写`paintEvent`函数**:通过重写`paintEvent`函数,在窗口上绘制时钟的指针和表盘。 3. **定时更新时间**:使用`QTimer`定时器类,每隔一定时间(如1秒)触发一次更新,重新绘制时钟。 #### 示例代码 以下是一个简单的Qt时钟模拟代码示例: ```cpp #include <QApplication> #include <QWidget> #include <QPainter> #include <QTimer> #include <QTime> class ClockWidget : public QWidget { protected: void paintEvent(QPaintEvent *event) override { Q_UNUSED(event); static const QPoint center(width() / 2, height() / 2); static const int radius = qMin(width(), height()) / 2 - 5; QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 绘制表盘 painter.drawEllipse(center, radius, radius); // 获取当前时间 QTime time = QTime::currentTime(); // 绘制时针 painter.save(); painter.setPen(Qt::NoPen); painter.setBrush(Qt::black); painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0))); painter.drawRect(-5, -radius / 2, 10, radius / 2); painter.restore(); // 绘制分针 painter.save(); painter.setPen(Qt::NoPen); painter.setBrush(Qt::blue); painter.rotate(6.0 * (time.minute() + time.second() / 60.0)); painter.drawRect(-3, -radius, 6, radius); painter.restore(); // 绘制秒针 painter.save(); painter.setPen(Qt::NoPen); painter.setBrush(Qt::red); painter.rotate(6.0 * time.second()); painter.drawRect(-1, -radius, 2, radius); painter.restore(); } public: ClockWidget(QWidget *parent = nullptr) : QWidget(parent) { setFixedSize(200, 200); QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &ClockWidget::update); timer->start(1000); // 每秒更新一次 } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); ClockWidget clock; clock.show(); return app.exec(); } ``` #### 代码说明 - `paintEvent`函数负责绘制时钟的表盘、时针、分针和秒针。 - `QTimer`用于每秒触发一次更新,调用`update`函数重新绘制时钟。 - 使用`QPainter`进行绘图操作,支持抗锯齿渲染以提高图形质量。 #### 其他注意事项 如果不想使用Qt,还可以考虑其他图形库,例如SFML、OpenGL等。这些库也提供了强大的绘图功能,但实现方式会有所不同[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值