www.pudn.com > gridctrl_demo225.rar > GridCellDateTime.cpp


/////////////////////////////////////////////////////////////////////////// 
// 
// GridCellDateTime.cpp: implementation of the CGridCellDateTime class. 
// 
// Provides the implementation for a datetime picker cell type of the 
// grid control. 
// 
// Written by Podsypalnikov Eugen 15 Mar 2001 
// Modified: 
//    31 May 2001  Fixed m_cTime bug (Chris Maunder) 
// 
// For use with CGridCtrl v2.22+ 
// 
/////////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "../GridCtrl_src/GridCtrl.h" 
#include "../GridCtrl_src/GridCell.h" 
#include "GridCellDateTime.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// CGridCellDateTime 
 
IMPLEMENT_DYNCREATE(CGridCellDateTime, CGridCell) 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CGridCellDateTime::CGridCellDateTime() : CGridCell() 
{ 
	m_dwStyle = 0; 
	m_cTime   = CTime::GetCurrentTime(); 
} 
 
CGridCellDateTime::CGridCellDateTime(DWORD dwStyle) : CGridCell() 
{ 
	Init(dwStyle); 
} 
 
CGridCellDateTime::~CGridCellDateTime() 
{ 
} 
 
CSize CGridCellDateTime::GetCellExtent(CDC* pDC) 
{     
    CSize sizeScroll (GetSystemMetrics(SM_CXVSCROLL), GetSystemMetrics(SM_CYHSCROLL));	 
    CSize sizeCell (CGridCell::GetCellExtent(pDC));	 
    sizeCell.cx += sizeScroll.cx;	 
    sizeCell.cy = max(sizeCell.cy,sizeScroll.cy);	 
    return sizeCell; 
} 
 
BOOL CGridCellDateTime::Edit(int nRow, int nCol, CRect rect, CPoint /* point */,  
							 UINT nID, UINT nChar) 
{ 
	m_bEditing = TRUE; 
 
	// CInPlaceDateTime auto-deletes itself 
	m_pEditWnd = new CInPlaceDateTime(GetGrid(), rect, 
		m_dwStyle|DTS_UPDOWN, nID, nRow, nCol,  
		GetTextClr(), GetBackClr(), GetTime(), nChar); 
	return TRUE; 
} 
 
CWnd* CGridCellDateTime::GetEditWnd() const 
{ 
	return m_pEditWnd; 
} 
 
void CGridCellDateTime::EndEdit() 
{ 
	if (m_pEditWnd) ((CInPlaceDateTime*)m_pEditWnd)->EndEdit(); 
} 
 
void CGridCellDateTime::Init(DWORD dwStyle) 
{ 
	m_dwStyle = dwStyle; 
 
	SetTime(CTime::GetCurrentTime()); 
 
	SetFormat(DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX 
#ifndef _WIN32_WCE 
		|DT_END_ELLIPSIS 
#endif 
		); 
} 
 
// Should be changed to use locale settings 
void CGridCellDateTime::SetTime(CTime time) 
{ 
	m_cTime = time; 
 
	if (DTS_TIMEFORMAT == m_dwStyle)  
	{ 
#ifdef _WIN32_WCE 
		CString strTemp; 
		strTemp.Format(_T("%02d:%02d:%02d"),  
			           m_cTime.GetHour(), m_cTime.GetMinute(), m_cTime.GetSecond()); 
		SetText(strTemp); 
#else 
 
//		SetText(m_cTime.Format(_T("%H:%M:%S"))); 
    	SetText(m_cTime.Format(_T("%X"))); 
#endif 
	} 
	else if (DTS_SHORTDATEFORMAT == m_dwStyle)  
	{ 
#ifdef _WIN32_WCE 
		CString strTemp; 
		strTemp.Format(_T("%02d/%02d/%02d"),  
			           m_cTime.GetMonth(), m_cTime.GetDay(), m_cTime.GetYear()); 
		SetText(strTemp); 
#else 
//		SetText(m_cTime.Format(("%d/%m/%Y"))); 
		SetText(m_cTime.Format(("%x"))); 
#endif 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CInPlaceDateTime 
 
CInPlaceDateTime::CInPlaceDateTime(CWnd* pParent, CRect& rect, DWORD dwStyle, UINT nID, 
								   int nRow, int nColumn,  
								   COLORREF crFore, COLORREF crBack, 
								   CTime* pcTime, 
								   UINT nFirstChar) 
{ 
	m_crForeClr     = crFore; 
	m_crBackClr     = crBack; 
	m_nRow          = nRow; 
	m_nCol          = nColumn; 
	m_nLastChar     = 0;  
	m_bExitOnArrows = FALSE; 
	m_pcTime        = pcTime; 
 
	DWORD dwStl = WS_BORDER|WS_VISIBLE|WS_CHILD|dwStyle; 
 
	if (!Create(dwStl, rect, pParent, nID)) { 
		return; 
	} 
 
	SetTime(m_pcTime); 
 
	SetFont(pParent->GetFont()); 
	SetFocus(); 
 
	switch (nFirstChar)  
	{ 
		case VK_LBUTTON:  
		case VK_RETURN: return; 
		case VK_BACK:   break; 
		case VK_DOWN:  
		case VK_UP:    
		case VK_RIGHT: 
		case VK_LEFT:   
		case VK_NEXT:   
		case VK_PRIOR:  
		case VK_HOME:   
		case VK_END:    return; 
		default:        break; 
	} 
	SendMessage(WM_CHAR, nFirstChar); 
} 
 
CInPlaceDateTime::~CInPlaceDateTime() 
{ 
} 
 
void CInPlaceDateTime::EndEdit() 
{ 
	CString str; 
	if (::IsWindow(m_hWnd))  
	{ 
		GetWindowText(str); 
		GetTime(*m_pcTime); 
	} 
 
	// Send Notification to parent 
	GV_DISPINFO dispinfo; 
 
	dispinfo.hdr.hwndFrom = GetSafeHwnd(); 
	dispinfo.hdr.idFrom   = GetDlgCtrlID(); 
	dispinfo.hdr.code     = GVN_ENDLABELEDIT; 
 
	dispinfo.item.mask    = LVIF_TEXT|LVIF_PARAM; 
	dispinfo.item.row     = m_nRow; 
	dispinfo.item.col     = m_nCol; 
	dispinfo.item.strText = str; 
	dispinfo.item.lParam  = (LPARAM) m_nLastChar;  
 
	CWnd* pOwner = GetOwner(); 
	if (IsWindow(pOwner->GetSafeHwnd())) { 
		pOwner->SendMessage(WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&dispinfo); 
	} 
 
	// Close this window (PostNcDestroy will delete this) 
	if (::IsWindow(m_hWnd)) { 
		PostMessage(WM_CLOSE, 0, 0); 
	} 
} 
 
void CInPlaceDateTime::PostNcDestroy()  
{ 
	CDateTimeCtrl::PostNcDestroy(); 
	delete this; 
} 
 
BEGIN_MESSAGE_MAP(CInPlaceDateTime, CDateTimeCtrl) 
	//{{AFX_MSG_MAP(CInPlaceDateTime) 
	ON_WM_KILLFOCUS() 
	ON_WM_KEYDOWN() 
	ON_WM_KEYUP() 
	ON_WM_GETDLGCODE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CInPlaceDateTime message handlers 
 
void CInPlaceDateTime::OnKillFocus(CWnd* pNewWnd)  
{ 
	CDateTimeCtrl::OnKillFocus(pNewWnd); 
 
	if (GetSafeHwnd() == pNewWnd->GetSafeHwnd()) { 
		return; 
	} 
	EndEdit(); 
} 
 
UINT CInPlaceDateTime::OnGetDlgCode()  
{ 
	return DLGC_WANTALLKEYS; 
} 
 
void CInPlaceDateTime::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	if (( nChar == VK_PRIOR || nChar == VK_NEXT || 
		nChar == VK_DOWN  || nChar == VK_UP   || 
		nChar == VK_RIGHT || nChar == VK_LEFT) && 
		(m_bExitOnArrows  || GetKeyState(VK_CONTROL) < 0)) 
	{ 
		m_nLastChar = nChar; 
		GetParent()->SetFocus(); 
		return; 
	} 
 
	CDateTimeCtrl::OnKeyDown(nChar, nRepCnt, nFlags); 
} 
 
void CInPlaceDateTime::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	if (nChar == VK_TAB || nChar == VK_RETURN || nChar == VK_ESCAPE) 
	{ 
		m_nLastChar = nChar; 
		GetParent()->SetFocus();    // This will destroy this window 
		return; 
	} 
 
	CDateTimeCtrl::OnKeyUp(nChar, nRepCnt, nFlags); 
}