CalendarFrm.cpp
上传用户:desheng311
上传日期:2007-01-08
资源大小:47k
文件大小:9k
源码类别:

其他小程序

开发平台:

Visual C++

  1. /***************************************************************************
  2.    致看到这些源代码的兄弟:
  3.        你好!
  4.        这本来是我为一个商业PDA产品开发的日历程序,最近移植于PC机上, 所以算法
  5.    和数据部分是用纯C++写的,不涉及MFC,所有的代码都是以短节省存储空间为主要目
  6.    的.
  7.    很高兴你对这些代码有兴趣,你可以随意复制和使用些代码,唯一有一点小小的
  8.    愿望:在你使用和复制给别人时,别忘注明这些代码作者:-)。程序代码也就罢了,后
  9.    面的数据可是我辛辛苦苦从万年历上找出来输进去的。
  10.    如果你有什么好的意见不妨Mail给我。
  11.        wangfei@hanwang.com.cn
  12.    或
  13.    wangfei@engineer.com.cn
  14.                                                                  2000年3月
  15. ****************************************************************************/
  16. // CalendarFrm.cpp : implementation file
  17. //
  18. #include "stdafx.h"
  19. #include "Calendar.h"
  20. #include "CalendarFrm.h"
  21. #ifdef _DEBUG
  22. #define new DEBUG_NEW
  23. #undef THIS_FILE
  24. static char THIS_FILE[] = __FILE__;
  25. #endif
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CCalendarFrm
  28. CCalendarFrm::CCalendarFrm()
  29. {
  30. }
  31. CCalendarFrm::~CCalendarFrm()
  32. {
  33. }
  34. BEGIN_MESSAGE_MAP(CCalendarFrm, CWnd)
  35. //{{AFX_MSG_MAP(CCalendarFrm)
  36. ON_WM_PAINT()
  37. ON_WM_CREATE()
  38. //}}AFX_MSG_MAP
  39. ON_MESSAGE(UM_SELCHANGE, OnSelChange)
  40. ON_CBN_SELCHANGE(IDC_MONTHSELECT, OnMonthChange)
  41. ON_EN_CHANGE(IDC_YEAREDIT, OnYearChange)
  42. ON_BN_CLICKED(IDC_BUTTODAY, OnTodayClick)
  43. END_MESSAGE_MAP()
  44. /////////////////////////////////////////////////////////////////////////////
  45. // CCalendarFrm message handlers
  46. BOOL CCalendarFrm::Create(RECT &rect, CWnd * pParentWnd, UINT nID)
  47. {
  48. CString szClassName = AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|
  49.                                       CS_HREDRAW|CS_VREDRAW,
  50.                                               0, 0, 0);
  51. rect.right = rect.left + 340;
  52.     rect.bottom = rect.top +214;
  53. //WS_EX_CLIENTEDGE|WS_EX_WINDOWEDGE
  54. //|WS_DLGFRAME|WS_THICKFRAME
  55. if(!CWnd::CreateEx( 0, szClassName, _T(""),
  56.                 WS_DLGFRAME|WS_CHILD|WS_VISIBLE|WS_TABSTOP, rect, 
  57. pParentWnd, nID, NULL)) 
  58.    return FALSE;
  59. UpdateWindow();
  60. l_CreateDispFont();
  61. return TRUE;
  62. }
  63. void CCalendarFrm::l_PaintToday(CPaintDC &dc)
  64. {
  65. #define STARTX  102
  66. #define STARTY  155
  67.    SYSTEMTIME systime;
  68.    ::GetSystemTime(&systime);
  69.    CString str;
  70.    str.Format("今天:%4d年%2d月%2d日", systime.wYear, systime.wMonth, systime.wDay);    
  71.    dc.Draw3dRect(STARTX, STARTY, 227, 22, RGB(128,128,128), RGB(255,255,255));
  72.    dc.SetBkColor(::GetSysColor(4)); 
  73.    dc.TextOut(STARTX+4, STARTY+4, str);
  74. #undef  STARTY
  75. #undef  STARTX
  76. }
  77. void CCalendarFrm::l_PaintBorder(CPaintDC &dc)
  78. {
  79. CRect rect;
  80. GetClientRect(&rect);
  81. /*rect.left ++;
  82. rect.top ++;
  83. dc.FrameRect(&rect, &CBrush(RGB(255,255,255))); 
  84. rect -= CPoint(1,1);
  85.     dc.FrameRect(&rect, &CBrush(RGB(128,128,128))); 
  86.     */
  87. #define LINEY  179
  88. rect.SetRect(rect.left+1, LINEY, rect.right+1, LINEY +2); 
  89. dc.Draw3dRect(&rect, RGB(128, 128, 128), RGB(255,255,255)); 
  90. #define LINEX  96
  91. rect.SetRect(LINEX, 1,  LINEX+2, LINEY+2); 
  92.     dc.Draw3dRect(&rect, RGB(128, 128, 128), RGB(255,255,255)); 
  93. #undef  LINEX
  94. #undef  LINEY
  95. }
  96. void CCalendarFrm::l_PaintChineseInfo(CPaintDC &dc)
  97. {
  98. WORD iYear , iMonth, iDay;
  99. #define DISP_X  15
  100. #define DISP_Y  55
  101. WORD iHolDay = CCalendar::GetLunarDate(m_oCalendar.GetYear(), 
  102.                                    m_oCalendar.GetMonth(),
  103.                                        m_oCalendar.GetDay(), 
  104.    iYear, iMonth, iDay); 
  105. char text[18];
  106. CCalendar::FormatLunarYear(iYear, text); 
  107. dc.SetBkColor(::GetSysColor(4));
  108. dc.TextOut(DISP_X, DISP_Y, text); 
  109. CCalendar::FormatMonth(iMonth, text);
  110. dc.TextOut(DISP_X+23, DISP_Y+20, text);
  111. CCalendar::FormatLunarDay(iDay, text);
  112. dc.TextOut(DISP_X+39, DISP_Y+40, text);
  113.     char *HolText[] ={"小寒", "大寒", "立春", "雨水",
  114.               "惊蛰", "春分", "清明", "谷雨",
  115.   "立夏", "小满", "芒种", "夏至",
  116.                       "小暑", "大暑", "立秋", "处暑",
  117.   "白露", "秋分", "寒露", "霜降",
  118.   "立冬", "小雪", "大雪", "冬至"};
  119. if(iHolDay)
  120. {
  121.    strcpy(text,"今日 ");
  122.    strcat(text, HolText[iHolDay-1]);
  123.    dc.TextOut(DISP_X, DISP_Y+80, text); 
  124. }
  125. else
  126.    dc.TextOut(DISP_X, DISP_Y+80, "         "); 
  127. #undef DISP_X
  128. #undef DISP_Y
  129. }
  130. void CCalendarFrm::OnPaint() 
  131. {
  132. CPaintDC dc(this); // device context for painting
  133. dc.SelectObject(GetDispFont());
  134. l_PaintBorder(dc);
  135. l_PaintChineseInfo(dc);
  136. l_PaintToday(dc);
  137. }
  138. int CCalendarFrm::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  139. {
  140. if (CWnd::OnCreate(lpCreateStruct) == -1)
  141. return -1;
  142.     //create calendar
  143. CRect rect;
  144. GetClientRect(&rect);
  145. rect.left = rect.CenterPoint().x - 64;
  146. rect.top  += 2; 
  147.     if(!m_oCalendar.Create(rect, this, IDC_CALENDAR))
  148. return -1;
  149. #define LEFT_X   2
  150. #define TOP_Y    2
  151. #define WIDTH    90
  152. #define HEIGHT   22
  153. //create select year spingbutton and buddy
  154. rect.SetRect(LEFT_X, TOP_Y, LEFT_X+WIDTH, TOP_Y+HEIGHT);
  155. if(!m_oYearEdit.Create(rect, this, IDC_YEAREDIT))
  156. return -1;   
  157.     m_oYearEdit.SetLimitText(4);  
  158. rect.SetRect(79, 3, 98, 23);
  159.     if(!m_oYearSelect.Create(UDS_NOTHOUSANDS|WS_CHILD|WS_TABSTOP|
  160.                      WS_VISIBLE|UDS_SETBUDDYINT|UDS_ALIGNRIGHT, 
  161.  rect, this, IDC_YEARSELECT))
  162. return -1;
  163.     m_oYearSelect.SetBuddy(&m_oYearEdit); 
  164.     m_oYearSelect.SetRange(START_YEAR, END_YEAR);
  165. m_oYearSelect.SetPos(m_oCalendar.GetYear());
  166.     
  167. //create select month combobox
  168. rect.SetRect(LEFT_X, TOP_Y+HEIGHT+ 2, LEFT_X + WIDTH, TOP_Y+ 8*HEIGHT + 2); 
  169. if(!m_oMonthSelect.Create(WS_VSCROLL|CBS_DROPDOWNLIST|WS_CHILD|
  170.                       WS_VISIBLE|WS_TABSTOP, 
  171.                                     rect, this, IDC_MONTHSELECT))
  172. return -1;
  173. #undef LEFT_X
  174. #undef TOP_Y
  175. #undef WIDTH 
  176. #undef HEIGHT
  177. //create today button
  178. rect.SetRect(255, 184, 328, 206);
  179. if(!m_obutToday.Create("今天", WS_CHILD|WS_VISIBLE|WS_TABSTOP, rect, this, IDC_BUTTODAY))
  180. return -1; 
  181.    
  182. char text[10];
  183. for(int i=0; i<12; i++)
  184. {  
  185. CCalendar::FormatMonth(i+1, text, FALSE); 
  186. m_oMonthSelect.AddString(text); 
  187. }
  188. m_oMonthSelect.SetCurSel(m_oCalendar.GetMonth()-1);  
  189.     
  190. return 0;
  191. }
  192. void CCalendarFrm::OnSelChange(LONG iYearMonth, LONG iDay)
  193. {
  194.   Invalidate(FALSE); 
  195. }
  196. void CCalendarFrm::OnMonthChange()
  197. {
  198. WORD iYear, iDay, iMonth;
  199. m_oCalendar.GetDate(iYear, iMonth, iDay); 
  200. iMonth = m_oMonthSelect.GetCurSel()+1;
  201.  
  202. if(iMonth != m_oCalendar.GetMonth())
  203. {
  204. if(iDay > CCalendar::MonthDays(iYear, iMonth))
  205. iDay = CCalendar::MonthDays(iYear, iMonth); 
  206. m_oCalendar.SetDate(iYear, iMonth, iDay); 
  207. Invalidate(); 
  208. }
  209. }
  210. void CCalendarFrm::OnYearChange()
  211. {
  212. CString text;
  213. m_oYearEdit.GetWindowText(text); 
  214. if(text.GetLength()<4)
  215. return;
  216. WORD iYear, iMonth, iDay;
  217. m_oCalendar.GetDate(iYear, iMonth, iDay);
  218. iYear = m_oYearSelect.GetPos();
  219. if(iYear != m_oCalendar.GetYear())
  220. {
  221. if(iDay > CCalendar::MonthDays(iYear, iMonth))
  222. iDay = CCalendar::MonthDays(iYear, iMonth); 
  223. m_oCalendar.SetDate(iYear, iMonth, iDay); 
  224. text.Format("%4d", iYear);
  225. m_oYearEdit.SetWindowText(text); 
  226. Invalidate(); 
  227. }
  228. }
  229. void CCalendarFrm::OnTodayClick()
  230. {
  231.    WORD iYear, iMonth, iDay;
  232.     SYSTEMTIME systime;
  233. ::GetSystemTime(&systime);
  234. iYear  = systime.wYear;
  235. iMonth = systime.wMonth;
  236. iDay   = systime.wDay;
  237.     if(iYear != m_oCalendar.GetYear() || iMonth != m_oCalendar.GetMonth()
  238.                               || iDay  !=  m_oCalendar.GetDay())
  239. {
  240. SetDate(iYear, iMonth, iDay);
  241. m_oYearSelect.SetPos(iYear);
  242. m_oMonthSelect.SetCurSel(iMonth -1); 
  243. Invalidate(); 
  244. }
  245. }
  246. void CCalendarFrm::l_CreateDispFont()
  247. {
  248. static LOGFONT logFont;
  249. memset(&logFont, 0 ,sizeof(logFont));
  250. logFont.lfHeight         = 16;
  251. logFont.lfWeight         = FW_NORMAL;
  252. logFont.lfWidth          = 0;
  253. logFont.lfCharSet        = GB2312_CHARSET;
  254. logFont.lfOutPrecision   = OUT_DEFAULT_PRECIS;
  255. logFont.lfClipPrecision  = CLIP_DEFAULT_PRECIS;
  256. logFont.lfQuality        = PROOF_QUALITY;
  257. logFont.lfPitchAndFamily = VARIABLE_PITCH|FF_ROMAN;  
  258.     strcpy(logFont.lfFaceName, "Disp Font"); 
  259. m_oDispFont.CreateFontIndirect(&logFont); 
  260. SetFont(&m_oDispFont, FALSE);
  261. }
  262. /////////////////////////////////////////////////////////////////////////////
  263. // CYearEdit
  264. CYearEdit::CYearEdit()
  265. {
  266. }
  267. CYearEdit::~CYearEdit()
  268. {
  269. }
  270. BEGIN_MESSAGE_MAP(CYearEdit, CEdit)
  271. //{{AFX_MSG_MAP(CYearEdit)
  272. ON_WM_CHAR()
  273. ON_WM_KILLFOCUS()
  274. //}}AFX_MSG_MAP
  275. END_MESSAGE_MAP()
  276. /////////////////////////////////////////////////////////////////////////////
  277. // CYearEdit message handlers
  278. BOOL CYearEdit::Create(const RECT& rect, CWnd* pParentWnd, UINT nID) 
  279. {
  280. return CWnd::CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), NULL, 
  281.                         WS_CHILD|WS_VISIBLE, rect, pParentWnd, nID);
  282. }
  283. void CYearEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  284. {
  285. if(nChar < '0' || nChar > '9')
  286. return;
  287.     CEdit::OnChar(nChar, nRepCnt, nFlags);
  288. }
  289. void CYearEdit::OnKillFocus(CWnd* pNewWnd) 
  290. {
  291. char syear[6];
  292. GetWindowText(syear, 5);
  293.     long iyear = atol(syear);
  294. if(iyear < START_YEAR)
  295. {
  296. sprintf(syear, "%4d", START_YEAR);
  297.     SetWindowText(syear);
  298. }
  299. else if(iyear > END_YEAR)
  300. {
  301. sprintf(syear, "%4d", END_YEAR);
  302.     SetWindowText(syear);
  303. }
  304. CEdit::OnKillFocus(pNewWnd);
  305. }