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

📄 ndkalendar.cpp

📁 symbian 二版本的自定义控件
💻 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 + -