/
给你一个用图形库实现的案例,如果你不会用图形库或者不用图形库也无所谓,看看思路也是
很好的。你说到钟表怎么转,那必然不是显示数字那么简单,所以这个小案例会对你有点帮助。
/
#include <stdioh>
#include <graphicsh>
#include <mathh>
#include <conioh>
#define PI 3141592653
void DrawDial();
void DrawHand(int hour, int min, int sec);
int main()
{
//创建一个窗口
initgraph(640, 480);
SYSTEMTIME t;
while (!kbhit())
{
DrawDial();
GetLocalTime(&t); //获取当地时间
DrawHand(twHour, twMinute, twSecond);
Sleep(1000); //大写的S!
BeginBatchDraw();
cleardevice();
EndBatchDraw();
}
getchar();
return 0;
}
//静态的表盘
void DrawDial()
{
circle(320, 240, 2);
circle(320, 240, 60);
circle(320, 240, 160);
circle(405, 210, 30);
outtextxy(290, 315, L"电子时钟");
//绘制刻度
int x, y;
for (int i = 0; i < 60; i++)
{
x = 320 + int(145 sin(PI 2 i / 60)); //半径sinA得出x轴偏移量
y = 240 + int(145 cos(PI 2 i / 60));
/
PI 2 --> 360°
i 60 --> 把360分成60分,占60份中的i份
/
if (i % 15 == 0)
{
bar(x - 5, y - 5, x + 5, y + 5); //画矩形
}
else if (i % 5 == 0)
{
circle(x, y, 3);
}
else
putpixel(x, y, WHITE); //画一像素(点)
}
for (int i = 0; i <= 11; i++)
{
x = 405 + int(28 sin(PI 2 i / 12));
y = 210 + int(28 cos(PI 2 i / 12));
putpixel(x, y, WHITE);
}
}
//动态表针
void DrawHand(int hour, int min, int sec)
{
double ahour, amin, asec; //时分秒的弧度值
int xhour, yhour, xmin, ymin, xsec, ysec; //时分秒针的端点坐标
asec = sec 2 PI / 60;
amin = min 2 PI / 60 + asec / 60; //加上秒数带来的偏移
ahour = hour 2 PI / 12 + amin / 12;
/
已走的格数 与 自己要走的格数的比例
+
下级已走的弧度 与 自己要走的格数的比例
/
xsec = int(120 sin(asec)); //120为秒针长度
ysec = int(120 cos(asec));
xmin = int(100 sin(amin));
ymin = int(100 cos(amin));
xhour = int(70 sin(ahour));
yhour = int(70 cos(ahour));
//绘制表针
setlinestyle(PS_SOLID, 2);
setcolor(RED);
line(320 + xsec, 240 - ysec, 320 - xsec / 3, 240 + ysec / 3);
setlinestyle(PS_SOLID, 5);
setcolor(YELLOW);
line(320 + xmin, 240 - ymin, 320 - xmin / 3, 240 + ymin / 3);
setlinestyle(PS_SOLID, 7);
setcolor(LIGHTGREEN);
line(320 + xhour, 240 - yhour, 320 - xhour / 3, 240 + yhour / 3);
//自定义main函数时,手动将样式置回初始:
setlinestyle(PS_SOLID, 1);
setlinecolor(WHITE);
}
#include<iostream>
#include<windowsh>
using namespace std;
class Clock{
public:
Clock(short h=0,short m=0,short s=0):h(h),m(m),s(s){
}
void displayTime();
private:
short h;
short m;
short s;
};void Clock::displayTime(){
while(true){
cout<<h<<':'<<m<<':'<<s<<" ";
Sleep(1000);//一秒更新一次
cout<<'\r';
if(!(s=++s%60))
if(!(m=++m%60))
h=++h%24;
}
} int main()
{
Clock A(12,20,30);//初始时间
AdisplayTime();//更新函数
return 0;
}
/
12:20:30
/
1这是用windows api写的程序。所以要求是纯c的话就没有办法了
2其中定时用了两种方法。一种是用取消息。另一种是延时队列。这里只使用了取消息的方法。延时队列由于我机器上是vc60,CreateTimerQueue在本人机器上无法使用,需要新的sdk,所以没有加以验证,但取消息的方式是可行的。
3稍稍验证了下,基本满足要求。
以上就是关于C语言模拟时钟的代码,在vc++环境中运行。全部的内容,包括:C语言模拟时钟的代码,在vc++环境中运行。、C语言 用devc++编写一个模拟时钟,最简单那种就行,但要能在devc++上运行。、用C语言编写一个模拟windows自带的电子时钟程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)