闹钟的实现代码

private:
 float i,j,k;

 

// 闹钟View.cpp : C闹钟View 类的实现
//

#include "stdafx.h"
#include "闹钟.h"

#include "闹钟Doc.h"
#include "闹钟View.h"

#include<cmath>
#include<cstdlib>

#include <Windows.h> 
#include <CTime> 
#include <string> 

using namespace std;


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// C闹钟View

IMPLEMENT_DYNCREATE(C闹钟View, CView)

BEGIN_MESSAGE_MAP(C闹钟View, CView)
 ON_WM_TIMER()
 ON_WM_CREATE()
 ON_WM_ERASEBKGND()
END_MESSAGE_MAP()

// C闹钟View 构造/析构

C闹钟View::C闹钟View()
{
 // TODO: 在此处添加构造代码
 

}

C闹钟View::~C闹钟View()
{
}

BOOL C闹钟View::PreCreateWindow(CREATESTRUCT& cs)
{
 // TODO: 在此处通过修改
 //  CREATESTRUCT cs 来修改窗口类或样式

 return CView::PreCreateWindow(cs);
}

// C闹钟View 绘制

void C闹钟View::OnDraw(CDC* pDC)
{
 float x,y;
 float r=125;
 


 pDC->MoveTo(125,0);
 for(float a=0;a<=2*3.14159;a+=0.008)
 {
  x=r*cos(a);
  y=r*sin(a);
  pDC->LineTo(x,y);
 }

 

 pDC->MoveTo(0,-125);
 pDC->LineTo(0,-110);
 pDC->MoveTo(0,125);
 pDC->LineTo(0,110);
 pDC->MoveTo(-125,0);
 pDC->LineTo(-110,0);
 pDC->MoveTo(125,0);
 pDC->LineTo(110,0);


 pDC->MoveTo(62.5,-108.25);
 pDC->LineTo(57.5,-99.59);
 pDC->MoveTo(108.25,-62.5);
 pDC->LineTo(99.59,-57.5);
 pDC->MoveTo(62.5,108.25);
 pDC->LineTo(57.5,99.59);
 pDC->MoveTo(108.25,62.5);
 pDC->LineTo(99.59,57.5);

 pDC->MoveTo(-62.5,-108.25);
 pDC->LineTo(-57.5,-99.59);
 pDC->MoveTo(-108.25,-62.5);
 pDC->LineTo(-99.59,-57.5);
 pDC->MoveTo(-62.5,108.25);
 pDC->LineTo(-57.5,99.59);
 pDC->MoveTo(-108.25,62.5);
 pDC->LineTo(-99.59,57.5);

 

 i=30*h*3.14159/180;       //hour!!!
 j=6*mm*3.14159/180;
 k=6*s*3.14159/180;

 pDC->MoveTo(0,0);
 pDC->LineTo((r-10)*sin(k),-(r-10)*cos(k));            //y轴向下为正!
 pDC->MoveTo(0,0);
 pDC->LineTo((r-30)*sin(j),-(r-30)*cos(j));
 pDC->MoveTo(0,0);
 pDC->LineTo((r-50)*sin(i),-(r-50)*cos(i));
 //pDC->TextOut(-50,150,"2009年10月24日");
 pDC->TextOut(400,200,"制作:陈 鹏");
 pDC->TextOut(400,230,"2009年10月24日");

 //Invalidate(true);
 
}


// C闹钟View 诊断

#ifdef _DEBUG
void C闹钟View::AssertValid() const
{
 CView::AssertValid();
}

void C闹钟View::Dump(CDumpContext& dc) const
{
 CView::Dump(dc);
}

C闹钟Doc* C闹钟View::GetDocument() const // 非调试版本是内联的
{
 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(C闹钟Doc)));
 return (C闹钟Doc*)m_pDocument;
}
#endif //_DEBUG


// C闹钟View 消息处理程序

void C闹钟View::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
 // TODO: 在此添加专用代码和/或调用基类

 CView::OnPrepareDC(pDC, pInfo);


 CRect clientrect;
 GetClientRect(clientrect);
 pDC->SetMapMode(MM_ANISOTROPIC);
 pDC->SetWindowExt(clientrect.right,clientrect.bottom);
 pDC->SetWindowOrg(0,0);
 pDC->SetViewportExt(clientrect.right,clientrect.bottom);
 pDC->SetViewportOrg(clientrect.right/2,clientrect.bottom/2);

 

}

 

 

void C闹钟View::OnTimer(UINT_PTR nIDEvent)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 

 CTime t=CTime::GetCurrentTime();
 h=t.GetHour();
 mm=t.GetMinute();
 s=t.GetSecond();

 Invalidate();

 CView::OnTimer(nIDEvent);

}

 

void C闹钟View::OnInitialUpdate()
{
 CView::OnInitialUpdate();
 
   
 // TODO: 在此添加专用代码和/或调用基类
}

int C闹钟View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;

 // TODO:  在此添加您专用的创建代码
    SetTimer(1,1000,NULL);
 return 0;
}

BOOL C闹钟View::OnEraseBkgnd(CDC* pDC)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值

 return CView::OnEraseBkgnd(pDC);
}

 

 

 

 

 

 

 

原来不能重绘的而且时间不符的版本代码如下:

 

 

// 闹钟View.cpp : C闹钟View 类的实现
//

#include "stdafx.h"
#include "闹钟.h"

#include "闹钟Doc.h"
#include "闹钟View.h"

#include<cmath>
#include<cstdlib>

#include <Windows.h> 
#include <CTime> 
#include <string> 

using namespace std;


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// C闹钟View

IMPLEMENT_DYNCREATE(C闹钟View, CView)

BEGIN_MESSAGE_MAP(C闹钟View, CView)
 ON_WM_TIMER()
END_MESSAGE_MAP()

// C闹钟View 构造/析构

C闹钟View::C闹钟View()
{
 // TODO: 在此处添加构造代码

}

C闹钟View::~C闹钟View()
{
}

BOOL C闹钟View::PreCreateWindow(CREATESTRUCT& cs)
{
 // TODO: 在此处通过修改
 //  CREATESTRUCT cs 来修改窗口类或样式

 return CView::PreCreateWindow(cs);
}

// C闹钟View 绘制

void C闹钟View::OnDraw(CDC* pDC)
{
 float x,y;
 float r=125;
 


 pDC->MoveTo(125,0);
 for(float a=0;a<=2*3.14159;a+=0.008)
 {
  x=r*cos(a);
  y=r*sin(a);
  pDC->LineTo(x,y);
 }

 

 pDC->MoveTo(0,-125);
 pDC->LineTo(0,-110);
 pDC->MoveTo(0,125);
 pDC->LineTo(0,110);
 pDC->MoveTo(-125,0);
 pDC->LineTo(-110,0);
 pDC->MoveTo(125,0);
 pDC->LineTo(110,0);


 pDC->MoveTo(62.5,-108.25);
 pDC->LineTo(57.5,-99.59);
 pDC->MoveTo(108.25,-62.5);
 pDC->LineTo(99.59,-57.5);
 pDC->MoveTo(62.5,108.25);
 pDC->LineTo(57.5,99.59);
 pDC->MoveTo(108.25,62.5);
 pDC->LineTo(99.59,57.5);

 pDC->MoveTo(-62.5,-108.25);
 pDC->LineTo(-57.5,-99.59);
 pDC->MoveTo(-108.25,-62.5);
 pDC->LineTo(-99.59,-57.5);
 pDC->MoveTo(-62.5,108.25);
 pDC->LineTo(-57.5,99.59);
 pDC->MoveTo(-108.25,62.5);
 pDC->LineTo(-99.59,57.5);

 
 CTime t=CTime::GetCurrentTime();


 int h=t.GetHour();
 int mm=t.GetMinute();
 int s=t.GetSecond();
 

 
 i=6*h*3.14159/180;
 j=6*mm*3.14159/180;
 k=6*s*3.14159/180;
 pDC->MoveTo(0,0);
 pDC->LineTo((r-10)*cos(k),(r-10)*sin(k));
 pDC->MoveTo(0,0);
 pDC->LineTo((r-30)*cos(j),(r-30)*sin(j));
 pDC->MoveTo(0,0);
 pDC->LineTo((r-50)*cos(i),(r-50)*sin(i));

 

 //pDC->TextOut(-50,150,"2009年10月23日");
 pDC->TextOut(400,200,"制作:陈鹏");
 pDC->TextOut(400,230,"2009年10月23日");

 //Invalidate(false);
}


// C闹钟View 诊断

#ifdef _DEBUG
void C闹钟View::AssertValid() const
{
 CView::AssertValid();
}

void C闹钟View::Dump(CDumpContext& dc) const
{
 CView::Dump(dc);
}

C闹钟Doc* C闹钟View::GetDocument() const // 非调试版本是内联的
{
 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(C闹钟Doc)));
 return (C闹钟Doc*)m_pDocument;
}
#endif //_DEBUG


// C闹钟View 消息处理程序

void C闹钟View::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
 // TODO: 在此添加专用代码和/或调用基类

 CView::OnPrepareDC(pDC, pInfo);


 CRect clientrect;
 GetClientRect(clientrect);
 pDC->SetMapMode(MM_ANISOTROPIC);
 pDC->SetWindowExt(clientrect.right,clientrect.bottom);
 pDC->SetWindowOrg(0,0);
 pDC->SetViewportExt(clientrect.right,clientrect.bottom);
 pDC->SetViewportOrg(clientrect.right/2,clientrect.bottom/2);


 SetTimer(1,1000,NULL);

}

 

 

void C闹钟View::OnTimer(UINT_PTR nIDEvent)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值

  //CDC* pDC=GetDC();
  //C闹钟View::OnDraw(pDC);
  //ReleaseDC(pDC);

 CView::OnTimer(nIDEvent);

}


仔细体会!想明白错在哪里

 

 

图片

 

这是44秒后的截图:
图片

 

又经过3分08秒,截图如下:

图片

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值