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

📄 sgrcalendarcontrol.cpp

📁 一个基于BREW上的电子时钟程序,通过太阳历计算当前时间,并有闹铃和日志功能.
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	// 嵍塃偺攝抲
	if (align & IDF_ALIGN_RIGHT) {
		result.SnapRight(rect.GetRight());
	}
	else if (align & IDF_ALIGN_CENTER) {
		result.SnapLeft(rect.GetLeft());
		result.Offset((rect.GetWidth() - result.GetWidth()) / 2, 0);
	}
	else {
		result.SnapLeft(rect.GetLeft());
	}

	// 忋壓偺攝抲
	if (align & IDF_ALIGN_BOTTOM) {
		result.SnapBottom(rect.GetBottom());
	}
	else if (align & IDF_ALIGN_MIDDLE) {
		result.SnapTop(rect.GetTop());
		result.Offset(0, (rect.GetHeight() - result.GetHeight()) / 2);
	}
	else {
		result.SnapTop(rect.GetTop());
	}

	return result;
}

// 價僢僩儅僢僾傪庢摼偡傞
inline SFBBitmapSmpConstRef SGRCalendarControl::CalendarFont::GetBitmap(Void) const
{
	return _bitmap;
}

SGRCalendarControl::SGRCalendarControl(SFRResponderPtr responder, SFXRectangleConstRef rect, YearFormatEnum yearFormat, MonthFormatEnum monthFormat, DayFormatEnum dayFormat, bool beginMonday) static_throws
 : SFRControl(responder, rect, SFXMargin(2, 2, 2, 2), SFMRESPONDERFILTER(CALENDARCONTROL, BEHAVIOR_CALENDARCONTROL), ATTRIBUTE_CALENDARCONTROL), _yearFormat(yearFormat), _monthFormat(monthFormat), _dayFormat(dayFormat), _beginMonday(beginMonday),
 _cursorDate(SFXDate::CurrentDate()), _timeDifference(9 * 3600)
{
	if (static_try()) {
		static_throw(RegisterHandler(SFEVT_KEY, HANDLER_AFTER, HANDLER_FUNCTION(OnKey)));
	}
	if (static_try()) {
		static_throw(RegisterHandler(SREVT_RESPONDER_RENDER, SRP16_RENDER_BASE, HANDLER_BEFORE, HANDLER_FUNCTION(OnBase)));
	}
	if (static_try()) {
		static_throw(RegisterHandler(SREVT_RESPONDER_RENDER, SRP16_RENDER_CONTENT, HANDLER_BEFORE, HANDLER_FUNCTION(OnContent)));
	}
}

SGRCalendarControl::~SGRCalendarControl(Void)
{
}

HANDLER_IMPLEMENT_BOOLEVENT(SGRCalendarControl, OnKey, event)
{
	SFXDateConst minDate(1981, 1, 1, 0, 0, 0);
	SFXDate date(0x7FFFFFFF);
	SFXDate maxDate(date.GetYear(), 1, 1, 0, 0, 0);
	SFXDateDurationConst delta(date - maxDate);
	Bool result(true);

	if (delta < SFXDateDuration(14 * 24 * 3600)) {
		maxDate.SubYear(1);
	}

	date = _cursorDate;
	switch (event.GetP16()) {
	case AVK_LEFT:
		// 嵍僉乕偼 1 擔慜傊僇乕僜儖傪堏摦
		date.SubDay(1);
		if (date >= minDate) {
			_cursorDate = date;
			InvalidateContent();
		}
		break;
	case AVK_RIGHT:
		// 塃僉乕偼 1 擔屻傊僇乕僜儖傪堏摦
		date.AddDay(1);
		if (date < maxDate) {
			_cursorDate = date;
			InvalidateContent();
		}
		break;
	case AVK_UP:
		// 忋僉乕偼 1 廡娫慜傊僇乕僜儖傪堏摦
		date.SubDay(7);
		if (date >= minDate) {
			_cursorDate = date;
			InvalidateContent();
		}
		break;
	case AVK_DOWN:
		// 壓僉乕偼 1 廡娫屻傊僇乕僜儖傪堏摦
		date.AddDay(7);
		if (date < maxDate) {
			_cursorDate = date;
			InvalidateContent();
		}
		break;
	case AVK_SELECT:
		// 恊偵捠抦
		Invoke(SFXEvent(SREVT_CONTROL, SRP16_OK, reinterpret_cast<UInt32>(this)));
		break;
	case AVK_CLR:
		SetStatusTarget(false);
		Invoke(SFXEvent(SREVT_CONTROL, SRP16_ESCAPE, reinterpret_cast<UInt32>(this)));
		break;
	default:
		result = false;
	}
	
	return result;
}

HANDLER_IMPLEMENT_VOIDRENDER(SGRCalendarControl, OnBase, graphics)
{
	SFXRectangle rect(GetBaseWorld());
	SFXBevelColor frameRGB(SFXRGBColor(0xAA, 0xAA, 0xAA, 0x00), SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00), SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00));

	if (GetInheritEnable()) {
		graphics->DrawBevelRectangle(rect, frameRGB);
		rect.Deflate(1, 1);
		graphics->DrawRectangle(rect, SFXRGBColor(0x00, 0x00, 0x00, 0x00));
	}
	else {
		graphics->FillRectangle(rect, frameRGB.GetBase());
		rect.Deflate(1, 1);
		graphics->DrawRectangle(rect, SFXRGBColor(0x66, 0x66, 0x66, 0x00));
	}
}

HANDLER_IMPLEMENT_VOIDRENDER(SGRCalendarControl, OnContent, graphics)
{
	SFXRectangle worldRect(GetContentWorld());
	SFXRectangle rect, rect2, rect3, rectTmp;
	SFXDate now(SFXDate::CurrentUTCDate());
	now.Add(_timeDifference);
	SFXDateConst today(now.GetYear(), now.GetMonth(), now.GetDay(), 0, 0, 0);
	SFXDateConst firstDate(_cursorDate.GetYear(), _cursorDate.GetMonth(), 1, 0, 0, 0);
	SFXDateConst lastDate(_cursorDate.GetYear(), _cursorDate.GetMonth() + 1, 1, 0, 0, 0);
	SFXRGBColor bgColor(SGRCALENDARCONTROL_BACKGROUND_COLOR);
	SInt32 cellIndex, cellBias, i;
	UInt16 d;
	Bool error(true);
	CalendarFont calendarFont;

	if (!GetInheritEnable()) {
		bgColor.AddRGB(0x11);
	}
	graphics->SetBackColor(bgColor);
	graphics->ClearRectangle(worldRect);
	worldRect.Deflate(2, 2, 2, 2);

	// _cursorDate 傪惓婯壔
	now.Set(_cursorDate.GetYear(), _cursorDate.GetMonth(), _cursorDate.GetDay(), 0, 0, 0);
	_cursorDate = now;

	// 擭偲寧傪昤夋
	rect = worldRect;
	rect.SetHeight(graphics->GetFontHeight() + 1);
	graphics->DrawText(GetYearString(), rect, SFXRGBColor(0, 0, 0, 0), IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE);
	graphics->DrawText(GetMonthString(), rect, SFXRGBColor(0, 0, 0, 0), IDF_ALIGN_RIGHT | IDF_ALIGN_MIDDLE);
	rectTmp = worldRect;
	rectTmp.SetHeight(worldRect.GetHeight() - rect.GetHeight());
	rectTmp.SnapBottom(worldRect.GetBottom());
	worldRect = rectTmp;

	// 僇儗儞僟乕傪昤夋偡傞偺偵昁梫側嵗昗寁嶼
	rect = worldRect;
	rect.SetHeight((_dayFormat == DAYFORMAT_JAPANESE) ? SGRCALENDARCONTROL_DAYFONTHEIGHTJAPANESE : SGRCALENDARCONTROL_DAYFONTHEIGHTENGLISH + 2);
	rect.DivWidth(7);
	rectTmp = worldRect;
	rectTmp.SetHeight(worldRect.GetHeight() - rect.GetHeight() - 1);
	rectTmp.SnapBottom(worldRect.GetBottom());
	worldRect = rectTmp;
	rect2 = worldRect;
	rect2.DivWidth(7);
	rect2.DivHeight(6);		// 僇儗儞僟乕偼嵟戝偱 6 廡

	// 奺僙儖偵 0 偐傜 41 傑偱捠偟斣崋傪怳偭偰丄
	// 偦偺寧偺嵟弶偺擔偺慜偑偳偺僙儖偵懳墳偡傞偐
	cellBias = static_cast<SInt32>(firstDate.GetDayOfWeek());
	if (_beginMonday) {
		--cellBias;
	}
	else {
		if (cellBias == 6) {
			cellBias = -1;
		}
	}

	// 乽崱擔乿偑尰嵼偺寧偵偁傞応崌偼儅乕僋傪昞帵
	if (today >= firstDate && today < lastDate) {
		cellIndex = static_cast<SInt32>(today.GetDay()) + cellBias;
		rectTmp = rect2;
		rectTmp.SetOrigin(rect2.GetWidth() * (cellIndex % 7) + rect2.GetX(), rect2.GetHeight() * (cellIndex / 7) + rect2.GetY());
		if (calendarFont.Create(today.GetDayOfWeek())) {
			rect3 = calendarFont.GetRectangle(rectTmp, IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE);
			graphics->DrawBitmap(calendarFont.GetBitmap(), rect3, AEE_RO_TRANSPARENT);
		}
	}

	// 梛擔傪昤夋
	rectTmp = rect;
	if (!_beginMonday) {
		// 擔梛擔僗僞乕僩
		for (i = CalendarFont::CALENDARFONT_DAY_SUNDAY; i < CalendarFont::CALENDARFONT_DAY_LIMIT; ++i) {
			if (calendarFont.Create(static_cast<CalendarFont::CalendarFontDayEnum>(i), _dayFormat)) {
				rect3 = calendarFont.GetRectangle(rectTmp, IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE);
				graphics->DrawBitmap(calendarFont.GetBitmap(), rect3, AEE_RO_TRANSPARENT);
			}
			rectTmp.AddOrigin(rect.GetWidth(), 0);
		}
	}
	else {
		// 寧梛擔僗僞乕僩
		for (i = CalendarFont::CALENDARFONT_DAY_MONDAY; i < CalendarFont::CALENDARFONT_DAY_LIMIT; ++i) {
			if (calendarFont.Create(static_cast<CalendarFont::CalendarFontDayEnum>(i), _dayFormat)) {
				rect3 = calendarFont.GetRectangle(rectTmp, IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE);
				graphics->DrawBitmap(calendarFont.GetBitmap(), rect3, AEE_RO_TRANSPARENT);
			}
			rectTmp.AddOrigin(rect.GetWidth(), 0);
		}
		if (calendarFont.Create(CalendarFont::CALENDARFONT_DAY_SUNDAY, _dayFormat)) {
			rect3 = calendarFont.GetRectangle(rectTmp, IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE);
			graphics->DrawBitmap(calendarFont.GetBitmap(), rect3, AEE_RO_TRANSPARENT);
		}
	}

	// 擔晅傪昤夋
	for (now = firstDate; now < lastDate; now.AddDay(1)) {
		d = now.GetDay();
		cellIndex = static_cast<SInt32>(d) + cellBias;
		rectTmp = rect2;
		rectTmp.SetOrigin(rect2.GetWidth() * (cellIndex % 7) + rect2.GetX(), rect2.GetHeight() * (cellIndex / 7) + rect2.GetY());
		if (now == today) {
			// 乽崱擔乿
			if (calendarFont.Create(d, CalendarFont::CALENDARFONT_COLOR_WHITE)) {
				rect = calendarFont.GetRectangle(rectTmp, IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE);
				graphics->DrawBitmap(calendarFont.GetBitmap(), rect, AEE_RO_TRANSPARENT);
			}
		}
		else {
			switch (now.GetDayOfWeek()) {
			case SFXDate::DAYOFWEEK_SUNDAY:
				error = calendarFont.Create(d, CalendarFont::CALENDARFONT_COLOR_RED);
				break;
			case SFXDate::DAYOFWEEK_SATURDAY:
				error = calendarFont.Create(d, CalendarFont::CALENDARFONT_COLOR_BLUE);
				break;
			default:
				error = calendarFont.Create(d, CalendarFont::CALENDARFONT_COLOR_BLACK);
			}
			if (error) {
				rect = calendarFont.GetRectangle(rectTmp, IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE);
				graphics->DrawBitmap(calendarFont.GetBitmap(), rect, AEE_RO_TRANSPARENT);
			}

		}
		if (now == _cursorDate) {
			// 僇乕僜儖傪昞帵
			if (GetInheritEnable() && GetInheritFocus() && GetInheritTarget()) {
				if (now == today) {
					error = calendarFont.Create(CalendarFont::CALENDARFONT_CURSOR_TODAY);
				}
				else {
					error = calendarFont.Create(CalendarFont::CALENDARFONT_CURSOR_NORMAL);
				}
				if (error) {
					rect = calendarFont.GetRectangle(rectTmp, IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE);
					graphics->DrawBitmap(calendarFont.GetBitmap(), rect, AEE_RO_TRANSPARENT);
				}
			}
		}
	}
}

// 擭傪暥帤楍偵曄姺偡傞
SFXWideString SGRCalendarControl::GetYearString(Void) const
{
	SFXWideString result;
	SInt32Const y(static_cast<SInt32>(_cursorDate.GetYear()));

	if (_yearFormat == YEARFORMAT_ERANAME) {
		if (y < 1989) {		// 徍榓
			result = SFXWideString::Format("徍榓 %d 擭", y - 1925);
		}
		else {	// 暯惉
			result = SFXWideString::Format("暯惉 %d 擭", y - 1988);
		}
	}
	else {
		if (_monthFormat != MONTHFORMAT_ENGLISH) {
			result = SFXWideString::Format("%d 擭", y);
		}
		else {
			result = SFXWideString::Format("%d", y);
		}
	}
	
	return result;
}

// 寧傪暥帤楍偵曄姺偡傞
SFXWideString SGRCalendarControl::GetMonthString(Void) const
{
	SFXWideString result;
	SInt32 m(static_cast<SInt32>(_cursorDate.GetMonth()));

	switch (_monthFormat) {
	case MONTHFORMAT_NUMBER:
		result = SFXWideString::Format("%d 寧", m);
		break;
	case MONTHFORMAT_JAPANESE:
		switch (m) {
		case 1:
			result = "杛寧";
			break;
		case 2:
			result = "擛寧";
			break;
		case 3:
			result = "栱惗";
			break;
		case 4:
			result = "塊寧";
			break;
		case 5:
			result = "嶩寧";
			break;
		case 6:
			result = "悈柍寧";
			break;
		case 7:
			result = "暥寧";
			break;
		case 8:
			result = "梩寧";
			break;
		case 9:
			result = "挿寧";
			break;
		case 10:
			result = "恄柍寧";
			break;
		case 11:
			result = "憵寧";
			break;
		case 12:
			result = "巘憱";
			break;
		}
		break;
	default:
		switch (m) {
		case 1:
			result = "Jan";
			break;
		case 2:
			result = "Feb";
			break;
		case 3:
			result = "Mar";
			break;
		case 4:
			result = "Apr";
			break;
		case 5:
			result = "May";
			break;
		case 6:
			result = "Jun";
			break;
		case 7:
			result = "Jul";
			break;
		case 8:
			result = "Aug";
			break;
		case 9:
			result = "Sep";
			break;
		case 10:
			result = "Oct";
			break;
		case 11:
			result = "Nov";
			break;
		case 12:
			result = "Dec";
			break;
		}
	}

	return result;
}

⌨️ 快捷键说明

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