📄 sgrcalendarcontrol.cpp
字号:
// 嵍塃偺攝抲
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 + -