| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 | #include "stdafx.h"#include "UIDateTime.h"namespace DuiLib{	#define DT_NONE   0#define DT_UPDATE 1#define DT_DELETE 2#define DT_KEEP   3	class CDateTimeWnd : public CWindowWnd	{	public:		CDateTimeWnd();		void Init(CDateTimeUI* pOwner);		RECT CalPos();		LPCTSTR GetWindowClassName() const;		LPCTSTR GetSuperClassName() const;		void OnFinalMessage(HWND hWnd);		LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);		LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);				void SetFormat (LPCSTR fmt);	protected:		CDateTimeUI* m_pOwner;		HBRUSH m_hBkBrush;		bool m_bInit;		char dt_format_[MAX_PATH];	};	CDateTimeWnd::CDateTimeWnd() : m_pOwner(NULL), m_hBkBrush(NULL), m_bInit(false)	{		strcpy_s (dt_format_, "yyyy-MM-dd HH:mm:ss");	}	void CDateTimeWnd::SetFormat (LPCSTR fmt)	{		strcpy_s (dt_format_, fmt);		::SendMessage (m_hWnd, DTM_SETFORMATA, 0, (LPARAM)dt_format_);	}	void CDateTimeWnd::Init(CDateTimeUI* pOwner)	{		m_pOwner = pOwner;		m_pOwner->m_nDTUpdateFlag = DT_NONE;		if (m_hWnd == NULL)		{			RECT rcPos = CalPos();			UINT uStyle = WS_CHILD;			Create(m_pOwner->GetManager()->GetPaintWindow(), NULL, uStyle, 0, rcPos);			SetWindowFont(m_hWnd, m_pOwner->GetManager()->GetFontInfo(m_pOwner->GetFont())->hFont, TRUE);		}		if (m_pOwner->GetText().IsEmpty())			::GetLocalTime(&m_pOwner->m_sysTime);		::SendMessage(m_hWnd, DTM_SETSYSTEMTIME, 0, (LPARAM)&m_pOwner->m_sysTime);		::SendMessage (m_hWnd, DTM_SETFORMATA, 0, (LPARAM)dt_format_);		::ShowWindow(m_hWnd, SW_SHOWNOACTIVATE);		::SetFocus(m_hWnd);		m_bInit = true;    	}	RECT CDateTimeWnd::CalPos()	{		CDuiRect rcPos = m_pOwner->GetPos();		CControlUI* pParent = m_pOwner;		RECT rcParent;		while( pParent = pParent->GetParent() ) {			if( !pParent->IsVisible() ) {				rcPos.left = rcPos.top = rcPos.right = rcPos.bottom = 0;				break;			}			rcParent = pParent->GetClientPos();			if( !::IntersectRect(&rcPos, &rcPos, &rcParent) ) {				rcPos.left = rcPos.top = rcPos.right = rcPos.bottom = 0;				break;			}		}		return rcPos;	}	LPCTSTR CDateTimeWnd::GetWindowClassName() const	{		return _T("DateTimeWnd");	}	LPCTSTR CDateTimeWnd::GetSuperClassName() const	{		return DATETIMEPICK_CLASS;	}	void CDateTimeWnd::OnFinalMessage(HWND hWnd)	{				if( m_hBkBrush != NULL ) ::DeleteObject(m_hBkBrush);		m_pOwner->GetManager()->RemoveNativeWindow(hWnd);		m_pOwner->m_pWindow = NULL;		delete this;	}	LRESULT CDateTimeWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)	{		LRESULT lRes = 0;		BOOL bHandled = TRUE;		if( uMsg == WM_CREATE ) {			m_pOwner->GetManager()->AddNativeWindow(m_pOwner, m_hWnd);			bHandled = FALSE;		}		else if( uMsg == WM_KILLFOCUS )		{			lRes = OnKillFocus(uMsg, wParam, lParam, bHandled);		}		else if (uMsg == WM_KEYUP && (wParam == VK_DELETE || wParam == VK_BACK))		{			LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);			m_pOwner->m_nDTUpdateFlag = DT_DELETE;			m_pOwner->UpdateText();			PostMessage(WM_CLOSE);			return lRes;		}		else if (uMsg == WM_KEYUP && wParam == VK_ESCAPE)		{			LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);			m_pOwner->m_nDTUpdateFlag = DT_KEEP;			PostMessage(WM_CLOSE);			return lRes;		}																																														else if( uMsg == WM_PAINT) {			if (m_pOwner->GetManager()->IsLayered()) {				m_pOwner->GetManager()->AddNativeWindow(m_pOwner, m_hWnd);			}			bHandled = FALSE;		}		else bHandled = FALSE;		if( !bHandled ) return CWindowWnd::HandleMessage(uMsg, wParam, lParam);		return lRes;	}	LRESULT CDateTimeWnd::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)	{		LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);		if (m_pOwner->m_nDTUpdateFlag == DT_NONE)		{			::SendMessage(m_hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&m_pOwner->m_sysTime);			m_pOwner->m_nDTUpdateFlag = DT_UPDATE;			m_pOwner->UpdateText();		}		if ((HWND)wParam != m_pOwner->GetManager()->GetPaintWindow()) {			::SendMessage(m_pOwner->GetManager()->GetPaintWindow(), WM_KILLFOCUS, wParam, lParam);		}		SendMessage(WM_CLOSE);		return lRes;	}																CDateTimeUI::CDateTimeUI()	{		::GetLocalTime(&m_sysTime);		m_bReadOnly = false;		m_pWindow = NULL;		m_nDTUpdateFlag=DT_UPDATE;		m_format = L"yyyy-MM-dd HH:mm:ss";		UpdateText();				m_nDTUpdateFlag = DT_NONE;	}	LPCTSTR CDateTimeUI::GetClass() const	{		return _T("DateTimeUI");	}	LPVOID CDateTimeUI::GetInterface(LPCTSTR pstrName)	{		if( _tcscmp(pstrName, DUI_CTR_DATETIME) == 0 ) return static_cast<CDateTimeUI*>(this);		return CLabelUI::GetInterface(pstrName);	}	UINT CDateTimeUI::GetControlFlags() const	{		return UIFLAG_TABSTOP;	}	HWND CDateTimeUI::GetNativeWindow() const	{		if (m_pWindow) return m_pWindow->GetHWND();		return NULL;	}	SYSTEMTIME& CDateTimeUI::GetTime()	{		return m_sysTime;	}	void CDateTimeUI::SetTime(SYSTEMTIME* pst)	{		m_sysTime = *pst;		Invalidate();	}	void CDateTimeUI::SetReadOnly(bool bReadOnly)	{		m_bReadOnly = bReadOnly;		Invalidate();	}	bool CDateTimeUI::IsReadOnly() const	{		return m_bReadOnly;	}	void CDateTimeUI::UpdateText()	{		if (m_nDTUpdateFlag == DT_DELETE)			SetText(_T(""));		else if (m_nDTUpdateFlag == DT_UPDATE)		{			CDuiString sText;			sText.SmallFormat(_T("%4d年%02d月%02d日"),m_sysTime.wYear, m_sysTime.wMonth, m_sysTime.wDay);			SetText(sText);		}	}	void CDateTimeUI::DoEvent(TEventUI& event)	{		if( !IsMouseEnabled() && event.Type > UIEVENT__MOUSEBEGIN && event.Type < UIEVENT__MOUSEEND ) {			if( m_pParent != NULL ) m_pParent->DoEvent(event);			else CLabelUI::DoEvent(event);			return;		}		if( event.Type == UIEVENT_SETCURSOR && IsEnabled() )		{			::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_IBEAM)));			return;		}		if( event.Type == UIEVENT_WINDOWSIZE )		{			if( m_pWindow != NULL ) m_pManager->SetFocusNeeded(this);		}		if( event.Type == UIEVENT_SCROLLWHEEL )		{			if( m_pWindow != NULL ) return;		}		if( event.Type == UIEVENT_SETFOCUS && IsEnabled() ) 		{			if( m_pWindow ) return;			m_pWindow = new CDateTimeWnd();			m_pWindow->SetFormat (CW2A(m_format.GetData()));			ASSERT(m_pWindow);			m_pWindow->Init(this);			m_pWindow->ShowWindow();		}		if( event.Type == UIEVENT_KILLFOCUS && IsEnabled() ) 		{			Invalidate();		}		if( event.Type == UIEVENT_BUTTONDOWN || event.Type == UIEVENT_DBLCLICK || event.Type == UIEVENT_RBUTTONDOWN) 		{			if( IsEnabled() ) {				GetManager()->ReleaseCapture();				if( IsFocused() && m_pWindow == NULL )				{					m_pWindow = new CDateTimeWnd();					ASSERT(m_pWindow);				}				if( m_pWindow != NULL )				{					m_pWindow->Init(this);					m_pWindow->ShowWindow();				}			}			return;		}		if( event.Type == UIEVENT_MOUSEMOVE ) 		{			return;		}		if( event.Type == UIEVENT_BUTTONUP ) 		{			return;		}		if( event.Type == UIEVENT_CONTEXTMENU )		{			return;		}		if( event.Type == UIEVENT_MOUSEENTER )		{			return;		}		if( event.Type == UIEVENT_MOUSELEAVE )		{			return;		}		CLabelUI::DoEvent(event);	}	void CDateTimeUI::SetFormat (LPCTSTR fmt)	{		m_format = fmt;		if(m_pWindow) return;		m_pWindow = new CDateTimeWnd ();		m_pWindow->SetFormat (CW2A (m_format.GetData ()));		ASSERT (m_pWindow);		m_pWindow->Init (this);		m_pWindow->ShowWindow ();	}}
 |