#include "stdafx.h" #include "DateEdit.h" #include "LYFZIPManage.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // COleDateTime read /write /* COleDateTime ReadCOleDateTime(LPCSTR lpszData) { COleDateTime DateTime; DateTime.ParseDateTime(lpszData); return DateTime; } void FormatCOleDateTime(CString& strData, COleDateTime DateTime, int len) { strData = ""; if (DateTime.m_dt == 0) return; if (len == 8) strData = DateTime.Format("%d/%m/%y"); else if(len == 5) // added these two strData = DateTime.Format("%H:%M"); else strData = DateTime.Format("%d/%m/%Y"); } ///////////////////////////////////////////////////////////////////////////// // DDX for mask control void AFXAPI DDX_OleDate(CDataExchange* pDX, int nIDC, CDateEdit& rControl, COleDateTime& Date) { DDX_Control(pDX, nIDC, (CWnd&)rControl); if (!pDX->m_bSaveAndValidate) rControl.SetDate(Date); else Date = rControl.GetDate(); } */ ///////////////////////////////////////////////////////////////////////////// // CDateEdit IMPLEMENT_DYNAMIC(CDateEdit,CEdit) BEGIN_MESSAGE_MAP(CDateEdit, CEdit) //{{AFX_MSG_MAP(CDateEdit) ON_WM_CHAR() ON_WM_KEYDOWN() ON_CONTROL_REFLECT(EN_SETFOCUS, OnEnSetfocus) //}}AFX_MSG_MAP // ON_MESSAGE(WM_CUT, OnCut) // ON_MESSAGE(WM_PASTE, OnPaste) // ON_MESSAGE(WM_CLEAR, OnClear) END_MESSAGE_MAP() CDateEdit::CDateEdit() { Reset(); SetClassType("DateEdit"); } CDateEdit::~CDateEdit() { } ///////////////////////////////////////////////////////////////////////////// // CDateEdit message handlers void CDateEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { CString str; try { GetWindowText(str); } catch(...) { } for (int i = 0; i=1) && (startPos<=m_str.GetLength())) { char c; if(m_strMaskLiteral != _T("")) c=m_strMaskLiteral[startPos-1]; TRACE("m_strMaskLiteral=[%s](%s)\n",m_strMaskLiteral,m_str); //回退光标 SendMessage(WM_KEYDOWN,VK_LEFT,0); if(m_strMaskLiteral != _T("")) { //恢复在该位置预设的字符 SendChar(c); //再次退回 SendMessage(WM_KEYDOWN,VK_LEFT,0); } } else //越界或者存在选择区域 MessageBeep((UINT)-1); return; }*/ } CEdit::OnChar(nChar, nRepCnt, nFlags); if(!m_bMaskKeyInProgress && m_bUseMask && m_strLiteral != _T("")) { int startPos,endPos; GetSel(startPos,endPos); //确保字符串的长度小于m_strLiteral的长度 if(endPos=m_strMask.GetLength()) { MessageBeep((UINT)-1); return FALSE; } //检查在当前位置是否应存在文字 c='_'; if(m_strLiteral != _T("") && m_strLiteral.GetLength()>endPos) c=m_strLiteral.GetAt(endPos); if(c!='_') {//发送默认值 SendChar(c); GetSel(startPos,endPos); } //检查字符的有效性 if(m_strValid.Find(nChar)!=-1) return TRUE; //检查当前位置的掩码 c=m_strMask.GetAt(endPos); BOOL doit=TRUE; sText = m_str; sText.SetAt(endPos, nChar); if (nChar == VK_SPACE) return true; //空格 switch(c) { case '0': //只能是数字 { BOOL doit=TRUE; if(isdigit(nChar)) { if(m_isDate || m_isDateTime) //是否按照日期格式输入 { // sText.SetAt(endPos, nChar); if (!IsValid(COleDateTime(COleVariant(sText)))) { if(endPos < 8) {//月、日设置为默认 sText.SetAt(4, '-'); sText.SetAt(5, '0'); sText.SetAt(6, '1'); sText.SetAt(7, '-'); sText.SetAt(8, '0'); sText.SetAt(9, '1'); SetWindowText(sText); SetSel(endPos+1,endPos+1); } if(endPos >= 8) {//日设置为少30 if (sText.GetAt(8) > '3') sText.SetAt(8, '0'); sText.SetAt(9, '1'); SetWindowText(sText); SetSel(endPos+1,endPos+1); } doit=FALSE; } /* if(endPos==8) { if(nChar>'3') //每月只能有三十几天 doit=FALSE; } if(endPos==9) { if(m_str.GetAt(5)=='0' && m_str.GetAt(6)=='2' && m_str.GetAt(8)=='2') { if(nChar>'8')//2月不超过29天 doit=FALSE; } else if(m_str.GetAt(5)=='0' && m_str.GetAt(6)=='2' && m_str.GetAt(8)>'2') {//2月不起30 doit=FALSE; } else if(m_str.GetAt(8)=='3') { if(nChar>'1')//每月不超过31天 doit=FALSE; } } if(endPos==5) { if(nChar>'1') //一年只能有12个月 doit=FALSE; } if(endPos==6) { if(m_str.GetAt(5)=='1') { if(nChar>'2') //一年只能有12个月 doit=FALSE; } } */ }//结束日期检查 if (m_isDateTime) nTime = 11; if (m_isTime || m_isDateTime) //按时间格式检查 { //转换时间为HH0MM // for(int i = nTime; i < nTime+5; i++) // { // if (sText.GetAt(i) == TCHAR(' ') || // sText.GetAt(i) == TCHAR(':')) // sText.SetAt(i, TCHAR('0')); // } if (!IsValid(COleDateTime(COleVariant(sText)))) // if (atoi((LPCSTR)sText.Mid(nTime)) > 24000) { if(endPos == nTime && nChar < '3') { sText.SetAt(nTime+1, '0'); sText.SetAt(nTime+2, ':'); sText.SetAt(nTime+3, '0'); sText.SetAt(nTime+4, '0'); SetWindowText(sText); SetSel(endPos+1,endPos+1); } if(endPos == nTime + 1 && nChar < '4') { sText.SetAt(nTime+2, ':'); sText.SetAt(nTime+3, '0'); sText.SetAt(nTime+4, '0'); SetWindowText(sText); SetSel(endPos+1,endPos+1); } doit=FALSE; } }//结束 时间检查 return doit; } break; } } MessageBeep((UINT)-1); return FALSE; } void CDateEdit::SetMask(LPCSTR lpMask, LPCSTR lpLiteral, LPCSTR lpValid) { m_bUseMask=FALSE; TCHAR szMask[] = {'0', '9', '#', 'A', 'a', '?'}; if(lpMask==NULL) return; m_strMask=lpMask; if(m_strMask == _T("")) return; if(lpLiteral!=NULL) { m_strLiteral=lpLiteral; if(m_strLiteral.GetLength()!=m_strMask.GetLength()) m_strLiteral.Empty(); } else {//自动生成 //m_strLiteral.Empty(); m_strLiteral = m_strMask; for(int i = 0; i < 6; i++) { int j = 0; j = m_strLiteral.Find(szMask[i], j); while(j>=0) { m_strLiteral.SetAt(j, TCHAR('_')); j = m_strLiteral.Find(szMask[i], j); }//end while }//end for } if(lpValid!=NULL) m_strValid=lpValid; else m_strValid.Empty(); m_bUseMask=TRUE; //分配存储空间 m_str = CString(TCHAR(' '), m_strMask.GetLength()); } BOOL CDateEdit::IsValid(const COleDateTime& date)const { return (date.GetStatus() == COleDateTime::valid); } LONG CDateEdit::OnCut(UINT, LONG) {//禁止CUT /* int nStart, nEnd; GetSel(nStart, nEnd); if (nStart < nEnd) { SendMessage(WM_COPY); // copy the selection and... SendMessage(WM_KEYDOWN, VK_DELETE); // delete it } */ return 0; } // Clears the current selection. LONG CDateEdit::OnClear(UINT wParam, LONG lParam) {//禁止CLEAR /* int nStart, nEnd; GetSel(nStart, nEnd); if (nStart < nEnd) SendMessage(WM_KEYDOWN, VK_DELETE); // delete the selection */ return 0; } // Pastes the text from the clipboard onto the current selection. LONG CDateEdit::OnPaste(UINT, LONG) {//禁止PASTE /* int nStart, nEnd; GetSel(nStart, nEnd); CEdit::Default(); CString strText = GetValidText(); if (strText != GetText()) { SetWindowText(strText); SetSel(nStart, nEnd); } */ return 0; } // Insures that text set via SetWindowText is valid. void CDateEdit::SetClassType(LPCSTR pName, LPCSTR pMask) { try { CString sName = pName; sName.MakeUpper(); Reset(); if(sName == _T("DATEEDIT")) //日期 { m_bUseMask = TRUE; m_isDate = TRUE; //added this m_strMask = _T("0000-00-00"); //掩码 m_strLiteral = _T("____-__-__"); //掩码有效设置 有效_ 其它- m_str = _T(" "); //数据保存空间 //SetWindowText(_T(" - - ")); } else if(sName == _T("TIMEEDIT")) //时间 { m_bUseMask = TRUE; m_isTime = true; m_strMask = _T("00:00"); m_strLiteral = _T("__:__"); m_str = _T(" "); SetWindowText(_T(" : ")); } else if(sName == _T("DATETIMEEDIT")) //日期+时间 { m_bUseMask = TRUE; m_isDateTime = true; m_strMask = _T("0000-00-00 00:00"); m_strLiteral = _T("____-__-__ __:__"); m_str = _T(" "); SetWindowText(_T(" - - : ")); } } catch(...) { } } void CDateEdit::Reset() { m_bUseMask=FALSE; m_strMask=_T(""); m_strLiteral=_T(""); m_strValid=_T(""); // m_strHours=_T("24"); // m_strMins=_T("60"); m_bMaskKeyInProgress=FALSE; m_strMaskLiteral=_T(""); m_str = _T(""); m_isDate = FALSE;//是否是日期格式 m_isTime = FALSE;//是否是时间格式 m_isDateTime = FALSE;//是否是日期时间格式 m_isNumber = FALSE; } void CDateEdit::SendChar(UINT nChar) { m_bMaskKeyInProgress=TRUE; #ifdef WIN32 AfxCallWndProc(this,m_hWnd,WM_CHAR,nChar,1); #else SendMessage(WM_CHAR,nChar,1); #endif m_bMaskKeyInProgress=FALSE; } void CDateEdit::SetDefault() { try { if (m_isDate) SetWindowText(_T(" - - ")); else if (m_isTime) SetWindowText(_T(" : ")); else if (m_isDateTime) SetWindowText(_T(" - - : ")); } catch(...) { } } void CDateEdit::SetNow() { try { COleDateTime tNow = COleDateTime::GetCurrentTime(); if (m_isDate) SetWindowText(tNow.Format("%Y-%m-%d")); else if (m_isTime) SetWindowText(tNow.Format("%H:%M")); else if (m_isDateTime) SetWindowText(tNow.Format("%Y-%m-%d %H:%M")); } catch(...) { } } void CDateEdit::OnEnSetfocus() { try { CString str; GetWindowText(str); str.TrimLeft (); str.TrimRight (); if(str.IsEmpty ()) SetWindowText(CTime::GetCurrentTime ().Format ("%Y-%m-%d")); } catch(...) { } }