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 + -
显示快捷键?