📄 ndkalendar.cpp
字号:
#include "NDKalendar.h"
#include "KalendarManage.h"
CCalendarManage* CCalendarManage::NewL()
{
CCalendarManage* self = NewLC();
CleanupStack::Pop(self);
return self;
}
CCalendarManage* CCalendarManage::NewLC()
{
CCalendarManage* self = new(ELeave) CCalendarManage;
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
CCalendarManage::CCalendarManage()
{
}
void CCalendarManage::ConstructL()
{
TTime time;
time.HomeTime();
TDateTime dateTime = time.DateTime();
iSolarYear = dateTime.Year();
iSolarMonth = dateTime.Month();
iSolarDate = dateTime.Day();
SetWeekDayAndMonthDays();
ConSolarToLunar();
}
CCalendarManage::~CCalendarManage()
{
}
void CCalendarManage::SetSolarYear(TInt aYear)
{
iSolarYear = aYear;
if(iSolarYear<FirstYear)
{
iSolarYear = LastYear;
}
else if(iSolarYear>LastYear)
{
iSolarYear = FirstYear;
}
SetWeekDayAndMonthDays();
ConSolarToLunar();
}
TInt CCalendarManage::GetSolarYear()
{
return iSolarYear;
}
void CCalendarManage::SetSolarMonth(TInt aMonth)
{
iSolarMonth = aMonth;
if(iSolarMonth<0)
{
iSolarMonth = EDecember;
iSolarYear--;
}
else if(iSolarMonth==12)
{
iSolarMonth = EJanuary;
iSolarYear++;
}
SetSolarYear(iSolarYear);
if(iSolarDate+1>iMonthDays)
{
iSolarDate = iMonthDays-1;
}
}
TInt CCalendarManage::GetSolarMonth()
{
return iSolarMonth;
}
void CCalendarManage::SetSolarDate(TMove aMove)
{
if(aMove == ELeftMove)
{
iSolarDate--;
if(iSolarDate<0)
{
if(iSolarMonth-1>0)
{
if(IsLeapYear(iSolarYear))
{
iSolarDate = SolarCal[1][iSolarMonth-1]-1;
}
else
{
iSolarDate = SolarCal[0][iSolarMonth-1]-1;
}
}
else
{
iSolarDate = 30;
}
iSolarMonth--;
}
}
else if(aMove == ERightMove)
{
iSolarDate++;
if(iSolarDate==iMonthDays)
{
iSolarDate = 0;
iSolarMonth++;
}
}
else if(aMove == EDownMove)
{
iSolarDate += 7;
if(iSolarDate>=iMonthDays)
{
iSolarMonth++;
iSolarDate -= iMonthDays;
}
}
else if(aMove == EUpMove)
{
iSolarDate -= 7;
if(iSolarDate<0)
{
iSolarMonth--;
SetSolarMonth(iSolarMonth);
iSolarDate += iMonthDays;
}
}
SetSolarMonth(iSolarMonth);
}
TInt CCalendarManage::GetSolarDate()
{
return iSolarDate;
}
void CCalendarManage::SetWeekDayAndMonthDays()
{
if(IsLeapYear(iSolarYear))
{
iWeekDay = (SolarDays[1][iSolarMonth] + LunarCal[iSolarYear-FirstYear].BaseWeekday)%7 + 1;
iMonthDays = SolarCal[1][iSolarMonth];
}
else
{
iWeekDay = (SolarDays[0][iSolarMonth] + LunarCal[iSolarYear-FirstYear].BaseWeekday)%7 + 1;
iMonthDays = SolarCal[0][iSolarMonth];
}
}
TInt CCalendarManage::GetWeekDay()
{
return iWeekDay;
}
TInt CCalendarManage::GetMonthDay()
{
return iMonthDays;
}
void CCalendarManage::ConSolarToLunar()
{
iLunarDate.Zero();
TInt nAccDays;
TInt nMonth = iSolarMonth;
TInt nYear = iSolarYear-FirstYear;
if(IsLeapYear(nYear))
{
nAccDays = SolarDays[1][iSolarMonth] + iSolarDate + 1;
}
else
{
nAccDays = SolarDays[0][iSolarMonth] + iSolarDate + 1;
}
if(nAccDays<=LunarCal[nYear].BaseDays)
{
nYear --;
nMonth += 12;
if(IsLeapYear(nYear))
{
nAccDays = SolarDays[1][nMonth] + iSolarDate + 1;
}
else
{
nAccDays = SolarDays[0][nMonth] + iSolarDate + 1;
}
}
TInt l1 = LunarCal[nYear].BaseDays;
TInt l2 = 0;
for(TInt i=0;i<13;i++)
{
l2 = l1 + LunarCal[nYear].MonthDays[i] + 29;
if(nAccDays<=l2)
{
break;
}
l1 = l2;
}
TInt nLunarMonth = i + 1;
TInt nLunarDate = nAccDays - l1;
TInt nLeapFlag = LunarCal[nYear].InterCalation;
if(nLeapFlag != 0 && nLunarMonth>nLeapFlag)
{
nLunarMonth--;
if(nLunarMonth == nLeapFlag)
{
nLunarMonth = nLeapFlag;
}
}
if(nLunarMonth>12)
{
nLunarMonth -= 12;
}
iLunarDate.Copy(KLunar);
iLunarDate.AppendNum(nLunarMonth);
iLunarDate.Append(KLunarMonth);
iLunarDate.AppendNum(nLunarDate);
iLunarDate.Append(KLunarDate);
}
TDesC& CCalendarManage::GetLunarDate()
{
return iLunarDate;
}
TBool CCalendarManage::IsLeapYear(TInt aYear)
{
if(0 == aYear%400)
{
return ETrue;
}
else if(0 == aYear%100)
{
return EFalse;
}
else if(0 == aYear%4)
{
return ETrue;
}
return EFalse;
}
//构造函数
CNDCalendar::CNDCalendar()
{
}
void CNDCalendar::ConstructL()
{
iCalendarManage = CCalendarManage::NewL();
iWeekDayArray = new(ELeave) CDesC16ArrayFlat(7);
iWeekDayArray->AppendL(KMonday);
iWeekDayArray->AppendL(KTuesday);
iWeekDayArray->AppendL(KWednesday);
iWeekDayArray->AppendL(KThursday);
iWeekDayArray->AppendL(KFriday);
iWeekDayArray->AppendL(KSaturday);
iWeekDayArray->AppendL(KSunday);
}
//析构函数
CNDCalendar::~CNDCalendar()
{
delete iCalendarManage;
delete iWeekDayArray;
delete iDateArray;
}
//绘制Calendar
void CNDCalendar::Draw(const TRect& aRect) const
{
CWindowGc& gc = SystemGc();
gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
gc.SetBrushColor(KRgbWhite);
gc.DrawRect(Rect());
gc.SetBrushColor(KRgbBlack);
gc.DrawLine(TPoint(22,18),TPoint(22,144));
gc.DrawLine(TPoint(0,18),TPoint(176,18));
gc.DrawLine(TPoint(0,36),TPoint(176,36));
gc.SetBrushColor(KRgbGray);
for(TInt i=2;i<8;i++)
{
gc.DrawLine(TPoint(i*22,36),TPoint(i*22,144));
gc.DrawLine(TPoint(22,i*18),TPoint(176,i*18));
}
const CFont* iFontTemp = iEikonEnv->LegendFont();
gc.UseFont(iFontTemp);
for(i=0;i<7;i++)
{
gc.DrawText((*iWeekDayArray)[i],TPoint((i+1)*22+5,34));
}
TInt weekDay = iCalendarManage->GetWeekDay();
TInt monthDay = iCalendarManage->GetMonthDay();
TBuf<30> sTmp;
sTmp.Num(iCalendarManage->GetSolarYear());
sTmp.Append(KYear);
sTmp.AppendNum(iCalendarManage->GetSolarMonth()+1);
sTmp.Append(KMonth);
gc.DrawText(sTmp,TPoint(50,16));
TInt x = weekDay;
TInt y = 54;
gc.SetBrushColor(KRgbDarkCyan);
for(i=0;i<monthDay;i++)
{
sTmp.Num(i+1);
if(i==iCalendarManage->GetSolarDate())
{
gc.DrawRect(TRect(x*22,y-18,x*22+22,y));
}
gc.DrawText(sTmp,TPoint(x*22+5,y));
x++;
if(0 == x%8)
{
y += 18;
x = 1;
}
}
gc.DrawTextVertical(iCalendarManage->GetLunarDate(),TPoint(5,50),EFalse);
}
//按键处理
TKeyResponse CNDCalendar::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
{
if(aKeyEvent.iCode == EKeyLeftArrow && aType == EEventKey)
{
iCalendarManage->SetSolarDate(ELeftMove);
}
else if(aKeyEvent.iCode == EKeyRightArrow && aType == EEventKey)
{
iCalendarManage->SetSolarDate(ERightMove);
}
else if(aKeyEvent.iCode == EKeyDownArrow && aType == EEventKey)
{
iCalendarManage->SetSolarDate(EDownMove);
}
else if(aKeyEvent.iCode == EKeyUpArrow && aType == EEventKey)
{
iCalendarManage->SetSolarDate(EUpMove);
}
else if(aKeyEvent.iCode == EKeyF6 && aType == EEventKey)
{
iCalendarManage->SetSolarMonth(iCalendarManage->GetSolarMonth()-1);
}
DrawDeferred();
return EKeyWasConsumed;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -