1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114 |
- // Calendar1.cpp : implementation file
- //
- /***************************************************************************
- 致看到这些源代码的兄弟:
- 你好!
- 这本来是我为一个商业PDA产品开发的日历程序,最近移植于PC机上, 所以算法
- 和数据部分是用纯C++写的,不涉及MFC,所有的代码都是以短节省存储空间为主要目
- 的.
- 很高兴你对这些代码有兴趣,你可以随意复制和使用些代码,唯一有一点小小的
- 愿望:在你使用和复制给别人时,别忘注明这些代码作者:-)。程序代码也就罢了,后
- 面的数据可是我辛辛苦苦从万年历上找出来输进去的。
- 如果你有什么好的意见不妨Mail给我。
- wangfei@hanwang.com.cn
- 或
- wangfei@engineer.com.cn
- ****************************************************************************/
- #include "stdafx.h"
- #include "ylgl.h"
- #include "Calendar1.h"
- #include "Calendarfrm.h"
- #include "TodayForm.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CCalendar
- // Download by http://www.codefans.net
- extern WORD gLunarMonthDay[];
- extern BYTE gLunarMonth[];
- extern BYTE gLunarHolDay[];
- const WORD START_YEAR =1901;
- const WORD END_YEAR =2050;
- void CCalendar::l_InitData()
- {
- SYSTEMTIME systime;
- ::GetSystemTime(&systime);
- m_iYear = systime.wYear;
- m_iMonth = systime.wMonth;
- m_iDay = systime.wDay;
- m_dwBackColor = RGB(255,255,255);
- m_dwForeColor = RGB(0,0,0);
- m_dwSelForeColor = RGB(255,255,255);
- m_dwSelColor = RGB(117,185,242);
- m_dwTitleBkColor = RGB(83,115,176);
- m_dwTitleColor = RGB(255,255,255);
- }
- CCalendar::CCalendar(WORD iYear, WORD iMonth, WORD iDay)
- {
- if(!SetDate(iYear, iMonth, iDay))
- l_InitData();
- ticks=::GetTickCount ();
- }
- CCalendar::CCalendar()
- {
- l_InitData();
- }
- CCalendar::~CCalendar()
- {
- DestroyWindow();
- m_font.DeleteObject ();
- }
- BEGIN_MESSAGE_MAP(CCalendar, CWnd)
- //{{AFX_MSG_MAP(CCalendar)
- ON_WM_PAINT()
- ON_WM_LBUTTONDOWN()
- ON_WM_LBUTTONDBLCLK()
- ON_WM_CONTEXTMENU()
- ON_WM_CREATE()
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /* ON_COMMAND(ID_TITLEBKCOLOR, OnTitleBkColor)
- ON_COMMAND(ID_TITLECOLOR, OnTitleColor)
- ON_COMMAND(ID_SELCOLOR, OnSelColor)
- ON_COMMAND(ID_FORECOLOR, OnForeColor)
- #define COL_WIDTH 32
- #define ROW_HEIGHT 20
- #define TITLE_HEIGHT 20*/
- int COL_WIDTH = 62;
- int ROW_HEIGHT = 40;
- int TITLE_HEIGHT= 40;
- BOOL CCalendar::Create(RECT &rect, CWnd *pParentWnd, UINT nID)
- {
- CString szClassName = AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|CS_HREDRAW|CS_VREDRAW,0, (HBRUSH)CBrush(RGB(255,255,255)), 0);
- int cx=m_rect.Width ();
- int cy=m_rect.Height ();
- COL_WIDTH=cx/7; // Jeff:列宽;
- ROW_HEIGHT=(cy-20)/6; // Jeff:行宽;
- #if 1 // Jeffdubeg
- TITLE_HEIGHT = 20; // Jeff:标题栏高 20 (最上一栏,用来显示日、一、二、三...六);
- #else
- TITLE_HEIGHT = 34;
- #endif
- rect=m_rect;
- rect.left =0;
- rect.top =0;
- rect.right = rect.left + COL_WIDTH*7 +4;
- rect.bottom = rect.top + TITLE_HEIGHT+ROW_HEIGHT*6 +10 ;
- if(!CWnd::CreateEx(WS_EX_CLIENTEDGE, szClassName, _T(""),
- WS_CHILD|WS_VISIBLE|WS_TABSTOP, rect,
- pParentWnd, nID, NULL))
- return FALSE;
- UpdateWindow();
- for(int i=0; i<42; i++)
- m_oBitMapList[i].LoadBitmap(IDB_BITMAP1+i);
- /* m_oPopMenu.CreatePopupMenu();
- m_oPopMenu.AppendMenu(MF_STRING, ID_TITLEBKCOLOR, _T("标题背景色..."));
- m_oPopMenu.AppendMenu(MF_STRING, ID_TITLECOLOR, _T("标题前景色..."));
- m_oPopMenu.AppendMenu(MF_STRING, ID_FORECOLOR , _T("日期前景色..."));
- m_oPopMenu.AppendMenu(MF_STRING, ID_SELCOLOR, _T("选中区颜色..."));
- */
- m_font.CreatePointFont(80, _T("宋体"));
- return TRUE;
- }
- /////////////////////////////////////////////////////////////////////////////
- // CCalendar message handlers
- void CCalendar::l_PaintTitle(CPaintDC &dc)
- {
- CRect rect, rect2, rect3 ;
- GetClientRect(&rect);
- rect.left ++; rect.top ++;
- rect.right --;
- rect3=rect;
- rect.bottom = rect.top + TITLE_HEIGHT;
- rect2=rect;
- // dc.FillRect(&rect, &CBrush(m_dwTitleBkColor));
- COLORREF array[7]= {RGB(164,191,213),RGB(137,170,199),RGB(109,153,189),RGB(84,135,177),RGB(71,115,151),RGB(83,115,176),RGB(92,84,177)};
- if(g_bRedSkin)
- {
- array[0]= RGB(227,150,184);
- array[1]= RGB(219,118,162);
- array[2]= RGB(210,87,141);
- array[3]= RGB(204,60,122);
- array[4]= RGB(174,47,102);
- array[5]= RGB(202,58,120);
- array[6]= RGB(149,40,87);
- }
- rect.right=rect.left +COL_WIDTH;
- int i = 0;
- for(i=0; i <7; i++)
- {
- dc.FillRect(&rect, &CBrush(array[i]));
- rect.left+=COL_WIDTH;
- rect.right+=COL_WIDTH;
- }
- CPen pen( PS_SOLID, 1, RGB(182,192,203) );
- CPen* pOldPen = dc.SelectObject( &pen );
- CRect rc=rect3;
- rect3.left -=1;
- rect3.right=rect3.left +COL_WIDTH;
- for( i=1; i <7; i++)
- {
- dc.MoveTo (rect3.right, rect3.top );
- dc.LineTo (rect3.right, rect3.bottom );
- rect3.left+=COL_WIDTH;
- rect3.right+=COL_WIDTH;
- }
- rc.top +=TITLE_HEIGHT+ROW_HEIGHT;
- for( i=1; i <6; i++)
- {
- dc.MoveTo (rc.left, rc.top );
- dc.LineTo (rc.right, rc.top );
- rc.top+=ROW_HEIGHT;
- }
- dc.SelectObject( pOldPen );
- pen.DeleteObject();
- dc.SetTextColor(m_dwTitleColor);
- rect=rect2;
- int startx = rect.left +8;
- char sztext[][3]={"日","一","二","三","四","五","六"};
- for( i=0; i <7; i++)
- {
- dc.SetBkColor(array[i]);
- dc.TextOut(startx, rect.top +2, sztext[i]);
- startx += COL_WIDTH;
- }
- }
- void GetStrSize(CDC *pDC, char *str, CSize &size)
- {
- GetTextExtentPoint32(pDC->GetSafeHdc(), str, strlen(str), &size);
- size.cx = MulDiv(size.cx, 72, GetDeviceCaps(pDC->GetSafeHdc(), LOGPIXELSX));
- size.cy = MulDiv(size.cy, 72, GetDeviceCaps(pDC->GetSafeHdc(), LOGPIXELSY));
- }
- void CCalendar:: l_PaintOneDay(
- CPaintDC &dc,
- CDC &imgdc,
- WORD &iDay,
- WORD &iLunarYear,
- WORD &iLunarMonth,
- WORD &iLunarDay,
- LONG startx,
- LONG starty
- )
- {
- CString str;
- if(m_Array.GetSize() > iDay) str=m_Array.ElementAt(iDay);
- char text[100];
- #ifdef VC60
- sprintf(text, "%2d", iDay);
- #else
- sprintf_s(text, 100, "%2d", iDay);
- #endif
- // select icon
- if(iLunarDay!=1)
- imgdc.SelectObject(&m_oBitMapList[iLunarDay-1]); //5,6,7..月首日
- else
- imgdc.SelectObject(&m_oBitMapList[29+iLunarMonth]);
- // if day == current day
- if(iDay++ == m_iDay)
- {
- dc.FillRect(&CRect(startx-1, starty+2, startx +COL_WIDTH-2, starty + ROW_HEIGHT+1), &CBrush(m_dwSelColor));
- dc.SetTextColor(m_dwSelForeColor);
- dc.SetBkColor(m_dwSelColor);
- //dc.SelectObject(((CCalendarFrm *)GetParent())->GetDispFont()); // Jeff 获取父对话框的字体;// 在OnPaint中已加载过一次;
- dc.TextOut(startx+2, starty+3, text);
- CSize size;
- GetStrSize(&dc, "1", size);
- dc.SelectObject(&m_font);
- CSize size2;
- GetStrSize(&dc, "拍照", size2);
- int dy=size.cy;
- int dy2=size2.cy+2;
- int pos=str.Find ("\n");
- CString temp;
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2*2, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2*3, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2*4, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- dc.TextOut(startx+2, starty+dy+dy2*5, temp);
- dc.SetBkColor(m_dwBackColor);
- dc.SetTextColor(m_dwForeColor);
- dc.BitBlt(startx+21, starty +4, 8,16,&imgdc,0,0,MERGEPAINT);
- m_font.DeleteObject();
- }
- else
- {
- //dc.SelectObject(((CCalendarFrm *)GetParent())->GetDispFont());// 在OnPaint中已加载过一次;
- dc.TextOut(startx+2, starty+3, text);
- CSize size;
- GetStrSize(&dc, "1", size);
- dc.SelectObject(&m_font);
- CSize size2;
- GetStrSize(&dc, "拍照", size2);
- int dy=size.cy;
- int dy2=size2.cy+2;
- int pos=str.Find ("\n");
- CString temp;
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2*2, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2*3, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2*4, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- dc.TextOut(startx+2, starty+dy+dy2*5, temp);
- dc.BitBlt(startx+21, starty +4, 8,16,&imgdc,0,0,SRCCOPY);
- m_font.DeleteObject();
- }
- if(iLunarDay<29)
- iLunarDay++;
- else
- {
- LONG days = LunarMonthDays(iLunarYear, iLunarMonth);
- if(!HIWORD(days) && iLunarDay == LOWORD(days))
- iLunarMonth = (iLunarMonth)%12+1;
- if(iLunarDay < LOBYTE(days))
- iLunarDay++;
- else
- iLunarDay =1;
- }
- }
- void CCalendar:: l_PaintOneDay_1(
- CPaintDC &dc,
- CDC &imgdc,
- WORD &iDay,
- WORD &iLunarYear,
- WORD &iLunarMonth,
- WORD &iLunarDay,
- LONG startx,
- LONG starty
- )
- {
- CString str;
- if(m_Array.GetSize() > iDay) str=m_Array.ElementAt(iDay);
- char text[100];
- #ifdef VC60
- sprintf(text, "%2d", iDay);
- #else
- sprintf_s(text, 100, "%2d", iDay);
- #endif
- // select icon
- if(iLunarDay!=1)
- imgdc.SelectObject(&m_oBitMapList[iLunarDay-1]); //5,6,7..月首日
- else
- imgdc.SelectObject(&m_oBitMapList[29+iLunarMonth]);
- // if day == current day
- if(iDay++ == m_iDay)
- {
- dc.FillRect(&CRect(startx-1, starty+2, startx +COL_WIDTH-2, starty + ROW_HEIGHT+1), &CBrush(m_dwSelColor));
- dc.SetTextColor(m_dwSelForeColor);
- dc.SetBkColor(m_dwSelColor);
- //dc.SelectObject(((CCalendarFrm *)GetParent())->GetDispFont()); // Jeff 获取父对话框的字体;// 在OnPaint中已加载过一次;
- dc.TextOut(startx+2, starty+3, text);
- CSize size;
- GetStrSize(&dc, "1", size);
- m_font.DeleteObject();
- m_font.CreatePointFont (100, _T("宋体")); // Add
- dc.SelectObject(&m_font);
- CSize size2;
- GetStrSize(&dc, "拍照", size2);
- int dy=size.cy;
- int dy2=size2.cy+2;
- int pos=str.Find ("\n");
- CString temp;
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2*2, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2*3, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2*4, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- dc.TextOut(startx+2, starty+dy+dy2*5, temp);
- dc.SetBkColor(m_dwBackColor);
- dc.SetTextColor(m_dwForeColor);
- dc.BitBlt(startx+21, starty +4, 8,16,&imgdc,0,0,MERGEPAINT);
- m_font.DeleteObject();
- m_font.CreatePointFont (80, _T("宋体")); // 未单击的,默认使用80字体;
- }
- else
- {
- //dc.SelectObject(((CCalendarFrm *)GetParent())->GetDispFont());// 在OnPaint中已加载过一次;
- dc.TextOut(startx+2, starty+3, text);
- CSize size;
- GetStrSize(&dc, "1", size);
- dc.SelectObject(&m_font);
- CSize size2;
- GetStrSize(&dc, "拍照", size2);
- int dy=size.cy;
- int dy2=size2.cy+2;
- int pos=str.Find ("\n");
- CString temp;
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2*2, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2*3, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- str=str.Right (str.GetLength ()-pos-1);
- dc.TextOut(startx+2, starty+dy+dy2*4, temp);
- pos=str.Find ("\n");
- temp=str.Left (pos);
- dc.TextOut(startx+2, starty+dy+dy2*5, temp);
-
- dc.BitBlt(startx+21, starty +4, 8,16,&imgdc,0,0,SRCCOPY);
- m_font.DeleteObject();
- }
- if(iLunarDay<29)
- iLunarDay++;
- else
- {
- LONG days = LunarMonthDays(iLunarYear, iLunarMonth);
- if(!HIWORD(days) && iLunarDay == LOWORD(days))
- iLunarMonth = (iLunarMonth)%12+1;
- if(iLunarDay < LOBYTE(days))
- iLunarDay++;
- else
- iLunarDay =1;
- }
- }
- void CCalendar::l_PaintDate(CPaintDC &dc)
- {
- CDC imgdc;
- imgdc.CreateCompatibleDC(&dc);
- RECT rect;
- GetClientRect(&rect);
- rect.top +=TITLE_HEIGHT;
- dc.SetBkColor(m_dwBackColor);
- dc.SetTextColor(m_dwForeColor);
- WORD day =1;
- WORD iLunarYear, iLunarMonth, iLunarDay;
- GetLunarDate(m_iYear, m_iMonth, 1, iLunarYear, iLunarMonth, iLunarDay);
- for(int i=0; i<6; i++, rect.top += ROW_HEIGHT)
- {
- long startx = rect.left +2;
- for(int j=0; j<7; j++,startx += COL_WIDTH)
- {
- if(j < WeekDay(m_iYear, m_iMonth, 1) && i==0)
- continue;
- if(day > MonthDays(m_iYear, m_iMonth))
- break;
- l_PaintOneDay_1(dc, imgdc, day, iLunarYear, iLunarMonth,
- iLunarDay, startx, rect.top);
- }
- }
- }
- void CCalendar::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
- CFont *font = ((CCalendarFrm *)GetParent())->GetDispFont();
- dc.SelectObject(font);
- dc.SetMapMode(0);
- l_PaintTitle(dc);
- l_PaintDate(dc);
- font->DeleteObject();
- }
- LONG CCalendar::CalcDateDiff(WORD iEndYear, WORD iEndMonth, WORD iEndDay,
- WORD iStartYear, WORD iStartMonth, WORD iStartDay)
- {
- WORD monthday[]={0, 31, 59 ,90, 120, 151, 181, 212, 243, 273, 304, 334};
- //计算两个年份1月1日之间相差的天数
- LONG iDiffDays =(iEndYear - iStartYear)*365;
- iDiffDays += (iEndYear-1)/4 - (iStartYear-1)/4;
- iDiffDays -= ((iEndYear-1)/100 - (iStartYear-1)/100);
- iDiffDays += (iEndYear-1)/400 - (iStartYear-1)/400;
- //加上iEndYear年1月1日到iEndMonth月iEndDay日之间的天数
- iDiffDays += monthday[iEndMonth-1] +
- (IsLeapYear(iEndYear)&&iEndMonth>2? 1: 0);
- iDiffDays += iEndDay;
- //减去iStartYear年1月1日到iStartMonth月iStartDay日之间的天数
- iDiffDays -= (monthday[iStartMonth-1] +
- (IsLeapYear(iStartYear)&&iStartMonth>2 ? 1: 0));
- iDiffDays -= iStartDay;
- return iDiffDays;
- }
- void CCalendar::l_CalcLunarDate(WORD &iYear, WORD &iMonth ,WORD &iDay, LONG iSpanDays)
- {
- //阳历1901年2月19日为阴历1901年正月初一
- //阳历1901年1月1日到2月19日共有49天
- if(iSpanDays <49)
- {
- iYear = START_YEAR-1;
- if(iSpanDays <19)
- {
- iMonth = 11;
- iDay = 11+WORD(iSpanDays);
- }
- else
- {
- iMonth = 12;
- iDay = WORD(iSpanDays) -18;
- }
- return ;
- }
- //下面从阴历1901年正月初一算起
- iSpanDays -=49;
- iYear = START_YEAR;
- iMonth = 1;
- iDay = 1;
- //计算年
- LONG tmp = LunarYearDays(iYear);
- while(iSpanDays >= tmp)
- {
- iSpanDays -= tmp;
- tmp = LunarYearDays(++iYear);
- }
- //计算月
- tmp = LOWORD(LunarMonthDays(iYear, iMonth));
- while(iSpanDays >= tmp)
- {
- iSpanDays -= tmp;
- if(iMonth == GetLeapMonth(iYear))
- {
- tmp = HIWORD(LunarMonthDays(iYear, iMonth));
- if(iSpanDays < tmp)
- break;
- iSpanDays -= tmp;
- }
- tmp = LOWORD(LunarMonthDays(iYear, ++iMonth));
- }
- //计算日
- iDay += WORD(iSpanDays);
- }
- extern void CovertDate2(CString &date);
- WORD CCalendar::GetLunarDate(WORD iYear, WORD iMonth, WORD iDay,
- WORD &iLunarYear, WORD &iLunarMonth, WORD &iLunarDay)
- {
- // l_CalcLunarDate(iLunarYear, iLunarMonth, iLunarDay, CalcDateDiff(iYear, iMonth, iDay));
- CString date;
- date.Format ("%04d-%02d-%02d", iYear, iMonth, iDay);
- CovertDate2(date);
- iLunarYear=atoi(date.Mid (0,4));
- iLunarMonth=atoi(date.Mid (5,2));
- iLunarDay=atoi(date.Mid (8,2));
- return l_GetLunarHolDay(iYear, iMonth, iDay);
- }
- //根据节气数据存储格式,计算阳历iYear年iMonth月iDay日对应的节气,
- WORD CCalendar::l_GetLunarHolDay(WORD iYear, WORD iMonth, WORD iDay)
- {
- BYTE &flag = gLunarHolDay[(iYear - START_YEAR)*12+iMonth -1];
- WORD day;
- if(iDay <15)
- day= 15 - ((flag>>4)&0x0f);
- else
- day = ((flag)&0x0f)+15;
- if(iDay == day)
- return (iMonth-1) *2 + (iDay>15? 1: 0) +1;
- else
- return 0;
- }
- void CCalendar::GetDate(WORD &iYear, WORD &iMonth, WORD &iDay)
- {
- iYear = m_iYear;
- iMonth = m_iMonth;
- iDay = m_iDay;
- }
- BOOL CCalendar::SetDate(WORD iYear, WORD iMonth, WORD iDay)
- {
- if(iYear < START_YEAR || iYear > END_YEAR || iMonth <1 || iMonth >12)
- return FALSE;
- if(iDay <1 || iDay > MonthDays(iYear, iMonth))
- return FALSE;
- m_iYear = iYear;
- m_iMonth = iMonth;
- m_iDay = iDay;
- return TRUE;
- }
- WORD CCalendar::WeekDay(WORD iYear, WORD iMonth, WORD iDay)
- {
- //数组元素monthday[i]表示第i个月以前的总天数除以7的余数
- WORD monthday[]={0,3,3,6,1,4,6,2,5,0,3,5};
- WORD iDays = (iYear-1)%7 + (iYear-1)/4 - (iYear-1)/100 +(iYear-1)/400;
- iDays += (monthday[iMonth-1] +iDay) ;
- //如果iYear是闰年
- if(IsLeapYear(iYear) && iMonth>2)
- iDays++;
- //返回:0,1,2,3,4,5,6表日、一、二、三、四、五、六
- return iDays%7;
- }
- WORD CCalendar::MonthDays(WORD iYear, WORD iMonth)
- {
- switch(iMonth)
- {
- case 1:case 3:case 5:case 7:case 8:case 10:case 12:
- return 31;
- break;
- case 4:case 6:case 9:case 11:
- return 30;
- break;
- case 2:
- //如果是闰年
- if(IsLeapYear(iYear))
- return 29;
- else
- return 28;
- break;
- }
- return 0;
- }
- WORD CCalendar::GetLeapMonth(WORD iLunarYear)
- {
- BYTE &flag = gLunarMonth[(iLunarYear - START_YEAR)/2];
- return (iLunarYear - START_YEAR)%2 ? flag&0x0f : flag>>4;
- }
- LONG CCalendar::LunarMonthDays(WORD iLunarYear, WORD iLunarMonth)
- {
- if(iLunarYear==2013 && iLunarMonth==4)return 29L;
- if(iLunarYear < START_YEAR)
- return 30L;
- WORD height =0 ,low =29;
- int iBit = 16 - iLunarMonth;
- if(iLunarMonth > GetLeapMonth(iLunarYear) && GetLeapMonth(iLunarYear))
- iBit --;
- if(gLunarMonthDay[iLunarYear - START_YEAR] & (1<<iBit))
- low ++;
- if(iLunarMonth == GetLeapMonth(iLunarYear))
- if(gLunarMonthDay[iLunarYear - START_YEAR] & (1<< (iBit -1)))
- height =30;
- else
- height =29;
- return MAKELONG(low, height);
- }
- WORD CCalendar::LunarYearDays(WORD iLunarYear)
- {
- /*
- WORD days=348 ; //12*29
- int month = 12 ;
- //如果iYear年有闰月,则为13个月
- if(gLanarMonth[iYear - START_YEAR])
- month ++;
- //如果某月是三十天则days++
- while(month >=0 && (gLanarMonthDay[iYear - START_YEAR] & (1 << (16 - month))))
- {
- days ++;
- month --;
- }
- return days;
- */
- WORD days =0;
- for(WORD i=1; i<=12; i++)
- {
- LONG tmp = LunarMonthDays(iLunarYear ,i);
- days += HIWORD(tmp);
- days += LOWORD(tmp);
- }
- return days;
- }
- void CCalendar::FormatLunarYear(WORD iYear, char *pBuffer)
- {
- char szText1[]="甲乙丙丁戊己庚辛壬癸";
- char szText2[]="子丑寅卯辰巳午未申酉戌亥";
- char szText3[]="鼠牛虎免龙蛇马羊猴鸡狗猪";
- memcpy(pBuffer, szText1+((iYear-4)%10)*2,2);
- memcpy(pBuffer+2,szText2+((iYear-4)%12)*2,2);
- pBuffer[4]=' ';
- memcpy(pBuffer+5,szText3+((iYear-4)%12)*2,2);
- strcpy(pBuffer+7,"年");
- }
- void CCalendar::FormatMonth(WORD iMonth, char *pBuffer, BOOL bLunar)
- {
- if(!bLunar && iMonth==1)
- {
- strcpy(pBuffer, " 一月");
- return;
- }
- char szText[]="正二三四五六七八九十";
- if(iMonth<=10)
- {
- memcpy(pBuffer, " ", 2);
- memcpy(pBuffer+2, szText + (iMonth -1)*2, 2);
- strcpy(pBuffer+4 , "月");
- return;
- }
- if (iMonth == 11)
- strcpy(pBuffer, "十一");
- else
- strcpy(pBuffer, "十二");
- strcpy(pBuffer+4 , "月");
- }
- void CCalendar::FormatLunarDay(WORD iDay, char *pBuffer)
- {
- char szText1[]="初十廿三";
- char szText2[]="一二三四五六七八九十";
- if(iDay != 20 && iDay !=30)
- {
- memcpy(pBuffer, szText1 + (iDay-1)/10*2 ,2);
- memcpy(pBuffer+2, szText2 + ((iDay-1)%10)*2 ,2);
- pBuffer[4]='\0';
- }
- else
- {
- memcpy(pBuffer, szText1 + iDay/10*2, 2);
- strcpy(pBuffer+2, szText2 +18);
- }
- }
- WORD CCalendar::l_CalcSelectDay(POINT * pt)
- {
- RECT rect;
- GetClientRect(&rect);
- WORD iRow = (pt->y - rect.top -26)/ROW_HEIGHT;
- WORD iCol = (pt->x - rect.left )/COL_WIDTH;
- WORD startcol ,endrow, endcol;
- startcol = WeekDay(m_iYear, m_iMonth, 1);
- endcol = WeekDay(m_iYear, m_iMonth, MonthDays(m_iYear,m_iMonth));
- endrow = (MonthDays(m_iYear, m_iMonth) + startcol -1)/7 ;
- if(iRow == 0 && iCol < startcol || iRow == endrow && iCol > endcol || iRow > endrow)
- return 0;
- return iRow *7 + iCol + 1 - startcol ;
- }
- void CCalendar::OnLButtonDown(UINT nFlags, CPoint point)
- {
- WORD day = l_CalcSelectDay(&point);
- if(day !=0 && day != m_iDay)
- {
- m_bMousePushDown = TRUE;
- m_iDay = day;
- ::PostMessage(GetParent()->m_hWnd, UM_SELCHANGE, MAKELONG(m_iMonth, m_iYear), m_iDay);
- ((TodayForm*)GetParent()->GetParent())->SetDate(m_iYear, m_iMonth, m_iDay);
- // AfxMessageBox("xx");
- }
- SetFocus();
- if(GetTickCount()-ticks<200)
- {
- ((TodayForm*)GetParent()->GetParent())->OnBUTall2();
- }
- ticks=GetTickCount();
- CWnd::OnLButtonDown(nFlags, point);
- }
- void CCalendar::OnLButtonDblClk(UINT nFlags, CPoint point)
- {
- // TODO: Add your message handler code here and/or call default
- CWnd::OnLButtonDblClk(nFlags, point);
- }
- void CCalendar::OnContextMenu(CWnd* pWnd, CPoint point)
- {
- m_oPopMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this);
- }
- void CCalendar::OnTitleBkColor()
- {
- CColorDialog colordlg;
- if(colordlg.DoModal() != IDOK) return;
- m_dwTitleBkColor = colordlg.GetColor();
- Invalidate();
- }
- void CCalendar::OnTitleColor()
- {
- CColorDialog colordlg;
- if(colordlg.DoModal() != IDOK)
- return;
- m_dwTitleColor = colordlg.GetColor();
- Invalidate();
- }
- void CCalendar::OnSelColor()
- {
- CColorDialog colordlg;
- if(colordlg.DoModal() != IDOK)
- return;
- m_dwSelColor = colordlg.GetColor();
- Invalidate();
- }
- void CCalendar::OnForeColor()
- {
- CColorDialog colordlg;
- if(colordlg.DoModal() != IDOK)
- return;
- m_dwForeColor = colordlg.GetColor();
- Invalidate();
- }
- //#undef COL_WIDTH
- //#undef ROW_HEIGHT
- //#undef TITLE_HEIGHT
- /******************************************************************************
- 下面为阴历计算所需的数据,为节省存储空间,所以采用下面比较变态的存储方法.
- *******************************************************************************/
- //数组gLunarDay存入阴历1901年到2100年每年中的月天数信息,
- //阴历每月只能是29或30天,一年用12(或13)个二进制位表示,对应位为1表30天,否则为29天
- WORD gLunarMonthDay[]=
- {
- //测试数据只有1901.1.1 --2050.12.31
- 0X4ae0, 0Xa570, 0X5268, 0Xd260, 0Xd950, 0X6aa8, 0X56a0, 0X9ad0, 0X4ae8, 0X4ae0, //1910
- 0Xa4d8, 0Xa4d0, 0Xd250, 0Xd548, 0Xb550, 0X56a0, 0X96d0, 0X95b0, 0X49b8, 0X49b0, //1920
- 0Xa4b0, 0Xb258, 0X6a50, 0X6d40, 0Xada8, 0X2b60, 0X9570, 0X4978, 0X4970, 0X64b0, //1930
- 0Xd4a0, 0Xea50, 0X6d48, 0X5ad0, 0X2b60, 0X9370, 0X92e0, 0Xc968, 0Xc950, 0Xd4a0, //1940
- 0Xda50, 0Xb550, 0X56a0, 0Xaad8, 0X25d0, 0X92d0, 0Xc958, 0Xa950, 0Xb4a8, 0X6ca0, //1950
- 0Xb550, 0X55a8, 0X4da0, 0Xa5b0, 0X52b8, 0X52b0, 0Xa950, 0Xe950, 0X6aa0, 0Xad50, //1960
- 0Xab50, 0X4b60, 0Xa570, 0Xa570, 0X5260, 0Xe930, 0Xd950, 0X5aa8, 0X56a0, 0X96d0, //1970
- 0X4ae8, 0X4ad0, 0Xa4d0, 0Xd268, 0Xd250, 0Xd528, 0Xb540, 0Xb6a0, 0X96d0, 0X95b0, //1980
- 0X49b0, 0Xa4b8, 0Xa4b0, 0Xb258, 0X6a50, 0X6d40, 0Xada0, 0Xab60, 0X9370, 0X4978, //1990
- 0X4970, 0X64b0, 0X6a50, 0Xea50, 0X6b28, 0X5ac0, 0Xab60, 0X9368, 0X92e0, 0Xc960, //2000
- 0Xd4a8, 0Xd4a0, 0Xda50, 0X5aa8, 0X56a0, 0Xaad8, 0X25d0, 0X92d0, 0Xc958, 0Xa950, //2010
- 0Xb4a0, 0Xb550, 0Xb550, 0X55a8, 0X4ba0, 0Xa5b0, 0X52b8, 0X52b0, 0Xa930, 0X74a8, //2020
- 0X6aa0, 0Xad50, 0X4da8, 0X4b60, 0X9570, 0Xa4e0, 0Xd260, 0Xe930, 0Xd530, 0X5aa0, //2030
- 0X6b50, 0X96d0, 0X4ae8, 0X4ad0, 0Xa4d0, 0Xd258, 0Xd250, 0Xd520, 0Xdaa0, 0Xb5a0, //2040
- 0X56d0, 0X4ad8, 0X49b0, 0Xa4b8, 0Xa4b0, 0Xaa50, 0Xb528, 0X6d20, 0Xada0, 0X55b0, //2050
- };
- //数组gLanarMonth存放阴历1901年到2050年闰月的月份,如没有则为0,每字节存两年
- BYTE gLunarMonth[]=
- {
- 0X00, 0X50, 0X04, 0X00, 0X20, //1910
- 0X60, 0X05, 0X00, 0X20, 0X70, //1920
- 0X05, 0X00, 0X40, 0X02, 0X06, //1930
- 0X00, 0X50, 0X03, 0X07, 0X00, //1940
- 0X60, 0X04, 0X00, 0X20, 0X70, //1950
- 0X05, 0X00, 0X30, 0X80, 0X06, //1960
- 0X00, 0X40, 0X03, 0X07, 0X00, //1970
- 0X50, 0X04, 0X08, 0X00, 0X60, //1980
- 0X04, 0X0a, 0X00, 0X60, 0X05, //1990
- 0X00, 0X30, 0X80, 0X05, 0X00, //2000
- 0X40, 0X02, 0X07, 0X00, 0X50, //2010
- 0X04, 0X09, 0X00, 0X60, 0X04, //2020
- 0X00, 0X20, 0X60, 0X05, 0X00, //2030
- 0X30, 0Xb0, 0X06, 0X00, 0X50, //2040
- 0X02, 0X07, 0X00, 0X50, 0X03 //2050
- };
- //数组gLanarHoliDay存放每年的二十四节气对应的阳历日期
- //每年的二十四节气对应的阳历日期几乎固定,平均分布于十二个月中
- // 1月 2月 3月 4月 5月 6月
- //小寒 大寒 立春 雨水 惊蛰 春分 清明 谷雨 立夏 小满 芒种 夏至
- // 7月 8月 9月 10月 11月 12月
- //小暑 大暑 立秋 处暑 白露 秋分 寒露 霜降 立冬 小雪 大雪 冬至
- /*********************************************************************************
- 节气无任何确定规律,所以只好存表,要节省空间,所以....
- 下面这种存法实在是太变态了,你就将就着看吧
- **********************************************************************************/
- //数据格式说明:
- //如1901年的节气为
- // 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
- // 6, 21, 4, 19, 6, 21, 5, 21, 6,22, 6,22, 8, 23, 8, 24, 8, 24, 8, 24, 8, 23, 8, 22
- // 9, 6, 11,4, 9, 6, 10,6, 9,7, 9,7, 7, 8, 7, 9, 7, 9, 7, 9, 7, 8, 7, 15
- //上面第一行数据为每月节气对应日期,15减去每月第一个节气,每月第二个节气减去15得第二行
- // 这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存放
- //第二个节气的数据,可得下表
- BYTE gLunarHolDay[]=
- {
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1901
- 0X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, //1902
- 0X96, 0XA5, 0X87, 0X96, 0X87, 0X87, 0X79, 0X69, 0X69, 0X69, 0X78, 0X78, //1903
- 0X86, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87, //1904
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1905
- 0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, //1906
- 0X96, 0XA5, 0X87, 0X96, 0X87, 0X87, 0X79, 0X69, 0X69, 0X69, 0X78, 0X78, //1907
- 0X86, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //1908
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1909
- 0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, //1910
- 0X96, 0XA5, 0X87, 0X96, 0X87, 0X87, 0X79, 0X69, 0X69, 0X69, 0X78, 0X78, //1911
- 0X86, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //1912
- 0X95, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1913
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, //1914
- 0X96, 0XA5, 0X97, 0X96, 0X97, 0X87, 0X79, 0X79, 0X69, 0X69, 0X78, 0X78, //1915
- 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //1916
- 0X95, 0XB4, 0X96, 0XA6, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X87, //1917
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X77, //1918
- 0X96, 0XA5, 0X97, 0X96, 0X97, 0X87, 0X79, 0X79, 0X69, 0X69, 0X78, 0X78, //1919
- 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //1920
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X87, //1921
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X77, //1922
- 0X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X69, 0X69, 0X78, 0X78, //1923
- 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //1924
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X87, //1925
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1926
- 0X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, //1927
- 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //1928
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //1929
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1930
- 0X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, //1931
- 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //1932
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //1933
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1934
- 0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, //1935
- 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //1936
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //1937
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1938
- 0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, //1939
- 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //1940
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //1941
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1942
- 0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, //1943
- 0X96, 0XA5, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //1944
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //1945
- 0X95, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, //1946
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, //1947
- 0X96, 0XA5, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //1948
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X79, 0X78, 0X79, 0X77, 0X87, //1949
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, //1950
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, //1951
- 0X96, 0XA5, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //1952
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //1953
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X68, 0X78, 0X87, //1954
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1955
- 0X96, 0XA5, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //1956
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //1957
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //1958
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1959
- 0X96, 0XA4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //1960
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //1961
- 0X96, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //1962
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1963
- 0X96, 0XA4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //1964
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //1965
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //1966
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1967
- 0X96, 0XA4, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //1968
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //1969
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //1970
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, //1971
- 0X96, 0XA4, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //1972
- 0XA5, 0XB5, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //1973
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //1974
- 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, //1975
- 0X96, 0XA4, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X89, 0X88, 0X78, 0X87, 0X87, //1976
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //1977
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87, //1978
- 0X96, 0XB4, 0X96, 0XA6, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, //1979
- 0X96, 0XA4, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //1980
- 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X77, 0X87, //1981
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //1982
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, //1983
- 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, //1984
- 0XA5, 0XB4, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //1985
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //1986
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X79, 0X78, 0X69, 0X78, 0X87, //1987
- 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //1988
- 0XA5, 0XB4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //1989
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //1990
- 0X95, 0XB4, 0X96, 0XA5, 0X86, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //1991
- 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //1992
- 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //1993
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //1994
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X76, 0X78, 0X69, 0X78, 0X87, //1995
- 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //1996
- 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //1997
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //1998
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //1999
- 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2000
- 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2001
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //2002
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //2003
- 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2004
- 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2005
- 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2006
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //2007
- 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2008
- 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2009
- 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2010
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87, //2011
- 0X96, 0XB4, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2012
- 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, //2013
- 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2014
- 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //2015
- 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2016
- 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, //2017
- 0XA5, 0XB4, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2018
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //2019
- 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86, //2020
- 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2021
- 0XA5, 0XB4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2022
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //2023
- 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2024
- 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2025
- 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2026
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //2027
- 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2028
- 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2029
- 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2030
- 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //2031
- 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2032
- 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X86, //2033
- 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X78, 0X88, 0X78, 0X87, 0X87, //2034
- 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2035
- 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2036
- 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2037
- 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2038
- 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2039
- 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2040
- 0XA5, 0XC3, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2041
- 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2042
- 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2043
- 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X88, 0X87, 0X96, //2044
- 0XA5, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2045
- 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, //2046
- 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2047
- 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA5, 0X97, 0X87, 0X87, 0X88, 0X86, 0X96, //2048
- 0XA4, 0XC3, 0XA5, 0XA5, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86, //2049
- 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X78, 0X78, 0X87, 0X87 //2050
- };
|