📄 clockctrl.cpp
字号:
* 日 期: 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 + -