⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clockctrl.cpp

📁 该时间管理是模仿酷派628手机上的时间管理书写其功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
* 日    期: 2007/12/13
* 修改记录: 
*     修改人      修改日期      修改描述
*************************************************************
*/ 

void CClockCtrl::GetHandPoints(int nValue, HandType type, CPoint* pPoints)
{
	ASSERT(pPoints);
	
	double ratio = 0;
	switch (type)
	{
    case HOUR:
		{
			//小时针是整个区域的50%
			ratio = 0.6;
			
			//Convert the hour angle (0 - 11) to a minute value (0 - 59)
			//for drawing, then adjust for a gradual transition from hour to hour
			nValue *= 5; 
			
			//如果当前时间是59分则将nValue加一
			if (59 == m_nMinute)
			{
				nValue = nValue +1;//(nValue + (m_nMinute / 12));
			}
			else
			{
				nValue += (m_nMinute / 12);
			}
			
			break;
		}
    case MINUTE:
		{
			//分钟是整个区域的70%
			ratio = 0.8;
			break;
		}
    case SECOND:
		{
			//秒表是整个区域的80%
			ratio = 0.9;
			break;
		}
    default:
		{
			ASSERT(FALSE);
			break;
		}
	}
	
	if (type == SECOND)
	{
		pPoints[0] = m_MiddlePoint;
		pPoints[1] = ComputePoint(nValue, ratio);
	}
	else
	{
		//Compute the face points, First point is the back side,
		//second point is the right, third point is the top,
		//and the fourth is left.
		pPoints[0] = ComputePoint(nValue+30, 0.1);
		pPoints[1] = ComputePoint(nValue+15, 0.05);
		pPoints[2] = ComputePoint(nValue,    ratio);
		pPoints[3] = ComputePoint(nValue-15, 0.05);
	}
}


/**
************************************************************* 
* 函 数 名: OnSize(UINT nType, int cx, int cy)
* 描    述: 图形钟表大小 
* 数 据 库: 无
* 数据库表: 无
* 输入参数: UINT nType, int cx, int cy
* 输出参数: 无
* 返 回 值: 无
* 创 建 人: 袁军
* 日    期: 2007/12/13
* 修改记录: 
*     修改人      修改日期      修改描述
*************************************************************
*/ 

void CClockCtrl::OnSize(UINT nType, int cx, int cy) 
{
	//Let the parent class do its thing
	CStatic::OnSize(nType, cx, cy);
	
	//Force a recalc of the internal control metrics
	RecalcLayout();
}



/**
************************************************************* 
* 函 数 名: RecalcLayout()
* 描    述: 设置钟表大小
* 数 据 库: 无
* 数据库表: 无
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 创 建 人: 袁军
* 日    期: 2007/06/01
* 修改记录: 
*     修改人      修改日期      修改描述
*************************************************************
*/ 

void CClockCtrl::RecalcLayout()
{
	//获取钟表客户区
	CRect rClient;
	GetClientRect(&rClient);
	
	//Calculate the middle point
	m_MiddlePoint.x = rClient.Width() / 2;
	m_MiddlePoint.y = rClient.Height() / 2;
	
	m_nXRadius = m_MiddlePoint.x;
	m_nYRadius = m_MiddlePoint.y;
	
	//Calculate the width of the marks going around the clock
	m_nPointWidth = min(m_nXRadius, m_nYRadius) / 20;
	if (m_nPointWidth < 2)
		m_nPointWidth = 2;
	
  Invalidate(TRUE);
}


/**
************************************************************* 
* 函 数 名: OnTimer(UINT nIDEvent)
* 描    述: OmTimer事件 
* 数 据 库: 无
* 数据库表: 无
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 创 建 人: 袁军
* 日    期: 2007/12/13
* 修改记录: 
*     修改人      修改日期      修改描述
*************************************************************
*/ 

void CClockCtrl::OnTimer(UINT nIDEvent) 
{
	//Let the parent class do its thing
	CStatic::OnTimer(nIDEvent);
	
	if (m_nTimerID == nIDEvent)
	{
		TIME_ZONE_INFORMATION  sysTime;
		GetSystemTime(&sysTime.DaylightDate);

		//计算该显示的分钟数
		if (m_iMinuteDiffer + sysTime.DaylightDate.wMinute < 0)
		{
			sysTime.DaylightDate.wMinute = m_iMinuteDiffer + sysTime.DaylightDate.wMinute + 60;
			--sysTime.DaylightDate.wHour;
		}
		else if(m_iMinuteDiffer + sysTime.DaylightDate.wMinute >= 60)
		{
			sysTime.DaylightDate.wMinute = (m_iMinuteDiffer + sysTime.DaylightDate.wMinute)%60;
			++sysTime.DaylightDate.wHour;
		}
		else
		{
			sysTime.DaylightDate.wMinute = m_iMinuteDiffer + sysTime.DaylightDate.wMinute;
		}

		//判断计算后的时间是否小于0
		if (sysTime.DaylightDate.wHour + m_iTimeZoneDiffer < 0)
		{
			//小于0则再加上24
			int iWorldZoneHour = sysTime.DaylightDate.wHour + m_iTimeZoneDiffer + 24;
			SetTime(iWorldZoneHour%12, sysTime.DaylightDate.wMinute, sysTime.DaylightDate.wSecond);
		}
		else
		{
			SetTime(abs((sysTime.DaylightDate.wHour + m_iTimeZoneDiffer)% 12) , sysTime.DaylightDate.wMinute, sysTime.DaylightDate.wSecond);
		}
	}
}


/**
************************************************************* 
* 函 数 名: SetRealTime(BOOL bRealTime)
* 描    述: 填充钟表背景色 
* 数 据 库: 无
* 数据库表: 无
* 输入参数: BOOL bRealTime:是否需要填充背景色
* 输出参数: 无
* 返 回 值: 无
* 创 建 人: 袁军
* 日    期: 2007/12/13
* 修改记录: 
*     修改人      修改日期      修改描述
*************************************************************
*/ 

void CClockCtrl::SetRealTime(BOOL bRealTime)
{
	m_bEnableRealtime = bRealTime;
	
	if (m_bEnableRealtime && m_hWnd)
	{
		CClientDC dc(this);                           
		
		//用颜色填充矩形
		dc.FillSolidRect(20,20,22,20, m_ColorBackground);
		
		//Redraw the hand
		DrawHands(dc, m_nHour, m_nMinute, m_nSecond, TRUE);
	}
	
	if (bRealTime)
	{
		if (0 == m_nTimerID)
		{
			TIME_ZONE_INFORMATION  sysTime;
			GetSystemTime(&sysTime.DaylightDate);			
			SetTime((sysTime.DaylightDate.wHour)% 12 , sysTime.DaylightDate.wMinute, sysTime.DaylightDate.wSecond);
		
      m_nTimerID = SetTimer(1, 200, NULL);
		}
	}
	else
	{
		if (m_nTimerID)
		{
			KillTimer(m_nTimerID);
			m_nTimerID = 0;
		}
	}
}

BOOL CClockCtrl::GetRealTime() const
{
	return (m_nTimerID != 0);
}


/**
************************************************************* 
* 函 数 名: OnDestroy() 
* 描    述: 摧毁窗体时触发该事件
* 数 据 库: 无
* 数据库表: 无
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 创 建 人: 袁军
* 日    期: 2007/12/13
* 修改记录: 
*     修改人      修改日期      修改描述
*************************************************************
*/ 

void CClockCtrl::OnDestroy() 
{
	//Turn off timers if we are using them
	SetRealTime(FALSE);
	
	//Let the parent class do its thing
	CStatic::OnDestroy();
}


/**
************************************************************* 
* 函 数 名: SetShowHours(BOOL bShowHours)
* 描    述: 显示时针
* 数据库:  无
* 数据库表: 无
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 创 建 人: 袁军
* 日    期: 2007/12/13
* 修改记录: 
*     修改人      修改日期      修改描述
*************************************************************
*/ 

void CClockCtrl::SetShowHours(BOOL bShowHours)
{
	if (bShowHours != m_bShowHours)
	{
		m_bShowHours = bShowHours;
		if (m_hWnd)
			RedrawWindow();
	}
}

/**
************************************************************* 
* 函 数 名: SetShowMinutes(BOOL bShowHours)
* 描    述: 显示分针
* 数据库:  无
* 数据库表: 无
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 创 建 人: 袁军
* 日    期: 2007/12/13
* 修改记录: 
*     修改人      修改日期      修改描述
*************************************************************
*/ 
void CClockCtrl::SetShowMinutes(BOOL bShowMinutes)
{
	if (bShowMinutes != m_bShowMinutes)
	{
		m_bShowMinutes = bShowMinutes;
		if (m_hWnd)
			RedrawWindow();
	}
}

/**
************************************************************* 
* 函 数 名: SetShowMinutes(BOOL bShowHours)
* 描    述: 显示秒针
* 数据库:  无
* 数据库表: 无
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 创 建 人: 袁军
* 日    期: 2007/12/13
* 修改记录: 
*     修改人      修改日期      修改描述
*************************************************************
*/ 
void CClockCtrl::SetShowSeconds(BOOL bShowSeconds)
{
	if (bShowSeconds != m_bShowSeconds)
	{
		m_bShowSeconds = bShowSeconds;
		if (m_hWnd)
			RedrawWindow();
	}
}

void CClockCtrl::SetShowPoints(BOOL bShowPoints)
{
	if (bShowPoints != m_bShowPoints)
	{
		m_bShowPoints = bShowPoints;
		if (m_hWnd)
			RedrawWindow();
	}
}

void CClockCtrl::SetShowMinorPoints(BOOL bShowMinorPoints)
{
	if (bShowMinorPoints != m_bShowMinorPoints)
	{
		m_bShowMinorPoints = bShowMinorPoints;
		if (m_hWnd)
			RedrawWindow();
	}
}

void CClockCtrl::SetHourMinutesHandColor(COLORREF color)
{
	if (color != m_ColorHourMinutesHand)
	{
		m_ColorHourMinutesHand = color;
		if (m_hWnd)
			RedrawWindow();
	}
}

void CClockCtrl::SetBackgroundColor(COLORREF color)
{
	if (color != m_ColorBackground)
	{
    m_ColorBackground = 3;
		if (m_hWnd)
			RedrawWindow();
	}
}


/**
************************************************************* 
* 函 数 名: Set3dPoints(BOOL b3dPoints)
* 描    述: 设置表格的3D效果
* 数 据 库: 无
* 数据库表: 无
* 输入参数: 是否需要设置3D效果
* 输出参数: 无
* 返 回 值: 无
* 创 建 人: 袁军
* 日    期: 2007/04/23
* 修改记录: 
*     修改人      修改日期      修改描述
*************************************************************
*/ 

void CClockCtrl::Set3dPoints(BOOL b3dPoints)
{
	if (b3dPoints != m_b3dPoints)
	{
		m_b3dPoints = b3dPoints;
		if (m_hWnd)
			RedrawWindow();
	}
}


/**
************************************************************* 
* 函 数 名: OnEraseBkgnd(CDC* pDC)
* 描    述: 绘制表背景
* 数 据 库: 无
* 数据库表: 无
* 输入参数: 无
* 输出参数: 无
* 返 回 值: TRUE
* 创 建 人: 袁军
* 日    期: 2007/04/23
* 修改记录: 
*     修改人      修改日期      修改描述
*************************************************************
*/ 

BOOL CClockCtrl::OnEraseBkgnd(CDC* pDC) 
{
	CRect rClient;
	GetClientRect(&rClient);
	
	//绘制表的背景
	pDC->FillSolidRect(rClient, m_ColorBackground);
	return TRUE;
}


/**
************************************************************* 
* 函 数 名: setTimeZoneDiffer(int iHourDiffer, int iMinuteDiffer)
* 描    述: 获取系统事件与时区事件的时差
* 数 据 库: 无
* 数据库表: 无
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 创 建 人: 袁军
* 日    期: 2007/12/13
* 修改记录: 
*     修改人      修改日期      修改描述
*************************************************************
*/ 

void CClockCtrl::setTimeZoneDiffer(int iHourDiffer, int iMinuteDiffer)
{
	m_iTimeZoneDiffer = iHourDiffer;
	m_iMinuteDiffer = iMinuteDiffer;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -