MyDateEdit.cpp
上传用户:jzscgs158
上传日期:2022-05-25
资源大小:8709k
文件大小:13k
源码类别:

百货/超市行业

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "MyDateEdit.h"
  3. #ifdef _DEBUG
  4. #define new DEBUG_NEW
  5. #undef THIS_FILE
  6. static char THIS_FILE[] = __FILE__;
  7. #endif
  8. IMPLEMENT_DYNAMIC(CMyDateEdit,CEdit)
  9. BEGIN_MESSAGE_MAP(CMyDateEdit, CEdit)
  10. //{{AFX_MSG_MAP(CMyDateEdit)
  11. ON_WM_CHAR()
  12. ON_WM_KEYDOWN()
  13. ON_WM_KILLFOCUS()
  14. //}}AFX_MSG_MAP
  15. ON_MESSAGE(WM_CUT, OnCut)
  16. ON_MESSAGE(WM_PASTE, OnPaste)
  17. ON_MESSAGE(WM_CLEAR, OnClear)
  18. END_MESSAGE_MAP()
  19. CMyDateEdit::CMyDateEdit()
  20. {
  21. Reset();
  22. m_isDateTime=TRUE;
  23. // SetClassType(edit_datetime);
  24. }
  25. CMyDateEdit::~CMyDateEdit()
  26. {
  27. }
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CMyDateEdit message handlers
  30. void CMyDateEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  31. {
  32. CString str;
  33. GetWindowText(str);
  34. for (int i = 0; i<str.GetLength() && i<m_str.GetLength();i++)
  35. m_str.SetAt(i, str.GetAt(i));
  36. if(!m_bMaskKeyInProgress)
  37. if(!CheckChar(nChar)) return;
  38. if(m_bUseMask)  //要使用掩码
  39. {
  40. if(isdigit(nChar))  //是可打印字符
  41. {
  42. int startPos,endPos;
  43. GetSel(startPos,endPos);
  44. SetSel(startPos,endPos+1);
  45. if(m_strMask.GetAt(startPos)=='-'||m_strMask.GetAt(startPos)==':'||m_strMask.GetAt(startPos)==' ')
  46. {
  47. SetSel(startPos+1,startPos+1);
  48. SendChar(nChar);
  49. return;
  50. }
  51. }
  52. else if(nChar==VK_BACK)
  53. {
  54. int startPos,endPos;
  55. GetSel(startPos,endPos);
  56. if((startPos==endPos) && (startPos>=1) && (startPos<=m_str.GetLength()))
  57. {
  58. char c;
  59. c=m_strMask.GetAt(startPos-1);
  60. if(c=='-'||c==':'||c==' ') 
  61. {
  62. SetSel(startPos-1,startPos-1);
  63. return;
  64. }
  65. ////回退光标
  66. SetSel(startPos-1,startPos-1);
  67. SendChar(c);
  68. //再次退回
  69. SendMessage(WM_KEYDOWN,VK_LEFT,0);
  70. }
  71. else   //越界或者存在选择区域
  72. MessageBeep((UINT)-1);
  73. return;
  74. }
  75. }
  76. CEdit::OnChar(nChar, nRepCnt, nFlags);
  77. }
  78. void CMyDateEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  79. {
  80. if(m_bUseMask)
  81. {
  82. switch(nChar)//忽略删除和插入键
  83. {
  84. case VK_DELETE:
  85. case VK_INSERT: return;
  86. }
  87. }
  88. CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
  89. }
  90. BOOL CMyDateEdit::CheckChar(UINT nChar)
  91. {
  92. int nTime = 0;
  93. //如果不使用掩码,则返回
  94. if(!m_bUseMask) return TRUE;
  95. //如果是控制字符,则返回
  96. if(!isprint(nChar)) return TRUE;
  97. if(!isdigit(nChar))
  98. {
  99. MessageBeep((UINT)-1);
  100. return FALSE;
  101. }
  102. //如果存在选择区域,则取消选择
  103. int startPos,endPos;
  104. GetSel(startPos,endPos);
  105. SetSel(-1,0);
  106. //重新选中原选择区域的第一个字符
  107. SetSel(startPos,startPos);
  108. GetSel(startPos,endPos);
  109. //确保字符串的长度不超过掩码的长度
  110. if(endPos>=m_strMask.GetLength())
  111. {
  112. MessageBeep((UINT)-1);
  113. return FALSE;
  114. }
  115. //时间格式
  116. if(m_isTime)
  117. {
  118. if(!CheckTime(nChar,startPos,endPos))
  119. {
  120. return FALSE;
  121. }
  122. }
  123. //日期格式
  124. if(m_isDate)
  125. {
  126. if(!CheckDate(nChar,startPos,startPos))
  127. {
  128. return FALSE;
  129. }
  130. }
  131. if(m_isDateTime)
  132. {
  133. if(!CheckDate(nChar,startPos,startPos))
  134. {
  135. return FALSE;
  136. }
  137. if(!CheckTime(nChar,startPos,startPos))
  138. {
  139. return FALSE;
  140. }
  141. }
  142.     return TRUE;
  143. }
  144. BOOL CMyDateEdit::CheckDate(char nchar,int StartPos,int EndPos)
  145. {
  146. CString strText;
  147. BOOL Leap;
  148. int Year,Month,Day;
  149. strText=GetText();
  150. Year=atoi(strText);
  151. Month=atoi(strText.Mid(5,2));
  152. Day=atoi(strText.Mid(8,2));
  153. if((Year%4)==0)
  154. {
  155. if(((Year%100)==0)&&((Year%400)!=0))
  156. Leap=FALSE;
  157. else
  158. Leap=TRUE;
  159. }
  160. else
  161. Leap=FALSE;
  162. if(StartPos==4||StartPos==5)
  163. {
  164. if(nchar>'1')
  165. {
  166. MessageBeep((UINT)-1);
  167. return FALSE;
  168. }
  169. else if(nchar=='1')
  170. {
  171. strText=GetText();
  172. if(strText.GetAt(6)>'2')
  173. {
  174. strText.SetAt(6,'2');
  175. SetText(strText);
  176. SetSel(StartPos,StartPos);
  177. return TRUE;
  178. }
  179. }
  180. return TRUE;
  181. }
  182. if(StartPos==6)
  183. {
  184. strText=GetText();
  185. if(strText.GetAt(5)=='1')
  186. {
  187. if(nchar>'2')
  188. {
  189. MessageBeep((UINT)-1);
  190. return FALSE;
  191. }
  192. }
  193. return TRUE;
  194. }
  195. strText=GetText();
  196. if(StartPos==7||StartPos==8)
  197. {
  198. if(Month!=2)
  199. {
  200. if(nchar>'3')
  201. {
  202. MessageBeep((UINT)-1);
  203. return FALSE;
  204. }
  205. else if(nchar=='3')
  206. {
  207. strText=GetText();
  208. if(strText.GetAt(9)>'0')
  209. {
  210. if(Month==4||Month==6||Month==9||Month==11)
  211. {
  212. strText.SetAt(9,'0');
  213. }
  214. else
  215. strText.SetAt(9,'1');
  216. SetText(strText);
  217. SetSel(StartPos,StartPos);
  218. return TRUE;
  219. }
  220. }
  221. }
  222. else
  223. {
  224. if(nchar>'2')
  225. {
  226. MessageBeep((UINT)-1);
  227. return FALSE;
  228. }
  229. else if(nchar=='2')
  230. {
  231. strText=GetText();
  232. if(strText.GetAt(9)>'8')
  233. {
  234. if(Leap)
  235. {
  236. strText.SetAt(9,'9');
  237. }
  238. else
  239. strText.SetAt(9,'8');
  240. SetText(strText);
  241. SetSel(StartPos,StartPos);
  242. return TRUE;
  243. }
  244. }
  245. }
  246. return TRUE;
  247. }
  248. if(StartPos==9)
  249. {
  250. strText=GetText();
  251. if(strText.GetAt(8)=='3')
  252. {
  253. if(Month==4||Month==6||Month==9||Month==11)
  254. {
  255. if(nchar>'0')
  256. {
  257. MessageBeep((UINT)-1);
  258. return FALSE;
  259. }
  260. }
  261. else if(Month!=2)
  262. {
  263. if(nchar>'1')
  264. {
  265. MessageBeep((UINT)-1);
  266. return FALSE;
  267. }
  268. }
  269. }
  270. else if(strText.GetAt(8)=='2')
  271. {
  272. if(Month==2)
  273. {
  274. if(Leap)
  275. {
  276. if(nchar>'9')
  277. {
  278. MessageBeep((UINT)-1);
  279. return FALSE;
  280. }
  281. }
  282. else
  283. {
  284. if(nchar>'8')
  285. {
  286. MessageBeep((UINT)-1);
  287. return FALSE;
  288. }
  289. }
  290. }
  291. }
  292. return TRUE;
  293. }
  294. return TRUE;
  295. }
  296. BOOL CMyDateEdit::CheckTime(char nchar,int StartPos,int EndPos)
  297. {
  298. CString strText;
  299. if(m_isTime)
  300. {
  301. if(StartPos==2||StartPos==3||StartPos==5||StartPos==6)
  302. {
  303. if (nchar>'5')
  304. {
  305. MessageBeep((UINT)-1);
  306. return FALSE;
  307. }
  308. }
  309. if(StartPos==0)
  310. {
  311. if (nchar>'2')
  312. {
  313. MessageBeep((UINT)-1);
  314. return FALSE;
  315. }
  316. if(nchar=='2')
  317. {
  318. if(GetText().GetAt(1)>'3')
  319. {
  320. strText=GetText();
  321. strText.SetAt(1,'3');
  322. SetWindowText(strText);
  323. SetSel(StartPos,EndPos);
  324. return TRUE;
  325. }
  326. }
  327. }
  328. if(StartPos==1)
  329. {
  330. if(GetText().GetAt(0)=='2')
  331. {
  332. if(nchar>'3')
  333. {
  334. MessageBeep((UINT)-1);
  335. return FALSE;
  336. }
  337. }
  338. }
  339. }
  340. if(m_isDateTime)
  341. {
  342. if(StartPos==13||StartPos==14||StartPos==16||StartPos==17)
  343. {
  344. if (nchar>'5')
  345. {
  346. MessageBeep((UINT)-1);
  347. return FALSE;
  348. }
  349. }
  350. if(StartPos==10||StartPos==11)
  351. {
  352. if (nchar>'2')
  353. {
  354. MessageBeep((UINT)-1);
  355. return FALSE;
  356. }
  357. if(nchar=='2')
  358. {
  359. if(GetText().GetAt(12)>'3')
  360. {
  361. strText=GetText();
  362. strText.SetAt(12,'3');
  363. SetWindowText(strText);
  364. SetSel(StartPos,EndPos);
  365. return TRUE;
  366. }
  367. }
  368. }
  369. if(StartPos==12)
  370. {
  371. if(GetText().GetAt(11)=='2')
  372. {
  373. if(nchar>'3')
  374. {
  375. MessageBeep((UINT)-1);
  376. return FALSE;
  377. }
  378. }
  379. }
  380. }
  381. return TRUE;
  382. }
  383. LONG CMyDateEdit::OnCut(UINT, LONG)
  384. {
  385. return 0;
  386. }
  387. // Clears the current selection.
  388. LONG CMyDateEdit::OnClear(UINT wParam, LONG lParam)
  389. {
  390. return 0;
  391. }
  392. // Pastes the text from the clipboard onto the current selection.
  393. LONG CMyDateEdit::OnPaste(UINT, LONG)
  394. {
  395. return 0;
  396. }
  397. void CMyDateEdit::SetClassType(int intStyle)
  398. {
  399.  Reset();
  400.  if(intStyle ==edit_date)       //日期
  401.  {
  402.   m_bUseMask = TRUE;
  403.   m_isDate = TRUE; //added this
  404.   m_strMask = _T("0000-00-00");    //掩码
  405.   m_strLiteral = _T("____-__-__"); //掩码有效设置 有效_ 其它-
  406.          m_str = _T("          "); //数据保存空间
  407.    SetWindowText(_T("    -  -  "));
  408.  }
  409.  else if(intStyle ==edit_time)   //时间
  410.  {
  411.   m_bUseMask = TRUE;
  412.   m_isTime = TRUE; 
  413.        m_strMask = _T("00:00:00");
  414.     m_strLiteral = _T("__:__:__");
  415.            m_str = _T("        ");
  416.      SetWindowText(_T("  :  :  "));
  417.  }
  418.  else if(intStyle ==edit_datetime) //日期+时间
  419.  {
  420.    m_bUseMask = TRUE;
  421.    m_isDateTime = TRUE;
  422.       m_strMask = _T("0000-00-00 00:00:00");
  423.    m_strLiteral = _T("____-__-__ __:__:__");
  424.           m_str = _T("                   ");
  425.     SetWindowText(_T("    -  -     :  :  "));
  426.  }
  427. }
  428. CString CMyDateEdit::GetText()
  429. {
  430. GetWindowText(m_str);
  431. return m_str;
  432. }
  433. void CMyDateEdit::SetText(CString strText)
  434. {
  435. int i,j;
  436. CString str=strText;
  437. str.TrimLeft();
  438. str.TrimRight();
  439. if(str=="") 
  440. {
  441. SetDefault();
  442. return;
  443. }
  444. if(m_isDate)
  445. {
  446. if(strText.GetLength()<10) return;
  447. CString strValue=strText.Left(10);
  448. for (i=0;i<strValue.GetLength();i++)
  449. {
  450. if(i==4||i==7)
  451. {
  452. strValue.SetAt(i,'-');
  453. }
  454. else if(!isdigit(strValue.GetAt(i))&&strValue.GetAt(i)!=' ')
  455. {
  456. strValue.SetAt(i,'0');
  457. }
  458. }
  459. SetWindowText(strValue);
  460. m_str=strValue;
  461. }
  462. if(m_isDateTime)
  463. {
  464. if(strText.GetLength()<19) return;
  465. CString strValue=strText.Left(19);
  466. for (i=0;i<10;i++)
  467. {
  468. if(i==4||i==7)
  469. {
  470. strValue.SetAt(i,'-');
  471. }
  472. else if(!isdigit(strValue.GetAt(i))&&strValue.GetAt(i)!=' ')
  473. {
  474. strValue.SetAt(i,'0');
  475. }
  476. }
  477. strValue.SetAt(10,' ');
  478. for (j=11;j<19;j++)
  479. {
  480. if(j==13||j==16)
  481. {
  482. strValue.SetAt(j,':');
  483. }
  484. else if(!isdigit(strValue.GetAt(j))&&strValue.GetAt(j)!=' ')
  485. {
  486. strValue.SetAt(j,'0');
  487. }
  488. }
  489. m_str=strValue;
  490. SetWindowText(strValue);
  491. }
  492. if(m_isTime)
  493. {
  494. if(strText.GetLength()<8) return;
  495. CString strValue=strText.Left(8);
  496. for (j=0;j<8;j++)
  497. {
  498. if(j==2||j==5)
  499. {
  500. strValue.SetAt(j,':');
  501. }
  502. else if(!isdigit(strValue.GetAt(j))&&strValue.GetAt(j)!=' ')
  503. {
  504. strValue.SetAt(j,'0');
  505. }
  506. }
  507. m_str=strValue;
  508. SetWindowText(strValue);
  509. }
  510. }
  511. void CMyDateEdit::Reset()
  512. {
  513. m_bUseMask=FALSE;
  514. m_strMask=_T("");
  515. m_strLiteral=_T("");
  516. m_bMaskKeyInProgress=FALSE;
  517. m_strMaskLiteral=_T("");
  518. m_str = _T("");
  519. m_isDate = FALSE;//是否是日期格式
  520. m_isTime = FALSE;//是否是时间格式
  521. m_isDateTime = FALSE;//是否是日期时间格式
  522. }
  523. void CMyDateEdit::SendChar(UINT nChar)
  524. {
  525. m_bMaskKeyInProgress=TRUE;
  526. #ifdef WIN32
  527. AfxCallWndProc(this,m_hWnd,WM_CHAR,nChar,1);
  528. #else
  529. SendMessage(WM_CHAR,nChar,1);
  530. #endif
  531. m_bMaskKeyInProgress=FALSE;
  532. }
  533. void CMyDateEdit::SetDefault()
  534. {
  535.  if (m_isDate)
  536.   SetClassType(edit_date);
  537.  else if (m_isTime)
  538.   SetClassType(edit_time);
  539.  else if (m_isDateTime)
  540.  SetClassType(edit_datetime);
  541. }
  542. void CMyDateEdit::SetNow()
  543. {
  544.  COleDateTime tNow = COleDateTime::GetCurrentTime();
  545.  if (m_isDate)
  546.   SetWindowText(tNow.Format("%Y-%m-%d"));
  547.  else if (m_isTime)
  548.   SetWindowText(tNow.Format("%H:%M:%S"));
  549.  else if (m_isDateTime)
  550.   SetWindowText(tNow.Format("%Y-%m-%d %H:%M:%S"));
  551. }
  552. void CMyDateEdit::SetTimeValue(COleDateTime tm)
  553. {
  554.  if (m_isDate)
  555.   SetWindowText(tm.Format("%Y-%m-%d"));
  556.  else if (m_isTime)
  557.   SetWindowText(tm.Format("%H:%M:%S"));
  558.  else if (m_isDateTime)
  559.   SetWindowText(tm.Format("%Y-%m-%d %H:%M:%S"));
  560. }
  561. void CMyDateEdit::SetDetectText(CString strText)
  562. {
  563. CString strYear,strMonth,strDay,strHour,strMin,strSec;
  564. COleDateTime tm;
  565. int i=-1;
  566. int Year;
  567. BOOL Leap=FALSE;
  568. if(m_isDate && strText.GetLength()>=10)
  569. {
  570. strYear=strText.Mid(0,4);
  571. strMonth=strText.Mid(5,2);
  572. strDay=strText.Mid(8,2);
  573. strHour="00";
  574. strMin="00";
  575. strSec="00";
  576. }
  577. if(m_isDateTime && strText.GetLength()>=19)
  578. {
  579. strYear=strText.Mid(0,4);
  580. strMonth=strText.Mid(5,2);
  581. strDay=strText.Mid(8,2);
  582. strHour=strText.Mid(11,2);
  583. strMin=strText.Mid(14,2);
  584. strSec=strText.Mid(17,2);
  585. }
  586. if(m_isTime&& strText.GetLength()>=8)
  587. {
  588. strYear="1960";
  589. strMonth="01";
  590. strDay="01";
  591. strHour=strText.Mid(0,2);
  592. strMin=strText.Mid(3,2);
  593. strSec=strText.Mid(6,7);
  594. }
  595. if(atoi(strYear)<1900 ||atoi(strYear)>2100) strYear="1900";
  596. if(atoi(strMonth)>12||atoi(strMonth)<1) strMonth="01";
  597. if(atoi(strDay)>31||atoi(strDay)<1) strDay="01";
  598. if(atoi(strHour)>23||atoi(strHour)<0) strHour="00";
  599. if(atoi(strMin)>59||atoi(strMin)<0) strMin="00";
  600. if(atoi(strSec)>59||atoi(strSec)<0) strSec="00";
  601. Year=atoi(strYear);
  602. if((Year%4)==0)
  603. {
  604. if(((Year%100)==0)&&((Year%400)!=0))
  605. Leap=FALSE;
  606. else
  607. Leap=TRUE;
  608. }
  609. else
  610. Leap=FALSE;
  611. if(atoi(strMonth)==1||atoi(strMonth)==3||atoi(strMonth)==5||atoi(strMonth)==7
  612. ||atoi(strMonth)==8||atoi(strMonth)==10||atoi(strMonth)==12)
  613. strDay=atoi(strDay)>31?"31":strDay;
  614. if(atoi(strMonth)==4||atoi(strMonth)==6||atoi(strMonth)==9||atoi(strMonth)==11)
  615. strDay=atoi(strDay)>30?"30":strDay;
  616. if(atoi(strMonth)==2)
  617. {
  618. if(Leap)
  619. strDay=atoi(strDay)>29?"29":strDay;
  620. else
  621. strDay=atoi(strDay)>28?"28":strDay;
  622. }
  623. i=tm.SetDateTime(atoi(strYear),atoi(strMonth),atoi(strDay),atoi(strHour),atoi(strMin),atoi(strSec));
  624. if(i==0)
  625. {
  626. SetTimeValue(tm);
  627. return;
  628. }
  629. else
  630. {
  631. SetDefault();
  632. }
  633. }
  634. CString CMyDateEdit::GetDetectText()
  635. {
  636. GetWindowText(m_str);
  637. SetDetectText(m_str);
  638. GetWindowText(m_str);
  639. return m_str;
  640. }
  641. void CMyDateEdit::OnKillFocus(CWnd* pNewWnd)
  642. {
  643. GetWindowText(m_str);
  644. SetDetectText(m_str);
  645. CEdit::OnKillFocus(pNewWnd);
  646. }