lockobj.cpp
来自「深入浅出Visual C++入门进阶与应用实例 随书光盘 作者 何志丹」· C++ 代码 · 共 174 行
CPP
174 行
// lockObj.cpp: implementation of the ClockObj class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "clock.h"
#include "lockObj.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#include "math.h"
const double PI = 3.1415926535897931 ;
CClockObj::CClockObj(long& crHourPointerColor,long& crMinuteColor,long& crSecondColor,long& crBkColor,long& crScaleColor)
:m_crHourPointerColor(crHourPointerColor),m_crMinPointerColor(crMinuteColor),m_crSecPointerColor(crSecondColor),m_crBkColor(crBkColor),m_crScaleColor(crScaleColor)
{
m_bSetAlarmClock = false ;
m_bAlarming = false ;
m_lAlarmTime = 0 ;
m_crBkColor = RGB(0,0,255) ;
m_crScaleColor = RGB(0,255,0) ;
m_crHourPointerColor = RGB(255,255,0);
m_crMinPointerColor = RGB(0,255,255);
m_crSecPointerColor = RGB(255,0,255);
UpdatePointerPos() ;
}
CClockObj::~CClockObj()
{
}
void CClockObj::OnDraw(CDC *pdc)
{
//画背景
CBrush brush(m_crBkColor) ;
pdc->FillRect(m_rRect,&brush) ;
CPen * pOldPen = NULL ;
{//画分钟刻度
CPen pen(PS_SOLID,1,m_crScaleColor);
CPen * pOldPen = pdc->SelectObject(&pen);
for(int i = 0 ; i < 60 ; i++ )
{
pdc->MoveTo(m_nXO + ( m_nR - 10 ) * sin(PI * i / 30.0) , m_nYO - (m_nR - 10 ) * cos(PI * i / 30.0)) ;
pdc->LineTo(m_nXO + ( m_nR - 4 ) * sin(PI * i / 30.0) , m_nYO - (m_nR - 4 ) * cos(PI * i / 30.0)) ;
}
}
{//画时钟刻度
CPen pen(PS_SOLID,2,m_crScaleColor);
pdc->SelectObject(&pen);
for(int i = 0 ; i < 12 ; i++ )
{
pdc->MoveTo(m_nXO + ( m_nR - 20 ) * sin(PI * i / 6.0) , m_nYO - (m_nR - 20 ) * cos(PI * i / 6.0)) ;
pdc->LineTo(m_nXO + ( m_nR - 4 ) * sin(PI * i / 6.0) , m_nYO - (m_nR - 6 ) * cos(PI * i / 6.0)) ;
}
}
{//画时针
CPen pen(PS_SOLID,1,m_crHourPointerColor);
pdc->SelectObject(&pen);
CBrush brush(m_crHourPointerColor);
pdc->SelectObject(&brush);
DrawPointer(pdc,30,10,10,m_dHourAngle);
}
{//画分钟
CPen pen(PS_SOLID,1,m_crMinPointerColor);
pdc->SelectObject(&pen);
CBrush brush(m_crMinPointerColor);
pdc->SelectObject(&brush);
DrawPointer(pdc,15,6,10,m_dMinAngle);
}
{//画秒针
CPen pen(PS_SOLID,1,m_crSecPointerColor);
pdc->SelectObject(&pen);
CBrush brush(m_crSecPointerColor);
pdc->SelectObject(&brush);
DrawPointer(pdc,4,2,15,m_dSecAngle);
}
pdc->SelectObject(pOldPen);
}
void CClockObj::DrawPointer(CDC *pdc, double d1, double d2, double d3, double angle)
{
CPoint points[4] ;
points[0].x = m_nXO + ( m_nR - d1 ) * sin(angle) ;
points[0].y = m_nYO - ( m_nR - d1 ) * cos(angle) ;
points[1].x = m_nXO - d2*cos(angle);
points[1].y = m_nYO - d2*sin(angle);
points[2].x = m_nXO - d3*sin(angle);
points[2].y = m_nYO + d3*cos(angle);
points[3].x = m_nXO + d2*cos(angle);
points[3].y = m_nYO + d2*sin(angle);
pdc->SetBkMode(TRANSPARENT);
pdc->Polygon(points,4);
}
void CClockObj::UpdatePointerPos()
{
CTime t = CTime::GetCurrentTime();
m_dHourAngle = 2*PI * (t.GetHour() + t.GetMinute()/60.0) / 12 ;
m_dMinAngle = 2*PI * (t.GetMinute() + t.GetSecond()/60.0) / 60 ;
m_dSecAngle = 2*PI * t.GetSecond() / 60 ;
}
void CClockObj::SetRect(CRect rect)
{
m_rRect = rect ;
m_nR = (m_rRect.Width() < m_rRect.Height() ? m_rRect.Width() : m_rRect.Height()) / 2 ;
m_nXO = m_rRect.Width() / 2 ;
m_nYO = m_rRect.Height() / 2 ;
}
bool CClockObj::SetAlarmTime(short nHour, short nMinute, short nSecond)
{
nHour %= 12 ;//有人习惯1到12点,有人习惯0到11点,转化成0到11点
if(nMinute < 0 || nMinute >= 60 )
return false ;
if(nSecond < 0 || nSecond >= 60 )
return false ;
m_bSetAlarmClock = true ;
m_lAlarmTime = 60 * 60 * nHour + 60 * nMinute + nSecond ;
return true ;
}
void CClockObj::StopAlarm()
{
m_bSetAlarmClock = false ;
}
bool CClockObj::IsTimeOut()
{
if(!m_bSetAlarmClock)
return false ;
CTime t = CTime::GetCurrentTime() ;
long lCurAlarmTime = 60 * 60 * ( t.GetHour() % 12 ) + 60 * t.GetMinute() + t.GetSecond() ;
long lTimeSub = lCurAlarmTime - m_lAlarmTime ;
if(lTimeSub < 0 )
return false ;//时间未到
else if(lTimeSub < 5 )//5是误差
{
if(m_bAlarming)
return false ;
else
{
m_bAlarming = true ;
return true ;
}
}
else
{
m_bAlarming = false ;
return false ;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?