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

📄 sgrcalendarcontrol.cpp

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

#include "SGRCalendarControl.hpp"
#include "calendar_font_res.h"

#define SGRCALENDARCONTROL_NUMBERFONTRESFILE		"calendar_font.bar"
#define SGRCALENDARCONTROL_NUMBERFONTWIDTH			6
#define SGRCALENDARCONTROL_NUMBERFONTHEIGHT			11
#define SGRCALENDARCONTROL_DAYFONTRESFILE			"calendar_font.bar"
#define SGRCALENDARCONTROL_DAYFONTWIDTHENGLISH		14
#define SGRCALENDARCONTROL_DAYFONTWIDTHJAPANESE		11
#define SGRCALENDARCONTROL_DAYFONTHEIGHTENGLISH		7
#define SGRCALENDARCONTROL_DAYFONTHEIGHTJAPANESE	9
#define SGRCALENDARCONTROL_TODAYMARKRESFILE			"calendar_font.bar"
#define SGRCALENDARCONTROL_TODAYMARK_WIDTH			20
#define SGRCALENDARCONTROL_TODAYMARK_HEIGHT			20
#define SGRCALENDARCONTROL_BACKGROUND_COLOR			229, 242, 238, 0
#define SGRCALENDARCONTROL_CURSORRESFILE			"calendar_font.bar"
#define SGRCALENDARCONTROL_CURSOR_WIDTH				18
#define SGRCALENDARCONTROL_CURSOR_HEIGHT			18
#define SGRCALENDARCONTROL_TRANSPARENCYCOLOR		255, 0, 255, 0

// 悢帤價僢僩儅僢僾偺嵍抂偺嵗昗傪庢摼偡傞
inline SInt32 SGRCalendarControl::CalendarFont::GetNumberResourceLeft(UInt08 number)
{
	SInt32 result;

	switch (number) {
	case 0:
		result = 0;
		break;
	case 1:
		result = 7;
		break;
	case 2:
		result = 14;
		break;
	case 3:
		result = 21;
		break;
	case 4:
		result = 28;
		break;
	case 5:
		result = 35;
		break;
	case 6:
		result = 42;
		break;
	case 7:
		result = 49;
		break;
	case 8:
		result = 56;
		break;
	case 9:
		result = 63;
		break;
	default:
		result = 63;
	}
	return result;
}

// 悢帤價僢僩儅僢僾偺忋抂偺嵗昗傪庢摼偡傞
inline SInt32 SGRCalendarControl::CalendarFont::GetNumberResourceTop(UInt08 /* number */)
{
	return 0;
}

// 梛擔價僢僩儅僢僾偺嵍抂偺嵗昗傪庢摼偡傞
inline SInt32 SGRCalendarControl::CalendarFont::GetDayResourceLeft(SGRCalendarControl::CalendarFont::CalendarFontDayEnum day, SGRCalendarControl::DayFormatEnum format)
{
	SInt32 result;

	if (format == DAYFORMAT_JAPANESE) {
		switch (day) {
		case CALENDARFONT_DAY_SUNDAY:
			result = 0;
			break;
		case CALENDARFONT_DAY_MONDAY:
			result = 11;
			break;
		case CALENDARFONT_DAY_TUESDAY:
			result = 22;
			break;
		case CALENDARFONT_DAY_WEDNESDAY:
			result = 33;
			break;
		case CALENDARFONT_DAT_THURSDAY:
			result = 44;
			break;
		case CALENDARFONT_DAY_FRIDAY:
			result = 55;
			break;
		case CALENDARFONT_DAY_SATURDAY:
			result = 66;
			break;
		default:
			result = 0;
		}
	}
	else {
		switch (day) {
		case CALENDARFONT_DAY_SUNDAY:
			result = 0;
			break;
		case CALENDARFONT_DAY_MONDAY:
			result = 20;
			break;
		case CALENDARFONT_DAY_TUESDAY:
			result = 40;
			break;
		case CALENDARFONT_DAY_WEDNESDAY:
			result = 60;
			break;
		case CALENDARFONT_DAT_THURSDAY:
			result = 80;
			break;
		case CALENDARFONT_DAY_FRIDAY:
			result = 100;
			break;
		case CALENDARFONT_DAY_SATURDAY:
			result = 120;
			break;
		default:
			result = 0;
		}
	}
	
	return result;
}

// 梛擔偺忋抂偺 Y 嵗昗
inline SInt32 SGRCalendarControl::CalendarFont::GetDayResourceTop(SGRCalendarControl::CalendarFont::CalendarFontDayEnum /* day */, SGRCalendarControl::DayFormatEnum /* format */)
{
	return 0;
}

SGRCalendarControl::CalendarFont::CalendarFont(Void)
{
	Clear();
}

SGRCalendarControl::CalendarFont::CalendarFont(SGRCalendarControl::CalendarFontConstRef ob)
{
	Copy(ob);
}

SGRCalendarControl::CalendarFont::CalendarFont(UInt32 val, SGRCalendarControl::CalendarFont::CalendarFontNumberColorEnum color)
{
	Create(val, color);
}

SGRCalendarControl::CalendarFont::CalendarFont(SGRCalendarControl::CalendarFont::CalendarFontDayEnum day, SGRCalendarControl::DayFormatEnum format)
{
	Create(day, format);
}

SGRCalendarControl::CalendarFont::CalendarFont(SFXDate::DayOfWeekEnum day)
{
	Create(day);
}

SGRCalendarControl::CalendarFont::CalendarFont(SGRCalendarControl::CalendarFont::CalendarFontCursorEnum cursorType)
{
	Create(cursorType);
}

const SGRCalendarControl::CalendarFont &SGRCalendarControl::CalendarFont::operator=(SGRCalendarControl::CalendarFontConstRef ob)
{
	Copy(ob);
	return *this;
}

// 悢帤傪曄姺偡傞
Bool SGRCalendarControl::CalendarFont::Create(UInt32 val, SGRCalendarControl::CalendarFont::CalendarFontNumberColorEnum color)
{
	UInt32 d;
	SInt32 i, max;
	UInt08 number;
	SFXArray<UInt08> digit;
	SFXSize size;
	SFBShellSmp shell(SFBShell::GetInstance());
	SFBBitmapSmp resBitmap;
	SFCError error;
	Bool result(true);

	// 悢帤傪寘偛偲偵曄姺
	while (val > 0) {
		d = val % 10;
		digit.Append(static_cast<UInt08>(d));
		val /= 10;
	}
	max = digit.GetSize();
	size.Set(static_cast<SInt16>(SGRCALENDARCONTROL_NUMBERFONTWIDTH * max), SGRCALENDARCONTROL_NUMBERFONTHEIGHT);

	// 價僢僩儅僢僾傪峔抸
	Clear();
	_bitmap = SFXGraphics::CreateBitmap(size);
	if (_bitmap == null) {
		return false;
	}
	switch (color) {
	case CALENDARFONT_COLOR_BLACK:
		resBitmap = shell->LoadResBitmap(SGRCALENDARCONTROL_NUMBERFONTRESFILE, CALENDARFONT_NUMBER_WEEKDAY);
		break;
	case CALENDARFONT_COLOR_BLUE:
		resBitmap = shell->LoadResBitmap(SGRCALENDARCONTROL_NUMBERFONTRESFILE, CALENDARFONT_NUMBER_SATURDAY);
		break;
	case CALENDARFONT_COLOR_RED:
		resBitmap = shell->LoadResBitmap(SGRCALENDARCONTROL_NUMBERFONTRESFILE, CALENDARFONT_NUMBER_SUNDAY);
		break;
	case CALENDARFONT_COLOR_WHITE:
		resBitmap = shell->LoadResBitmap(SGRCALENDARCONTROL_NUMBERFONTRESFILE, CALENDARFONT_NUMBER_TODAY);
		break;
	}
	if (resBitmap == null) {
		return false;
	}

	// 價僢僩儅僢僾傪僐僺乕
	for (i = 0; i < max; ++i) {
		number = digit.Get(max - i - 1);
		error = _bitmap->BltIn(SGRCALENDARCONTROL_NUMBERFONTWIDTH * i, 0, SGRCALENDARCONTROL_NUMBERFONTWIDTH, SGRCALENDARCONTROL_NUMBERFONTHEIGHT, resBitmap, GetNumberResourceLeft(number), GetNumberResourceTop(number), AEE_RO_COPY);
		if (error != SFERR_NO_ERROR) {
			result = false;
			Clear();
			break;
		}
	}
	if (result) {
		_size = size;
		SetTransparencyColor(SFXRGBColor(SGRCALENDARCONTROL_TRANSPARENCYCOLOR));
	}
	return result;
}

// 梛擔傪曄姺偡傞
Bool SGRCalendarControl::CalendarFont::Create(SGRCalendarControl::CalendarFont::CalendarFontDayEnum day, SGRCalendarControl::DayFormatEnum format)
{
	SFXSize size;
	SFBShellSmp shell(SFBShell::GetInstance());
	SFBBitmapSmp resBitmap;
	SFCError error;

	// 價僢僩儅僢僾傪峔抸
	if (format == DAYFORMAT_ENGLISH) {
		size.Set(SGRCALENDARCONTROL_DAYFONTWIDTHENGLISH, SGRCALENDARCONTROL_DAYFONTHEIGHTENGLISH);
	}
	else {
		size.Set(SGRCALENDARCONTROL_DAYFONTWIDTHJAPANESE, SGRCALENDARCONTROL_DAYFONTHEIGHTJAPANESE);
	}
	Clear();
	_bitmap = SFXGraphics::CreateBitmap(size);
	if (_bitmap == null) {
		return false;
	}
	if (format == DAYFORMAT_ENGLISH) {
		resBitmap = shell->LoadResBitmap(SGRCALENDARCONTROL_DAYFONTRESFILE, CALENDARFONT_WEEK_ENGLISH);
	}
	else {
		resBitmap = shell->LoadResBitmap(SGRCALENDARCONTROL_DAYFONTRESFILE, CALENDARFONT_WEEK_JAPANESE);
	}
	if (resBitmap == null) {
		return false;
	}

	// 價僢僩儅僢僾傪僐僺乕
	error = _bitmap->BltIn(0, 0, size.GetWidth(), size.GetHeight(), resBitmap, GetDayResourceLeft(day, format), GetDayResourceTop(day, format), AEE_RO_COPY);
	if (error == SFERR_NO_ERROR) {
		_size = size;
		SetTransparencyColor(SFXRGBColor(SGRCALENDARCONTROL_TRANSPARENCYCOLOR));
		return true;
	}
	else {
		Clear();
		return false;
	}
}

// 乽崱擔乿儅乕僋
Bool SGRCalendarControl::CalendarFont::Create(SFXDate::DayOfWeekEnum day)
{
	SFXSizeConst size(SGRCALENDARCONTROL_TODAYMARK_WIDTH, SGRCALENDARCONTROL_TODAYMARK_HEIGHT);
	SFBShellSmp shell(SFBShell::GetInstance());
	SFBBitmapSmp resBitmap;
	SFCError error;

	Clear();
	_bitmap = SFXGraphics::CreateBitmap(size);
	if (_bitmap == null) {
		return false;
	}
	switch (day) {
	case SFXDate::DAYOFWEEK_SUNDAY:
		resBitmap = shell->LoadResBitmap(SGRCALENDARCONTROL_TODAYMARKRESFILE, CALENDARMARK_TODAY_SUNDAY);
		break;
	case SFXDate::DAYOFWEEK_SATURDAY:
		resBitmap = shell->LoadResBitmap(SGRCALENDARCONTROL_TODAYMARKRESFILE, CALENDARMARK_TODAY_SATURDAY);
		break;
	default:
		resBitmap = shell->LoadResBitmap(SGRCALENDARCONTROL_TODAYMARKRESFILE, CALENDARMARK_TODAY_WEEKDAY);
	}
	if (resBitmap == null) {
		return false;
	}

	// 價僢僩儅僢僾傪僐僺乕
	error = _bitmap->BltIn(0, 0, size.GetWidth(), size.GetHeight(), resBitmap, 0, 0, AEE_RO_COPY);
	if (error == SFERR_NO_ERROR) {
		_size = size;
		SetTransparencyColor(SFXRGBColor(SGRCALENDARCONTROL_TRANSPARENCYCOLOR));
		return true;
	}
	else {
		Clear();
		return false;
	}
}

// 僇乕僜儖
Bool SGRCalendarControl::CalendarFont::Create(SGRCalendarControl::CalendarFont::CalendarFontCursorEnum cursorType)
{
	SFXSizeConst size(SGRCALENDARCONTROL_CURSOR_WIDTH, SGRCALENDARCONTROL_CURSOR_HEIGHT);
	SFBShellSmp shell(SFBShell::GetInstance());
	SFBBitmapSmp resBitmap;
	SFCError error;

	Clear();
	_bitmap = SFXGraphics::CreateBitmap(size);
	if (_bitmap == null) {
		return false;
	}
	switch (cursorType) {
	case CALENDARFONT_CURSOR_NORMAL:
		resBitmap = shell->LoadResBitmap(SGRCALENDARCONTROL_CURSORRESFILE, CALENDARCURSOR_NORMAL);
		break;
	case CALENDARFONT_CURSOR_TODAY:
		resBitmap = shell->LoadResBitmap(SGRCALENDARCONTROL_CURSORRESFILE, CALENDARCURSOR_TODAY);
		break;
	}
	if (resBitmap == null) {
		return false;
	}

	// 價僢僩儅僢僾傪僐僺乕
	error = _bitmap->BltIn(0, 0, size.GetWidth(), size.GetHeight(), resBitmap, 0, 0, AEE_RO_COPY);
	if (error == SFERR_NO_ERROR) {
		_size = size;
		SetTransparencyColor(SFXRGBColor(SGRCALENDARCONTROL_TRANSPARENCYCOLOR));
		return true;
	}
	else {
		Clear();
		return false;
	}
}

// 夋憸偲偟偰峔抸偟偨僼僅儞僩忣曬傪攋婞
Void SGRCalendarControl::CalendarFont::Clear(Void)
{
	if (_bitmap != null) {
		_bitmap.Release();
	}
	_size.Set(0, 0);
}

// 僼僅儞僩傪僐僺乕
Bool SGRCalendarControl::CalendarFont::Copy(SGRCalendarControl::CalendarFontConstRef ob)
{
	SFCError error;

	Clear();
	_bitmap = SFXGraphics::CreateBitmap(ob._size);
	if (_bitmap == null) {
		return false;
	}
	error = _bitmap->BltIn(0, 0, ob._size.GetWidth(), ob._size.GetHeight(), ob._bitmap, 0, 0, AEE_RO_COPY);
	if (error == SFERR_NO_ERROR) {
		_size = ob._size;
		SetTransparencyColor(SFXRGBColor(SGRCALENDARCONTROL_TRANSPARENCYCOLOR));
		return true;
	}
	else {
		Clear();
		return false;
	}
}

// 巜掕偝傟偨嬮宍椞堟偵攝抲偡傞
SFXRectangle SGRCalendarControl::CalendarFont::GetRectangle(SFXRectangleConstRef rect, UInt32 align)
{
	SFXRectangle result(0, 0, _size);

⌨️ 快捷键说明

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