c语言怎么样编写一个时钟程序

c语言怎么样编写一个时钟程序,第1张

c语言时钟程序代码如下:

#include<windows.h>

#include<math.h>

#define ID_TIMER 1//计时器ID

#define TWOPI (2*3.14159)

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)

{

static TCHAR szAppName[]=TEXT("Clock")

HWND hwnd

MSG msg

WNDCLASS wndclass

wndclass.cbClsExtra=0

wndclass.cbWndExtra=0

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH)

wndclass.hCursor=LoadCursor(NULL,IDC_ARROW)

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION)

wndclass.hInstance=hInstance

wndclass.lpfnWndProc=WndProc

wndclass.lpszClassName=szAppName

wndclass.lpszMenuName=NULL

wndclass.style=CS_HREDRAW|CS_VREDRAW

if(!RegisterClass(&wndclass))

{

MessageBox(NULL,TEXT("This program requires Windows

T"),szAppName,MB_ICONERROR)

return 0

}

hwnd=CreateWindow(szAppName,TEXT("Analog Clock"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL)

ShowWindow(hwnd,iCmdShow)

UpdateWindow(hwnd)

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg)

DispatchMessage(&msg)

}

return msg.wParam

}

void Setsotropic(HDC hdc,int cxClient,int cyClient)

{

SetMapMode(hdc,MM_ISOTROPIC)

SetWindowExtEx(hdc,1000,1000,NULL)

SetViewportExtEx(hdc,cxClient/2,-cyClient/2,NULL)

SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL)

}

void RotatePoint(POINT pt[],int iNum,int iAngle)

{

int i

POINT ptTemp

for(i=0i<iNumi++)

{

ptTemp.x=(int)(pt[i].x*cos(TWOPI*iAngle/360)+pt[i].y*sin(TWOPI*iAngle/360))

ptTemp.y=(int)(pt[i].y*cos(TWOPI*iAngle/360)+pt[i].x*sin(TWOPI*iAngle/360))

pt[i]=ptTemp

}

}

void DrawClock(HDC hdc)

{

int iAngle

POINT pt[3]

for(iAngle=0iAngle<360iAngle+=6)

{

pt[0].x=0

pt[0].y=900

RotatePoint(pt,1,iAngle)

pt[2].x=pt[2].y=iAngle%5?33:100

pt[0].x-=pt[2].x/2

pt[0].y-=pt[2].y/2

pt[1].x=pt[0].x+pt[2].x

pt[1].y=pt[0].y+pt[2].y

SelectObject(hdc,GetStockObject(BLACK_BRUSH))

Ellipse(hdc,pt[0].x,pt[0].y,pt[1].x,pt[1].y )

}

}

void DrawHands(HDC hdc,SYSTEMTIME *pst,BOOL fChange)

{

static POINT pt[3][5]={0,-150,100,0,0,600,-100,0,0,-150, 0,-200,50,0,0,800,-50,0,0,-200, 0,0,0,0,0,0,0,0,0,800 }

int i,iAngle[3]

POINT ptTemp[3][5]

iAngle[0]=(pst->wHour*30)%360+pst->wMinute/2

iAngle[1]=pst->wMinute*6

iAngle[2]=pst->wSecond*6

memcpy(ptTemp,pt,sizeof(pt))

for(i=fChange?0:2i<3i++)

{

RotatePoint(ptTemp[i],5,iAngle[i])

Polyline(hdc,ptTemp[i],5)

}

}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

{

static int cxClient,cyClient

static SYSTEMTIME stPrevious

BOOL fChange

HDC hdc

PAINTSTRUCT ps

SYSTEMTIME st

switch(message)

{

case WM_CREATE:

SetTimer(hwnd,ID_TIMER,1000,NULL)

GetLocalTime(&st)

stPrevious=st

return 0

case WM_SIZE:

cxClient=LOWORD(lParam)

cyClient=HIWORD(lParam)

return 0

case WM_TIMER:

GetLocalTime(&st)

fChange=st.wHour!=stPrevious.wHour||st.wMinute!=stPrevious.wMinute

hdc=GetDC(hwnd)

Setsotropic(hdc,cxClient,cyClient)

SelectObject(hdc,GetStockObject(WHITE_PEN))

DrawHands(hdc,&stPrevious,fChange)

SelectObject(hdc,GetStockObject(BLACK_PEN))

DrawHands(hdc,&st,TRUE)

stPrevious=st

return 0

case WM_PAINT:

hdc=BeginPaint(hwnd,&ps)

Setsotropic(hdc,cxClient,cyClient)

DrawClock(hdc)

DrawHands(hdc,&stPrevious,TRUE)

EndPaint(hwnd,&ps)

return 0

case WM_DESTROY:

KillTimer(hwnd,ID_TIMER)

PostQuitMessage(0)

return 0

}

return DefWindowProc(hwnd,message,wParam,lParam)

}

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年 由 肯·汤普逊(Ken Thompson)所研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的 *** 作系统中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C语言的设计影响了许多后来的编程语言,例如C++、Objective-C、Java、C#等。

给你一个指示吧 1.绘图函数 2.时间从主板上面取 程序如下(运行环境是在TC下面的)/***********简单的时钟程序,界面不是很美观,您可以根据自己的爱好加以修改,如给表盘加上刻度,将指针改为其它外形等*/

#include<graphics.h>

#include<math.h>

#include<dos.h>

#define PI 3.1415926

#define x0 320/*定义钟表中心坐标*/

#define y0 240

void DrawClock(int x,int y,int color) /*画表盘*/

{ int r=150/*表盘的半径*/

float th

setcolor(color)

circle(x,y,r)

circle(x,y,2)

}

void DrawHand(int x,int y,float th,int l,int color)

{

int x1,y1

x1=x+l*sin(th)

y1=y-l*cos(th)

setcolor(color)

line(x,y,x1,y1)

}

void main()

{int gdriver=DETECT,gmode<br>struct time curtime<br>float th_hour,th_min,th_sec<br>initgraph(&gdriver,&gmode,"")<br><br>setbkcolor(0)<br><br>while(! kbhit())<br> {<br> DrawClock(x0,y0,14)<br> gettime(&curtime) /*得到当前系统时梁纯间*/<br><br> gotoxy(35,20) /*定位输出衫大位置*/<br> if((float)curtime.ti_hour<=12) /*午前的处理*/<br> {printf("AM ")<br> if((float)curtime.ti_hour<10) printf("0") /*十点之前在小时数前加零*/<br> printf("%.0f:",(float)curtime.ti_hour)<br> }

else /*午后的处理*/

{printf("PM ")<br> if((float)curtime.ti_hour-12<10) printf("0")<br> printf("%.0f:",(float)curtime.ti_hour-12)<br> }

if((float)curtime.ti_min<10) printf("0")

printf("%.0f:",(float)curtime.ti_min)

if((float)curtime.ti_sec<10) printf("0")

printf("%.0f",(float)curtime.ti_sec)

/*以下三行计算表针转动角度,以竖直向上为起点,顺时针为正橡塌咐*/

th_sec=(float)curtime.ti_sec*0.1047197551 /*2π/60=0.1047197551*/

th_min=(float)curtime.ti_min*0.1047197551+th_sec/60.0

th_hour=(float)curtime.ti_hour*0.523598775+th_min/12.0 /* 2π/12=0.5235987755 */

DrawHand(x0,y0,th_hour,70,2)/*画时针*/

DrawHand(x0,y0,th_min,110,3) /*分针*/

DrawHand(x0,y0,th_sec,140,12)/*秒针*/

sleep(1) /*延时一秒后刷新*/

cleardevice()

}

closegraph()

}

具体代码如下:

#include<graphics.h>

#include<math.h>

#include<dos.h>

#define PI 3.1415926

//屏幕中心的坐标(640X480模式下)

#define mid_x 320

#define mid_y 240

int main()

{ int graphdriver=DETECT,graphmode

int end_x,end_y

struct time curtime

float th_hour,th_min,th_sec

initgraph(&graphdriver,&graphmode,"C:\\TC2")//初始化VGA屏幕模式

setbkcolor(BLACK)//使用黑色的背景色

while(!kbhit(0)) //若有键盘输入,则跳出,即是结束程序

{ setcolor(GREEN)//把画笔设为绿色

circle(mid_x,mid_y,180)//蠢蠢槐钟的外圆

circle(mid_x,mid_y,150)//钟的内圆

circle(mid_x,mid_y,1)//画出钟的圆心

gettime(&curtime)/带友/取得系统当前时间

th_sec=(float)curtime.ti_sec*0.1047197551//把秒针的角度化为弧度,为以后绘制时方便,下同

th_min=(float)curtime.ti_min*0.1047197551+th_sec/60.0//分针的弧度

th_hour=(float)curtime.ti_hour*0.5235987755+th_min/12.0//时度的弧度,注意整时是12等分的,所时乘的是3.14/180*5

//计算出时针的尾的坐标(时针长70)

end_x=mid_x+70*sin(th_hour)

end_y=mid_y-70*cos(th_hour)

setcolor(RED)

line(mid_x,mid_y,end_x,end_y)//用红色线画出时针

//计算出分针坐标(分针长110)

end_x=mid_x+110*sin(th_min)

end_y=mid_y-110*cos(th_min)

setcolor(RED)

line(mid_x,mid_y,end_x,end_y)//用红色画出分针

end_x=mid_x+140*sin(th_sec)

end_y=mid_y-140*cos(th_sec)

setcolor(RED)

line(mid_x,mid_y,end_x,end_y)//同上,画出秒针,长为140

//画出钟盘上的刻度,刻度长20

line(140,240,160,240)//9点对应的大刻度

line(320,60,320,80)//12点对应的大刻度

line(500,240,480,240)//3点的刻度

line(320,420,320,400)//6点的刻度

line(410,395.7,400,378.4)//5点

line(475.7,330,458.4,320)//4点

line(475.7,150,458.4,160)//2点

line(410,84.3,400,101.6)//1点

line(230,84.3,240,101.6)//11点

line(164.3,150,181.6,160)//10点

line(164.3,330,181.6,320)//8点

line(230,395.7,240,378.4)//7点

sleep(BLUE)//这里应该是打错,停止一秒,档悄应为sleep(1000)

cleardevice()//清除屏幕上的显示

}

closegraph()//关闭VGA屏幕,即返回文本方式

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12419431.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存