UIDateTime.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. #include "stdafx.h"
  2. #include "UIDateTime.h"
  3. namespace DuiLib
  4. {
  5. //CDateTimeUI::m_nDTUpdateFlag
  6. #define DT_NONE 0
  7. #define DT_UPDATE 1
  8. #define DT_DELETE 2
  9. #define DT_KEEP 3
  10. class CDateTimeWnd : public CWindowWnd
  11. {
  12. public:
  13. CDateTimeWnd();
  14. void Init(CDateTimeUI* pOwner);
  15. RECT CalPos();
  16. LPCTSTR GetWindowClassName() const;
  17. LPCTSTR GetSuperClassName() const;
  18. void OnFinalMessage(HWND hWnd);
  19. LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
  20. LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  21. //LRESULT OnEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  22. void SetFormat (LPCSTR fmt);
  23. protected:
  24. CDateTimeUI* m_pOwner;
  25. HBRUSH m_hBkBrush;
  26. bool m_bInit;
  27. char dt_format_[MAX_PATH];
  28. };
  29. CDateTimeWnd::CDateTimeWnd() : m_pOwner(NULL), m_hBkBrush(NULL), m_bInit(false)
  30. {
  31. strcpy_s (dt_format_, "yyyy-MM-dd HH:mm:ss");
  32. }
  33. void CDateTimeWnd::SetFormat (LPCSTR fmt)
  34. {
  35. strcpy_s (dt_format_, fmt);
  36. ::SendMessage (m_hWnd, DTM_SETFORMATA, 0, (LPARAM)dt_format_);
  37. }
  38. void CDateTimeWnd::Init(CDateTimeUI* pOwner)
  39. {
  40. m_pOwner = pOwner;
  41. m_pOwner->m_nDTUpdateFlag = DT_NONE;
  42. if (m_hWnd == NULL)
  43. {
  44. RECT rcPos = CalPos();
  45. UINT uStyle = WS_CHILD;
  46. Create(m_pOwner->GetManager()->GetPaintWindow(), NULL, uStyle, 0, rcPos);
  47. SetWindowFont(m_hWnd, m_pOwner->GetManager()->GetFontInfo(m_pOwner->GetFont())->hFont, TRUE);
  48. }
  49. if (m_pOwner->GetText().IsEmpty())
  50. ::GetLocalTime(&m_pOwner->m_sysTime);
  51. ::SendMessage(m_hWnd, DTM_SETSYSTEMTIME, 0, (LPARAM)&m_pOwner->m_sysTime);
  52. ::SendMessage (m_hWnd, DTM_SETFORMATA, 0, (LPARAM)dt_format_);
  53. ::ShowWindow(m_hWnd, SW_SHOWNOACTIVATE);
  54. ::SetFocus(m_hWnd);
  55. m_bInit = true;
  56. }
  57. RECT CDateTimeWnd::CalPos()
  58. {
  59. CDuiRect rcPos = m_pOwner->GetPos();
  60. CControlUI* pParent = m_pOwner;
  61. RECT rcParent;
  62. while( pParent = pParent->GetParent() ) {
  63. if( !pParent->IsVisible() ) {
  64. rcPos.left = rcPos.top = rcPos.right = rcPos.bottom = 0;
  65. break;
  66. }
  67. rcParent = pParent->GetClientPos();
  68. if( !::IntersectRect(&rcPos, &rcPos, &rcParent) ) {
  69. rcPos.left = rcPos.top = rcPos.right = rcPos.bottom = 0;
  70. break;
  71. }
  72. }
  73. return rcPos;
  74. }
  75. LPCTSTR CDateTimeWnd::GetWindowClassName() const
  76. {
  77. return _T("DateTimeWnd");
  78. }
  79. LPCTSTR CDateTimeWnd::GetSuperClassName() const
  80. {
  81. return DATETIMEPICK_CLASS;
  82. }
  83. void CDateTimeWnd::OnFinalMessage(HWND hWnd)
  84. {
  85. // Clear reference and die
  86. if( m_hBkBrush != NULL ) ::DeleteObject(m_hBkBrush);
  87. m_pOwner->GetManager()->RemoveNativeWindow(hWnd);
  88. m_pOwner->m_pWindow = NULL;
  89. delete this;
  90. }
  91. LRESULT CDateTimeWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  92. {
  93. LRESULT lRes = 0;
  94. BOOL bHandled = TRUE;
  95. if( uMsg == WM_CREATE ) {
  96. m_pOwner->GetManager()->AddNativeWindow(m_pOwner, m_hWnd);
  97. bHandled = FALSE;
  98. }
  99. else if( uMsg == WM_KILLFOCUS )
  100. {
  101. lRes = OnKillFocus(uMsg, wParam, lParam, bHandled);
  102. }
  103. else if (uMsg == WM_KEYUP && (wParam == VK_DELETE || wParam == VK_BACK))
  104. {
  105. LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
  106. m_pOwner->m_nDTUpdateFlag = DT_DELETE;
  107. m_pOwner->UpdateText();
  108. PostMessage(WM_CLOSE);
  109. return lRes;
  110. }
  111. else if (uMsg == WM_KEYUP && wParam == VK_ESCAPE)
  112. {
  113. LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
  114. m_pOwner->m_nDTUpdateFlag = DT_KEEP;
  115. PostMessage(WM_CLOSE);
  116. return lRes;
  117. }
  118. // else if( uMsg == OCM_COMMAND ) {
  119. // if( GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE ) lRes = OnEditChanged(uMsg, wParam, lParam, bHandled);
  120. // else if( GET_WM_COMMAND_CMD(wParam, lParam) == EN_UPDATE ) {
  121. // RECT rcClient;
  122. // ::GetClientRect(m_hWnd, &rcClient);
  123. // ::InvalidateRect(m_hWnd, &rcClient, FALSE);
  124. // }
  125. // }
  126. // else if( uMsg == WM_KEYDOWN && TCHAR(wParam) == VK_RETURN ) {
  127. // m_pOwner->GetManager()->SendNotify(m_pOwner, DUI_MSGTYPE_RETURN);
  128. // }
  129. // else if( uMsg == OCM__BASE + WM_CTLCOLOREDIT || uMsg == OCM__BASE + WM_CTLCOLORSTATIC ) {
  130. // if( m_pOwner->GetNativeEditBkColor() == 0xFFFFFFFF ) return NULL;
  131. // ::SetBkMode((HDC)wParam, TRANSPARENT);
  132. // DWORD dwTextColor = m_pOwner->GetTextColor();
  133. // ::SetTextColor((HDC)wParam, RGB(GetBValue(dwTextColor),GetGValue(dwTextColor),GetRValue(dwTextColor)));
  134. // if( m_hBkBrush == NULL ) {
  135. // DWORD clrColor = m_pOwner->GetNativeEditBkColor();
  136. // m_hBkBrush = ::CreateSolidBrush(RGB(GetBValue(clrColor), GetGValue(clrColor), GetRValue(clrColor)));
  137. // }
  138. // return (LRESULT)m_hBkBrush;
  139. // }
  140. else if( uMsg == WM_PAINT) {
  141. if (m_pOwner->GetManager()->IsLayered()) {
  142. m_pOwner->GetManager()->AddNativeWindow(m_pOwner, m_hWnd);
  143. }
  144. bHandled = FALSE;
  145. }
  146. else bHandled = FALSE;
  147. if( !bHandled ) return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
  148. return lRes;
  149. }
  150. LRESULT CDateTimeWnd::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  151. {
  152. LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
  153. if (m_pOwner->m_nDTUpdateFlag == DT_NONE)
  154. {
  155. ::SendMessage(m_hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&m_pOwner->m_sysTime);
  156. m_pOwner->m_nDTUpdateFlag = DT_UPDATE;
  157. m_pOwner->UpdateText();
  158. }
  159. if ((HWND)wParam != m_pOwner->GetManager()->GetPaintWindow()) {
  160. ::SendMessage(m_pOwner->GetManager()->GetPaintWindow(), WM_KILLFOCUS, wParam, lParam);
  161. }
  162. SendMessage(WM_CLOSE);
  163. return lRes;
  164. }
  165. // LRESULT CDateTimeWnd::OnEditChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
  166. // {
  167. // if( !m_bInit ) return 0;
  168. // if( m_pOwner == NULL ) return 0;
  169. // // Copy text back
  170. // int cchLen = ::GetWindowTextLength(m_hWnd) + 1;
  171. // LPTSTR pstr = static_cast<LPTSTR>(_alloca(cchLen * sizeof(TCHAR)));
  172. // ASSERT(pstr);
  173. // if( pstr == NULL ) return 0;
  174. // ::GetWindowText(m_hWnd, pstr, cchLen);
  175. // m_pOwner->m_sText = pstr;
  176. // m_pOwner->GetManager()->SendNotify(m_pOwner, DUI_MSGTYPE_TEXTCHANGED);
  177. // return 0;
  178. // }
  179. //////////////////////////////////////////////////////////////////////////
  180. //
  181. CDateTimeUI::CDateTimeUI()
  182. {
  183. ::GetLocalTime(&m_sysTime);
  184. m_bReadOnly = false;
  185. m_pWindow = NULL;
  186. m_nDTUpdateFlag=DT_UPDATE;
  187. m_format = L"yyyy-MM-dd HH:mm:ss";
  188. UpdateText(); // add by:daviyang35 初始化界面时显示时间
  189. m_nDTUpdateFlag = DT_NONE;
  190. }
  191. LPCTSTR CDateTimeUI::GetClass() const
  192. {
  193. return _T("DateTimeUI");
  194. }
  195. LPVOID CDateTimeUI::GetInterface(LPCTSTR pstrName)
  196. {
  197. if( _tcscmp(pstrName, DUI_CTR_DATETIME) == 0 ) return static_cast<CDateTimeUI*>(this);
  198. return CLabelUI::GetInterface(pstrName);
  199. }
  200. UINT CDateTimeUI::GetControlFlags() const
  201. {
  202. return UIFLAG_TABSTOP;
  203. }
  204. HWND CDateTimeUI::GetNativeWindow() const
  205. {
  206. if (m_pWindow) return m_pWindow->GetHWND();
  207. return NULL;
  208. }
  209. SYSTEMTIME& CDateTimeUI::GetTime()
  210. {
  211. return m_sysTime;
  212. }
  213. void CDateTimeUI::SetTime(SYSTEMTIME* pst)
  214. {
  215. m_sysTime = *pst;
  216. Invalidate();
  217. }
  218. void CDateTimeUI::SetReadOnly(bool bReadOnly)
  219. {
  220. m_bReadOnly = bReadOnly;
  221. Invalidate();
  222. }
  223. bool CDateTimeUI::IsReadOnly() const
  224. {
  225. return m_bReadOnly;
  226. }
  227. void CDateTimeUI::UpdateText()
  228. {
  229. if (m_nDTUpdateFlag == DT_DELETE)
  230. SetText(_T(""));
  231. else if (m_nDTUpdateFlag == DT_UPDATE)
  232. {
  233. CDuiString sText;
  234. sText.SmallFormat(_T("%4d年%02d月%02d日"),m_sysTime.wYear, m_sysTime.wMonth, m_sysTime.wDay);
  235. SetText(sText);
  236. }
  237. }
  238. void CDateTimeUI::DoEvent(TEventUI& event)
  239. {
  240. if( !IsMouseEnabled() && event.Type > UIEVENT__MOUSEBEGIN && event.Type < UIEVENT__MOUSEEND ) {
  241. if( m_pParent != NULL ) m_pParent->DoEvent(event);
  242. else CLabelUI::DoEvent(event);
  243. return;
  244. }
  245. if( event.Type == UIEVENT_SETCURSOR && IsEnabled() )
  246. {
  247. ::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_IBEAM)));
  248. return;
  249. }
  250. if( event.Type == UIEVENT_WINDOWSIZE )
  251. {
  252. if( m_pWindow != NULL ) m_pManager->SetFocusNeeded(this);
  253. }
  254. if( event.Type == UIEVENT_SCROLLWHEEL )
  255. {
  256. if( m_pWindow != NULL ) return;
  257. }
  258. if( event.Type == UIEVENT_SETFOCUS && IsEnabled() )
  259. {
  260. if( m_pWindow ) return;
  261. m_pWindow = new CDateTimeWnd();
  262. m_pWindow->SetFormat (CW2A(m_format.GetData()));
  263. ASSERT(m_pWindow);
  264. m_pWindow->Init(this);
  265. m_pWindow->ShowWindow();
  266. }
  267. if( event.Type == UIEVENT_KILLFOCUS && IsEnabled() )
  268. {
  269. Invalidate();
  270. }
  271. if( event.Type == UIEVENT_BUTTONDOWN || event.Type == UIEVENT_DBLCLICK || event.Type == UIEVENT_RBUTTONDOWN)
  272. {
  273. if( IsEnabled() ) {
  274. GetManager()->ReleaseCapture();
  275. if( IsFocused() && m_pWindow == NULL )
  276. {
  277. m_pWindow = new CDateTimeWnd();
  278. ASSERT(m_pWindow);
  279. }
  280. if( m_pWindow != NULL )
  281. {
  282. m_pWindow->Init(this);
  283. m_pWindow->ShowWindow();
  284. }
  285. }
  286. return;
  287. }
  288. if( event.Type == UIEVENT_MOUSEMOVE )
  289. {
  290. return;
  291. }
  292. if( event.Type == UIEVENT_BUTTONUP )
  293. {
  294. return;
  295. }
  296. if( event.Type == UIEVENT_CONTEXTMENU )
  297. {
  298. return;
  299. }
  300. if( event.Type == UIEVENT_MOUSEENTER )
  301. {
  302. return;
  303. }
  304. if( event.Type == UIEVENT_MOUSELEAVE )
  305. {
  306. return;
  307. }
  308. CLabelUI::DoEvent(event);
  309. }
  310. void CDateTimeUI::SetFormat (LPCTSTR fmt)
  311. {
  312. m_format = fmt;
  313. if(m_pWindow) return;
  314. m_pWindow = new CDateTimeWnd ();
  315. m_pWindow->SetFormat (CW2A (m_format.GetData ()));
  316. ASSERT (m_pWindow);
  317. m_pWindow->Init (this);
  318. m_pWindow->ShowWindow ();
  319. }
  320. }