📄 sgrcalendarcontrol.cpp
字号:
//
// 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 + -