📄 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();
}
CCalendarManage::~CCalendarManage()
{
}
void CCalendarManage::SetSolarYear(TInt aYear)
{
iSolarYear = aYear;
if(iSolarYear<FirstYear)
{
iSolarYear = LastYear;
}
else if(iSolarYear>LastYear)
{
iSolarYear = FirstYear;
}
SetWeekDayAndMonthDays();
}
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())
{
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())
{
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;
}
TBool CCalendarManage::IsLeapYear()
{
if(0 == iSolarYear%400)
{
return ETrue;
}
else if(0 == iSolarYear%100)
{
return EFalse;
}
else if(0 == iSolarYear%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> date;
date.Num(iCalendarManage->GetSolarYear());
date.Append(KYear);
date.AppendNum(iCalendarManage->GetSolarMonth()+1);
date.Append(KMonth);
gc.DrawText(date,TPoint(50,16));
TInt x = weekDay;
TInt y = 54;
gc.SetBrushColor(KRgbDarkCyan);
for(i=0;i<monthDay;i++)
{
date.Num(i+1);
if(i==iCalendarManage->GetSolarDate())
{
gc.DrawRect(TRect(x*22,y-18,x*22+22,y));
}
gc.DrawText(date,TPoint(x*22+5,y));
x++;
if(0 == x%8)
{
y += 18;
x = 1;
}
}
}
//按键处理
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 + -