123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- #include "stdafx.h"
- #include "UIDateTime.h"
- namespace DuiLib
- {
- //CDateTimeUI::m_nDTUpdateFlag
- #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);
- //LRESULT OnEditChanged(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)
- {
- // Clear reference and die
- 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 == OCM_COMMAND ) {
- // if( GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE ) lRes = OnEditChanged(uMsg, wParam, lParam, bHandled);
- // else if( GET_WM_COMMAND_CMD(wParam, lParam) == EN_UPDATE ) {
- // RECT rcClient;
- // ::GetClientRect(m_hWnd, &rcClient);
- // ::InvalidateRect(m_hWnd, &rcClient, FALSE);
- // }
- // }
- // else if( uMsg == WM_KEYDOWN && TCHAR(wParam) == VK_RETURN ) {
- // m_pOwner->GetManager()->SendNotify(m_pOwner, DUI_MSGTYPE_RETURN);
- // }
- // else if( uMsg == OCM__BASE + WM_CTLCOLOREDIT || uMsg == OCM__BASE + WM_CTLCOLORSTATIC ) {
- // if( m_pOwner->GetNativeEditBkColor() == 0xFFFFFFFF ) return NULL;
- // ::SetBkMode((HDC)wParam, TRANSPARENT);
- // DWORD dwTextColor = m_pOwner->GetTextColor();
- // ::SetTextColor((HDC)wParam, RGB(GetBValue(dwTextColor),GetGValue(dwTextColor),GetRValue(dwTextColor)));
- // if( m_hBkBrush == NULL ) {
- // DWORD clrColor = m_pOwner->GetNativeEditBkColor();
- // m_hBkBrush = ::CreateSolidBrush(RGB(GetBValue(clrColor), GetGValue(clrColor), GetRValue(clrColor)));
- // }
- // return (LRESULT)m_hBkBrush;
- // }
- 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;
- }
- // LRESULT CDateTimeWnd::OnEditChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
- // {
- // if( !m_bInit ) return 0;
- // if( m_pOwner == NULL ) return 0;
- // // Copy text back
- // int cchLen = ::GetWindowTextLength(m_hWnd) + 1;
- // LPTSTR pstr = static_cast<LPTSTR>(_alloca(cchLen * sizeof(TCHAR)));
- // ASSERT(pstr);
- // if( pstr == NULL ) return 0;
- // ::GetWindowText(m_hWnd, pstr, cchLen);
- // m_pOwner->m_sText = pstr;
- // m_pOwner->GetManager()->SendNotify(m_pOwner, DUI_MSGTYPE_TEXTCHANGED);
- // return 0;
- // }
- //////////////////////////////////////////////////////////////////////////
- //
- 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(); // add by:daviyang35 初始化界面时显示时间
- 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 ();
- }
- }
|