XTDateTimeCtrl.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:26k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTDateTimeCtrl.cpp : implementation of the CXTDateTimeCtrl class.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPVC80Helpers.h"  // Visual Studio 2005 helper functions
  22. #include "Common/XTPVC50Helpers.h"  // Visual Studio 2005 helper functions
  23. #include "XTDefines.h"
  24. #include "XTGlobal.h"
  25. #include "XTDateTimeCtrl.h"
  26. #include <math.h>
  27. #ifdef _DEBUG
  28. #define new DEBUG_NEW
  29. #undef THIS_FILE
  30. static char THIS_FILE[] = __FILE__;
  31. #endif
  32. static BOOL GetAsSystemTime(const CTime& tm, SYSTEMTIME& timeDest)
  33. {
  34. struct tm ttm;
  35. struct tm *ptm = tm.GetLocalTm(&ttm);
  36. if (!ptm)
  37. return FALSE;
  38. timeDest.wYear = (WORD) (1900 + ptm->tm_year);
  39. timeDest.wMonth = (WORD) (1 + ptm->tm_mon);
  40. timeDest.wDayOfWeek = (WORD) ptm->tm_wday;
  41. timeDest.wDay = (WORD) ptm->tm_mday;
  42. timeDest.wHour = (WORD) ptm->tm_hour;
  43. timeDest.wMinute = (WORD) ptm->tm_min;
  44. timeDest.wSecond = (WORD) ptm->tm_sec;
  45. timeDest.wMilliseconds = 0;
  46. return TRUE;
  47. }
  48. static BOOL GetAsSystemTime(const CTime* ptm, SYSTEMTIME& timeDest)
  49. {
  50. return GetAsSystemTime(*ptm, timeDest);
  51. }
  52. static BOOL GetAsSystemTime(const COleDateTime& dtm, SYSTEMTIME& sysTime)
  53. {
  54. #if _MSC_VER < 1200
  55. return CXTPDateTimeHelper::GetAsSystemTime(dtm, sysTime);
  56. #else
  57. return dtm.GetAsSystemTime(sysTime);
  58. #endif
  59. }
  60. static BOOL GetAsSystemTime(const COleDateTime* pdtm, SYSTEMTIME& sysTime)
  61. {
  62. return GetAsSystemTime(*pdtm, sysTime);
  63. }
  64. /////////////////////////////////////////////////////////////////////////////
  65. // CXTDateTimeCtrl class
  66. /////////////////////////////////////////////////////////////////////////////
  67. BOOL CXTDateTimeCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
  68. {
  69. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  70. // initialize common controls
  71. INITCOMMONCONTROLSEX icex;
  72. icex.dwSize = sizeof(icex);
  73. icex.dwICC = ICC_DATE_CLASSES;
  74. VERIFY(InitCommonControlsEx(&icex));
  75. #else
  76. // initialize common controls
  77. VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTL_DATE_REG));
  78. #endif//#if (_MSC_VER <= 1100)
  79. CWnd* pWnd = this;
  80. return pWnd->Create(DATETIMEPICK_CLASS, NULL, dwStyle, rect, pParentWnd, nID);
  81. }
  82. DWORD CXTDateTimeCtrl::GetRange(CTime* pMinTime, CTime* pMaxTime) const
  83. {
  84. ASSERT(::IsWindow(m_hWnd));
  85. SYSTEMTIME sysTimes[2];
  86. memset(sysTimes, 0, sizeof(sysTimes));
  87. //IA64: Assume retval of DTM_GETRANGE is still 32-bit
  88. DWORD dwResult = (DWORD)::SendMessage(m_hWnd, DTM_GETRANGE, 0, (LPARAM) &sysTimes);
  89. if (pMinTime != NULL)
  90. {
  91. if (dwResult & GDTR_MIN)
  92. *pMinTime = CTime(sysTimes[0]);
  93. }
  94. if (pMaxTime != NULL)
  95. {
  96. if (dwResult & GDTR_MAX)
  97. *pMaxTime = CTime(sysTimes[1]);
  98. }
  99. return dwResult;
  100. }
  101. DWORD CXTDateTimeCtrl::GetRange(COleDateTime* pMinTime, COleDateTime* pMaxTime) const
  102. {
  103. ASSERT(::IsWindow(m_hWnd));
  104. SYSTEMTIME sysTimes[2];
  105. memset(sysTimes, 0, sizeof(sysTimes));
  106. DWORD dwResult = (DWORD)::SendMessage(m_hWnd, DTM_GETRANGE, 0, (LPARAM) &sysTimes);
  107. if (pMinTime != NULL)
  108. {
  109. if (dwResult & GDTR_MIN)
  110. *pMinTime = COleDateTime(sysTimes[0]);
  111. else
  112. pMinTime->SetStatus(COleDateTime::null);
  113. }
  114. if (pMaxTime != NULL)
  115. {
  116. if (dwResult & GDTR_MAX)
  117. *pMaxTime = COleDateTime(sysTimes[1]);
  118. else
  119. pMaxTime->SetStatus(COleDateTime::null);
  120. }
  121. return dwResult;
  122. }
  123. BOOL CXTDateTimeCtrl::SetRange(const CTime* pMinTime, const CTime* pMaxTime)
  124. {
  125. ASSERT(::IsWindow(m_hWnd));
  126. SYSTEMTIME sysTimes[2];
  127. WPARAM wFlags = 0;
  128. if (pMinTime != NULL && GetAsSystemTime(pMinTime, sysTimes[0]))
  129. wFlags |= GDTR_MIN;
  130. if (pMaxTime != NULL && GetAsSystemTime(pMaxTime, sysTimes[1]))
  131. wFlags |= GDTR_MAX;
  132. return (BOOL) ::SendMessage(m_hWnd, DTM_SETRANGE, wFlags, (LPARAM) &sysTimes);
  133. }
  134. BOOL CXTDateTimeCtrl::SetRange(const COleDateTime* pMinTime, const COleDateTime* pMaxTime)
  135. {
  136. ASSERT(::IsWindow(m_hWnd));
  137. ASSERT(pMinTime == NULL || pMinTime->GetStatus() != COleDateTime::invalid);
  138. ASSERT(pMaxTime == NULL || pMaxTime->GetStatus() != COleDateTime::invalid);
  139. SYSTEMTIME sysTime[2];
  140. WPARAM wFlags = 0;
  141. if (pMinTime != NULL && pMinTime->GetStatus() != COleDateTime::null)
  142. {
  143. if (GetAsSystemTime(pMinTime, sysTime[0]))
  144. wFlags |= GDTR_MIN;
  145. }
  146. if (pMaxTime != NULL && pMaxTime->GetStatus() != COleDateTime::null)
  147. {
  148. if (GetAsSystemTime(pMaxTime, sysTime[1]))
  149. wFlags |= GDTR_MAX;
  150. }
  151. return (BOOL) ::SendMessage(m_hWnd, DTM_SETRANGE, wFlags, (LPARAM) &sysTime);
  152. }
  153. BOOL CXTDateTimeCtrl::SetTime(LPSYSTEMTIME pTimeNew /* = NULL */)
  154. {
  155. ASSERT(::IsWindow(m_hWnd));
  156. WPARAM wParam = (pTimeNew == NULL) ? GDT_NONE : GDT_VALID;
  157. return (BOOL) ::SendMessage(m_hWnd, DTM_SETSYSTEMTIME,
  158. wParam, (LPARAM) pTimeNew);
  159. }
  160. BOOL CXTDateTimeCtrl::SetTime(const COleDateTime& timeNew)
  161. {
  162. BOOL bRetVal = FALSE;
  163. // make sure the time isn't invalid
  164. ASSERT(timeNew.GetStatus() != COleDateTime::invalid);
  165. ASSERT(::IsWindow(m_hWnd));
  166. SYSTEMTIME sysTime;
  167. WPARAM wParam = GDT_NONE;
  168. if (timeNew.GetStatus() == COleDateTime::valid &&
  169. GetAsSystemTime(timeNew, sysTime))
  170. {
  171. wParam = GDT_VALID;
  172. }
  173. bRetVal = (BOOL) ::SendMessage(m_hWnd,
  174. DTM_SETSYSTEMTIME, wParam, (LPARAM) &sysTime);
  175. return bRetVal;
  176. }
  177. BOOL CXTDateTimeCtrl::SetTime(const CTime* pTimeNew)
  178. {
  179. BOOL bRetVal = FALSE;
  180. // make sure the time isn't invalid
  181. ASSERT(::IsWindow(m_hWnd));
  182. SYSTEMTIME sysTime;
  183. WPARAM wParam = GDT_NONE;
  184. if (pTimeNew != NULL && GetAsSystemTime(pTimeNew, sysTime))
  185. {
  186. wParam = GDT_VALID;
  187. }
  188. bRetVal = (BOOL) ::SendMessage(m_hWnd,
  189. DTM_SETSYSTEMTIME, wParam, (LPARAM) &sysTime);
  190. return bRetVal;
  191. }
  192. BOOL CXTDateTimeCtrl::GetTime(COleDateTime& timeDest) const
  193. {
  194. SYSTEMTIME sysTime;
  195. BOOL bRetVal = TRUE;
  196. LRESULT result = ::SendMessage(m_hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM) &sysTime);
  197. if (result == GDT_VALID)
  198. {
  199. timeDest = COleDateTime(sysTime);
  200. bRetVal = TRUE;
  201. ASSERT(timeDest.GetStatus() == COleDateTime::valid);
  202. }
  203. else if (result == GDT_NONE)
  204. {
  205. timeDest.SetStatus(COleDateTime::null);
  206. bRetVal = TRUE;
  207. }
  208. else
  209. timeDest.SetStatus(COleDateTime::invalid);
  210. return bRetVal;
  211. }
  212. DWORD CXTDateTimeCtrl::GetTime(CTime& timeDest) const
  213. {
  214. SYSTEMTIME sysTime;
  215. DWORD dwResult = (DWORD)
  216. ::SendMessage(m_hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM) &sysTime);
  217. if (dwResult == GDT_VALID)
  218. timeDest = CTime(sysTime);
  219. return dwResult;
  220. }
  221. CXTDateTimeCtrl::~CXTDateTimeCtrl()
  222. {
  223. DestroyWindow();
  224. }
  225. /////////////////////////////////////////////////////////////////////////////
  226. // CXTMonthCalCtrl class
  227. /////////////////////////////////////////////////////////////////////////////
  228. BOOL CXTMonthCalCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
  229. {
  230. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  231. // initialize common controls
  232. INITCOMMONCONTROLSEX icex;
  233. icex.dwSize = sizeof(icex);
  234. icex.dwICC = ICC_DATE_CLASSES;
  235. VERIFY(InitCommonControlsEx(&icex));
  236. #else
  237. // initialize common controls
  238. VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTL_DATE_REG));
  239. #endif//#if (_MSC_VER <= 1100)
  240. CWnd* pWnd = this;
  241. return pWnd->Create(MONTHCAL_CLASS, NULL, dwStyle, rect, pParentWnd, nID);
  242. }
  243. BOOL CXTMonthCalCtrl::Create(DWORD dwStyle, const POINT& pt, CWnd* pParentWnd, UINT nID)
  244. {
  245. BOOL bWasVisible = (dwStyle & WS_VISIBLE);
  246. dwStyle &= ~WS_VISIBLE;
  247. CRect rect(pt.x, pt.y, 0, 0);
  248. BOOL bRetVal = FALSE;
  249. if (Create(dwStyle, rect, pParentWnd, nID))
  250. {
  251. if (SizeMinReq())
  252. {
  253. if (bWasVisible)
  254. ShowWindow(SW_SHOWNA);
  255. bRetVal = TRUE;
  256. }
  257. else
  258. DestroyWindow();
  259. }
  260. return bRetVal;
  261. }
  262. BOOL CXTMonthCalCtrl::SizeMinReq(BOOL bRepaint /* = TRUE */)
  263. {
  264. CRect rect;
  265. BOOL bRetVal = FALSE;
  266. if (GetMinReqRect(rect))
  267. {
  268. DWORD dwFlags = SWP_NOZORDER | SWP_NOREPOSITION | SWP_NOMOVE | SWP_NOACTIVATE;
  269. if (!bRepaint)
  270. dwFlags |= SWP_NOREDRAW;
  271. SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(), dwFlags);
  272. bRetVal = TRUE;
  273. }
  274. return bRetVal;
  275. }
  276. void CXTMonthCalCtrl::SetToday(const COleDateTime& refTime)
  277. {
  278. ASSERT_VALID(this);
  279. // make sure the time isn't invalid
  280. ASSERT(refTime.GetStatus() != COleDateTime::invalid);
  281. ASSERT(::IsWindow(m_hWnd));
  282. SYSTEMTIME sysTime;
  283. LPSYSTEMTIME pSysTime = NULL;
  284. WPARAM wParam = GDT_NONE;
  285. // if the passed time is null or out of range,
  286. // we'll set the control to NULL
  287. if (GetAsSystemTime(refTime, sysTime))
  288. {
  289. pSysTime = &sysTime;
  290. wParam = GDT_VALID;
  291. }
  292. if (::IsWindow(m_hWnd))
  293. ::SendMessage(m_hWnd, MCM_SETTODAY, wParam, (LPARAM) pSysTime);
  294. }
  295. void CXTMonthCalCtrl::SetToday(const CTime* pDateTime)
  296. {
  297. ASSERT(::IsWindow(m_hWnd));
  298. ASSERT_VALID(this);
  299. // if the passed time is NULL, we'll set the
  300. // control to NULL
  301. WPARAM wParam = GDT_NONE;
  302. LPSYSTEMTIME pSysTime = NULL;
  303. SYSTEMTIME sysTime;
  304. if (pDateTime != NULL && GetAsSystemTime(pDateTime, sysTime))
  305. {
  306. wParam = GDT_VALID;
  307. pSysTime = &sysTime;
  308. }
  309. if (::IsWindow(m_hWnd))
  310. ::SendMessage(m_hWnd, MCM_SETTODAY, wParam, (LPARAM) pSysTime);
  311. }
  312. BOOL CXTMonthCalCtrl::SetCurSel(const COleDateTime& refTime)
  313. {
  314. ASSERT(::IsWindow(m_hWnd));
  315. SYSTEMTIME sysTime;
  316. BOOL bRetVal = FALSE;
  317. // if the passed time is null or out of range,
  318. // we'll set the control to NULL
  319. if (GetAsSystemTime(refTime, sysTime) &&
  320. refTime.GetStatus() == COleDateTime::valid)
  321. {
  322. bRetVal = (BOOL)
  323. ::SendMessage(m_hWnd, MCM_SETCURSEL, 0, (LPARAM) &sysTime);
  324. }
  325. return bRetVal;
  326. }
  327. BOOL CXTMonthCalCtrl::SetCurSel(const CTime& refTime)
  328. {
  329. ASSERT(::IsWindow(m_hWnd));
  330. SYSTEMTIME sysTime;
  331. BOOL bRetVal = FALSE;
  332. if (GetAsSystemTime(refTime, sysTime))
  333. {
  334. bRetVal = (BOOL)
  335. ::SendMessage(m_hWnd, MCM_SETCURSEL, 0, (LPARAM) &sysTime);
  336. }
  337. return bRetVal;
  338. }
  339. BOOL CXTMonthCalCtrl::GetCurSel(COleDateTime& refTime) const
  340. {
  341. ASSERT(::IsWindow(m_hWnd));
  342. // can't use this method on multiple selection controls
  343. ASSERT(!(GetStyle() & MCS_MULTISELECT));
  344. SYSTEMTIME sysTime;
  345. BOOL bResult = GetCurSel(&sysTime);
  346. if (bResult)
  347. refTime = COleDateTime(sysTime);
  348. return bResult;
  349. }
  350. BOOL CXTMonthCalCtrl::GetToday(COleDateTime& refTime) const
  351. {
  352. ASSERT(::IsWindow(m_hWnd));
  353. // can't use this method on multiple selection controls
  354. ASSERT(!(GetStyle() & MCS_MULTISELECT));
  355. SYSTEMTIME sysTime;
  356. BOOL bResult = (BOOL)
  357. ::SendMessage(m_hWnd, MCM_GETTODAY, 0, (LPARAM) &sysTime);
  358. if (bResult)
  359. refTime = COleDateTime(sysTime);
  360. return bResult;
  361. }
  362. BOOL CXTMonthCalCtrl::GetCurSel(CTime& refTime) const
  363. {
  364. ASSERT(::IsWindow(m_hWnd));
  365. // can't use this method on multiple selection controls
  366. ASSERT(!(GetStyle() & MCS_MULTISELECT));
  367. SYSTEMTIME sysTime;
  368. BOOL bResult = GetCurSel(&sysTime);
  369. if (bResult)
  370. refTime = CTime(sysTime);
  371. return bResult;
  372. }
  373. BOOL CXTMonthCalCtrl::GetToday(CTime& refTime) const
  374. {
  375. ASSERT(::IsWindow(m_hWnd));
  376. // can't use this method on multiple selection controls
  377. ASSERT(!(GetStyle() & MCS_MULTISELECT));
  378. SYSTEMTIME sysTime;
  379. BOOL bResult = (BOOL)
  380. ::SendMessage(m_hWnd, MCM_GETTODAY, 0, (LPARAM) &sysTime);
  381. if (bResult)
  382. refTime = CTime(sysTime);
  383. return bResult;
  384. }
  385. CXTMonthCalCtrl::~CXTMonthCalCtrl()
  386. {
  387. DestroyWindow();
  388. }
  389. int CXTMonthCalCtrl::GetFirstDayOfWeek(BOOL* pbLocal /* = NULL */) const
  390. {
  391. ASSERT(::IsWindow(m_hWnd));
  392. DWORD dwResult;
  393. dwResult = (DWORD) ::SendMessage(m_hWnd, MCM_GETFIRSTDAYOFWEEK, 0, 0);
  394. // set *pbLocal to reflect if the first day of week
  395. // matches current locale setting
  396. if (pbLocal)
  397. *pbLocal = HIWORD(dwResult);
  398. return LOWORD(dwResult);
  399. }
  400. BOOL CXTMonthCalCtrl::SetFirstDayOfWeek(int iDay, int* lpnOld /* = NULL */)
  401. {
  402. ASSERT(::IsWindow(m_hWnd));
  403. DWORD dwResult;
  404. dwResult = (DWORD) ::SendMessage(m_hWnd, MCM_SETFIRSTDAYOFWEEK, 0, (WPARAM) iDay);
  405. if (lpnOld != NULL)
  406. *lpnOld = LOWORD(dwResult);
  407. return (BOOL) HIWORD(dwResult);
  408. }
  409. BOOL CXTMonthCalCtrl::SetDayState(int nMonths, LPMONTHDAYSTATE pStates)
  410. {
  411. ASSERT(::IsWindow(m_hWnd));
  412. ASSERT(GetStyle()&MCS_DAYSTATE);
  413. ASSERT(AfxIsValidAddress(pStates, nMonths * sizeof(MONTHDAYSTATE), FALSE));
  414. return (BOOL) ::SendMessage(m_hWnd, MCM_SETDAYSTATE, (WPARAM) nMonths, (LPARAM) pStates);
  415. }
  416. BOOL CXTMonthCalCtrl::SetRange(const COleDateTime* pMinRange, const COleDateTime* pMaxRange)
  417. {
  418. ASSERT(::IsWindow(m_hWnd));
  419. ASSERT(pMinRange == NULL || pMinRange->GetStatus() != COleDateTime::invalid);
  420. ASSERT(pMaxRange == NULL || pMaxRange->GetStatus() != COleDateTime::invalid);
  421. SYSTEMTIME sysTimes[2];
  422. WPARAM wFlags = 0;
  423. if (pMinRange != NULL && pMinRange->GetStatus() != COleDateTime::null)
  424. {
  425. if (GetAsSystemTime(pMinRange, sysTimes[0]))
  426. wFlags |= GDTR_MIN;
  427. }
  428. if (pMaxRange != NULL && pMaxRange->GetStatus() != COleDateTime::null)
  429. {
  430. if (GetAsSystemTime(pMaxRange, sysTimes[1]))
  431. wFlags |= GDTR_MAX;
  432. }
  433. return (BOOL)
  434. ::SendMessage(m_hWnd, MCM_SETRANGE, wFlags, (LPARAM) &sysTimes);
  435. }
  436. BOOL CXTMonthCalCtrl::SetRange(const LPSYSTEMTIME pMinRange, const LPSYSTEMTIME pMaxRange)
  437. {
  438. ASSERT(::IsWindow(m_hWnd));
  439. SYSTEMTIME sysTimes[2];
  440. WPARAM wFlags = 0;
  441. if (pMinRange != NULL)
  442. {
  443. MEMCPY_S(&sysTimes[0], pMinRange, sizeof(SYSTEMTIME));
  444. wFlags |= GDTR_MIN;
  445. }
  446. if (pMaxRange != NULL)
  447. {
  448. MEMCPY_S(&sysTimes[1], pMaxRange, sizeof(SYSTEMTIME));
  449. wFlags |= GDTR_MAX;
  450. }
  451. return (BOOL)
  452. ::SendMessage(m_hWnd, MCM_SETRANGE, wFlags, (LPARAM) &sysTimes);
  453. }
  454. DWORD CXTMonthCalCtrl::GetRange(COleDateTime* pMinRange, COleDateTime* pMaxRange) const
  455. {
  456. ASSERT(::IsWindow(m_hWnd));
  457. SYSTEMTIME sysTimes[2];
  458. memset(sysTimes, 0, sizeof(sysTimes));
  459. DWORD dwRanges = (DWORD)
  460. ::SendMessage(m_hWnd, MCM_GETRANGE, 0, (LPARAM) &sysTimes);
  461. if (dwRanges & GDTR_MIN && pMinRange)
  462. *pMinRange = COleDateTime(sysTimes[0]);
  463. if (dwRanges & GDTR_MAX && pMaxRange)
  464. *pMaxRange = COleDateTime(sysTimes[1]);
  465. return dwRanges;
  466. }
  467. DWORD CXTMonthCalCtrl::GetRange(LPSYSTEMTIME pMinRange, LPSYSTEMTIME pMaxRange) const
  468. {
  469. ASSERT(::IsWindow(m_hWnd));
  470. SYSTEMTIME sysTimes[2];
  471. memset(sysTimes, 0, sizeof(sysTimes));
  472. DWORD dwRanges = (DWORD)
  473. ::SendMessage(m_hWnd, MCM_GETRANGE, 0, (LPARAM) &sysTimes);
  474. if (dwRanges & GDTR_MIN && pMinRange)
  475. {
  476. MEMCPY_S(pMinRange, &sysTimes[0], sizeof(SYSTEMTIME));
  477. }
  478. if (dwRanges & GDTR_MAX && pMaxRange)
  479. {
  480. MEMCPY_S(pMaxRange, &sysTimes[1], sizeof(SYSTEMTIME));
  481. }
  482. return dwRanges;
  483. }
  484. BOOL CXTMonthCalCtrl::SetRange(const CTime* pMinRange, const CTime* pMaxRange)
  485. {
  486. ASSERT(::IsWindow(m_hWnd));
  487. SYSTEMTIME sysTimes[2];
  488. WPARAM wFlags = 0;
  489. if (pMinRange != NULL && GetAsSystemTime(pMinRange, sysTimes[0]))
  490. wFlags |= GDTR_MIN;
  491. if (pMaxRange != NULL && GetAsSystemTime(pMaxRange, sysTimes[1]))
  492. wFlags |= GDTR_MAX;
  493. return (BOOL)
  494. ::SendMessage(m_hWnd, MCM_SETRANGE, wFlags, (LPARAM) &sysTimes);
  495. }
  496. DWORD CXTMonthCalCtrl::GetRange(CTime* pMinRange, CTime* pMaxRange) const
  497. {
  498. ASSERT(::IsWindow(m_hWnd));
  499. SYSTEMTIME sysTimes[2];
  500. memset(sysTimes, 0, sizeof(sysTimes));
  501. DWORD dwRanges = (DWORD)
  502. ::SendMessage(m_hWnd, MCM_GETRANGE, 0, (LPARAM) &sysTimes);
  503. if (dwRanges & GDTR_MIN && pMinRange)
  504. *pMinRange = CTime(sysTimes[0]);
  505. if (dwRanges & GDTR_MAX && pMaxRange)
  506. *pMaxRange = CTime(sysTimes[1]);
  507. return dwRanges;
  508. }
  509. int CXTMonthCalCtrl::GetMonthRange(COleDateTime& refMinRange, COleDateTime& refMaxRange, DWORD dwFlags) const
  510. {
  511. ASSERT(::IsWindow(m_hWnd));
  512. ASSERT(dwFlags == GMR_DAYSTATE || dwFlags == GMR_VISIBLE);
  513. SYSTEMTIME sysTimes[2];
  514. memset(sysTimes, 0, sizeof(sysTimes));
  515. int nCount = (int) ::SendMessage(m_hWnd, MCM_GETMONTHRANGE,
  516. (WPARAM) dwFlags, (LPARAM) &sysTimes);
  517. refMinRange = COleDateTime(sysTimes[0]);
  518. refMaxRange = COleDateTime(sysTimes[1]);
  519. return nCount;
  520. }
  521. int CXTMonthCalCtrl::GetMonthRange(LPSYSTEMTIME pMinRange, LPSYSTEMTIME pMaxRange, DWORD dwFlags) const
  522. {
  523. ASSERT(::IsWindow(m_hWnd));
  524. ASSERT_POINTER(pMinRange, SYSTEMTIME);
  525. ASSERT_POINTER(pMaxRange, SYSTEMTIME);
  526. SYSTEMTIME sysTimes[2];
  527. int nCount = (int) ::SendMessage(m_hWnd, MCM_GETMONTHRANGE,
  528. (WPARAM) dwFlags, (LPARAM) &sysTimes);
  529. MEMCPY_S(pMinRange, &sysTimes[0], sizeof(SYSTEMTIME));
  530. MEMCPY_S(pMaxRange, &sysTimes[1], sizeof(SYSTEMTIME));
  531. return nCount;
  532. }
  533. int CXTMonthCalCtrl::GetMonthRange(CTime& refMinRange, CTime& refMaxRange, DWORD dwFlags) const
  534. {
  535. ASSERT(::IsWindow(m_hWnd));
  536. ASSERT(dwFlags == GMR_DAYSTATE || dwFlags == GMR_VISIBLE);
  537. SYSTEMTIME sysTimes[2];
  538. memset(sysTimes, 0, sizeof(sysTimes));
  539. int nCount = (int) ::SendMessage(m_hWnd, MCM_GETMONTHRANGE,
  540. (WPARAM) dwFlags, (LPARAM) &sysTimes);
  541. refMinRange = CTime(sysTimes[0]);
  542. refMaxRange = CTime(sysTimes[1]);
  543. return nCount;
  544. }
  545. BOOL CXTMonthCalCtrl::GetSelRange(LPSYSTEMTIME pMinRange, LPSYSTEMTIME pMaxRange) const
  546. {
  547. ASSERT(m_hWnd != NULL);
  548. if (!m_hWnd)
  549. return FALSE;
  550. ASSERT((GetStyle() & MCS_MULTISELECT));
  551. ASSERT_POINTER(pMinRange, SYSTEMTIME);
  552. ASSERT_POINTER(pMaxRange, SYSTEMTIME);
  553. SYSTEMTIME sysTimes[2];
  554. BOOL bReturn = (BOOL) ::SendMessage(m_hWnd, MCM_GETSELRANGE,
  555. 0, (LPARAM) &sysTimes);
  556. if (bReturn)
  557. {
  558. MEMCPY_S(pMinRange, &sysTimes[0], sizeof(SYSTEMTIME));
  559. MEMCPY_S(pMaxRange, &sysTimes[1], sizeof(SYSTEMTIME));
  560. }
  561. return bReturn;
  562. }
  563. BOOL CXTMonthCalCtrl::SetSelRange(const LPSYSTEMTIME pMinRange, const LPSYSTEMTIME pMaxRange)
  564. {
  565. ASSERT(m_hWnd != NULL);
  566. if (!m_hWnd)
  567. return FALSE;
  568. ASSERT((GetStyle() & MCS_MULTISELECT));
  569. ASSERT_POINTER(pMinRange, SYSTEMTIME);
  570. ASSERT_POINTER(pMaxRange, SYSTEMTIME);
  571. SYSTEMTIME sysTimes[2];
  572. MEMCPY_S(&sysTimes[0], pMinRange, sizeof(SYSTEMTIME));
  573. MEMCPY_S(&sysTimes[1], pMaxRange, sizeof(SYSTEMTIME));
  574. return (BOOL) ::SendMessage(m_hWnd, MCM_SETSELRANGE,
  575. 0, (LPARAM) &sysTimes);
  576. }
  577. BOOL CXTMonthCalCtrl::SetSelRange(const COleDateTime& refMinRange, const COleDateTime& refMaxRange)
  578. {
  579. // control must have multiple select
  580. ASSERT((GetStyle() & MCS_MULTISELECT));
  581. ASSERT(::IsWindow(m_hWnd));
  582. SYSTEMTIME sysTimes[2];
  583. BOOL bResult = FALSE;
  584. if (refMinRange.GetStatus() == COleDateTime::valid &&
  585. refMinRange.GetStatus() == COleDateTime::valid)
  586. {
  587. if (GetAsSystemTime(refMinRange, sysTimes[0]) &&
  588. GetAsSystemTime(refMaxRange, sysTimes[1]))
  589. {
  590. bResult = (BOOL)
  591. ::SendMessage(m_hWnd, MCM_SETSELRANGE, 0, (LPARAM)sysTimes);
  592. }
  593. }
  594. return bResult;
  595. }
  596. BOOL CXTMonthCalCtrl::GetSelRange(COleDateTime& refMinRange, COleDateTime& refMaxRange) const
  597. {
  598. // control must have multiple select
  599. ASSERT((GetStyle() & MCS_MULTISELECT));
  600. ASSERT(::IsWindow(m_hWnd));
  601. SYSTEMTIME sysTimes[2];
  602. memset(sysTimes, 0, sizeof(sysTimes));
  603. BOOL bResult = (BOOL)
  604. ::SendMessage(m_hWnd, MCM_GETSELRANGE, 0, (LPARAM) &sysTimes);
  605. if (bResult)
  606. {
  607. refMinRange = COleDateTime(sysTimes[0]);
  608. refMaxRange = COleDateTime(sysTimes[1]);
  609. }
  610. return bResult;
  611. }
  612. BOOL CXTMonthCalCtrl::SetSelRange(const CTime& refMinRange, const CTime& refMaxRange)
  613. {
  614. // control must have multiple select
  615. ASSERT((GetStyle() & MCS_MULTISELECT));
  616. ASSERT(::IsWindow(m_hWnd));
  617. SYSTEMTIME sysTimes[2];
  618. BOOL bResult = FALSE;
  619. if (GetAsSystemTime(refMinRange, sysTimes[0]) &&
  620. GetAsSystemTime(refMaxRange, sysTimes[1]))
  621. {
  622. bResult = (BOOL)
  623. ::SendMessage(m_hWnd, MCM_SETSELRANGE, 0, (LPARAM)sysTimes);
  624. }
  625. return bResult;
  626. }
  627. BOOL CXTMonthCalCtrl::GetSelRange(CTime& refMinRange, CTime& refMaxRange) const
  628. {
  629. // control must have multiple select
  630. ASSERT((GetStyle() & MCS_MULTISELECT));
  631. ASSERT(::IsWindow(m_hWnd));
  632. SYSTEMTIME sysTimes[2];
  633. memset(sysTimes, 0, sizeof(sysTimes));
  634. BOOL bResult = (BOOL)
  635. ::SendMessage(m_hWnd, MCM_GETSELRANGE, 0, (LPARAM) &sysTimes);
  636. if (bResult)
  637. {
  638. refMinRange = CTime(sysTimes[0]);
  639. refMaxRange = CTime(sysTimes[1]);
  640. }
  641. return bResult;
  642. }
  643. /////////////////////////////////////////////////////////////////////////////
  644. // DDX_ routines
  645. /////////////////////////////////////////////////////////////////////////////
  646. _XTP_EXT_CLASS void AFXAPI DDX_XTDateTimeCtrl(CDataExchange* pDX, int nIDC, COleDateTime& value)
  647. {
  648. HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
  649. CXTDateTimeCtrl* pWnd = (CXTDateTimeCtrl*) CWnd::FromHandle(hWndCtrl);
  650. if (pDX->m_bSaveAndValidate)
  651. pWnd->GetTime(value);
  652. else
  653. pWnd->SetTime(value);
  654. }
  655. _XTP_EXT_CLASS void AFXAPI DDX_XTDateTimeCtrl(CDataExchange* pDX, int nIDC, CTime& value)
  656. {
  657. HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
  658. CXTDateTimeCtrl* pWnd = (CXTDateTimeCtrl*) CWnd::FromHandle(hWndCtrl);
  659. if (pDX->m_bSaveAndValidate)
  660. pWnd->GetTime(value);
  661. else
  662. pWnd->SetTime(&value);
  663. }
  664. _XTP_EXT_CLASS void AFXAPI DDX_XTMonthCalCtrl(CDataExchange* pDX, int nIDC,
  665. COleDateTime& value)
  666. {
  667. HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
  668. CXTMonthCalCtrl* pWnd = (CXTMonthCalCtrl*) CWnd::FromHandle(hWndCtrl);
  669. if (pDX->m_bSaveAndValidate)
  670. pWnd->GetCurSel(value);
  671. else
  672. pWnd->SetCurSel(value);
  673. }
  674. _XTP_EXT_CLASS void AFXAPI DDX_XTMonthCalCtrl(CDataExchange* pDX, int nIDC, CTime& value)
  675. {
  676. HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
  677. CXTMonthCalCtrl* pWnd = (CXTMonthCalCtrl*) CWnd::FromHandle(hWndCtrl);
  678. if (pDX->m_bSaveAndValidate)
  679. pWnd->GetCurSel(value);
  680. else
  681. pWnd->SetCurSel(value);
  682. }
  683. /////////////////////////////////////////////////////////////////////////////
  684. // DDV_ routines
  685. /////////////////////////////////////////////////////////////////////////////
  686. _XTP_EXT_CLASS void AFXAPI DDV_XTMinMaxDateTime(CDataExchange* pDX, CTime& refValue,
  687. const CTime* pMinRange, const CTime* pMaxRange)
  688. {
  689. ASSERT(pMinRange == NULL || pMaxRange == NULL || *pMinRange <= *pMaxRange);
  690. #if _MSC_VER > 1200 //MFC 7.0
  691. CXTDateTimeCtrl* pWnd =
  692. (CXTDateTimeCtrl*) pDX->m_pDlgWnd->GetDlgItem(pDX->m_idLastControl);
  693. #else
  694. CXTDateTimeCtrl* pWnd =
  695. (CXTDateTimeCtrl*) CWnd::FromHandle(pDX->m_hWndLastControl);
  696. #endif //MFC 7.0
  697. if (!pDX->m_bSaveAndValidate)
  698. {
  699. if ((pMinRange != NULL && *pMinRange > refValue) ||
  700. (pMaxRange != NULL && *pMaxRange < refValue))
  701. {
  702. #if _MSC_VER > 1200 // MFC 7.0
  703. TRACE(traceAppMsg, 0, "Warning: initial dialog data is out of range in "
  704. "control ID %d.n", pDX->m_idLastControl);
  705. #else
  706. #ifdef _DEBUG
  707. int nIDC = GetWindowLong(pDX->m_hWndLastControl, GWL_ID);
  708. TRACE1("Warning: initial dialog data is out of range in control ID %d.n", nIDC);
  709. #endif
  710. #endif//MFC 7.0
  711. return;     // don't stop now
  712. }
  713. }
  714. pWnd->SetRange(pMinRange, pMaxRange);
  715. }
  716. _XTP_EXT_CLASS void AFXAPI DDV_XTMinMaxDateTime(CDataExchange* pDX, COleDateTime& refValue,
  717. const COleDateTime* pMinRange, const COleDateTime* pMaxRange)
  718. {
  719. ASSERT(pMinRange == NULL || pMaxRange == NULL || *pMinRange <= *pMaxRange);
  720. #if _MSC_VER > 1200 //MFC 7.0
  721. CXTDateTimeCtrl* pWnd =
  722. (CXTDateTimeCtrl*) pDX->m_pDlgWnd->GetDlgItem(pDX->m_idLastControl);
  723. #else
  724. CXTDateTimeCtrl* pWnd =
  725. (CXTDateTimeCtrl*) CWnd::FromHandle(pDX->m_hWndLastControl);
  726. #endif //MFC 7.0
  727. if (!pDX->m_bSaveAndValidate)
  728. {
  729. if ((pMinRange != NULL && *pMinRange > refValue) ||
  730. (pMaxRange != NULL && *pMaxRange < refValue))
  731. {
  732. #if _MSC_VER > 1200 //MFC 7.0
  733. TRACE(traceAppMsg, 0, "Warning: initial dialog data is out of range in "
  734. "control ID %d.n", pDX->m_idLastControl);
  735. #else
  736. #ifdef _DEBUG
  737. int nIDC = GetWindowLong(pDX->m_hWndLastControl, GWL_ID);
  738. TRACE1("Warning: initial dialog data is out of range in control ID %d.n", nIDC);
  739. #endif
  740. #endif //MFC 7.0
  741. return;     // don't stop now
  742. }
  743. }
  744. pWnd->SetRange(pMinRange, pMaxRange);
  745. }
  746. _XTP_EXT_CLASS void AFXAPI DDV_XTMinMaxMonth(CDataExchange* pDX, CTime& refValue,
  747. const CTime* pMinRange, const CTime* pMaxRange)
  748. {
  749. ASSERT(pMinRange == NULL || pMaxRange == NULL || *pMinRange <= *pMaxRange);
  750. #if _MSC_VER > 1200 //MFC 7.0
  751. CXTMonthCalCtrl* pWnd =
  752. (CXTMonthCalCtrl*) pDX->m_pDlgWnd->GetDlgItem(pDX->m_idLastControl);
  753. #else
  754. CXTMonthCalCtrl* pWnd =
  755. (CXTMonthCalCtrl*) CWnd::FromHandle(pDX->m_hWndLastControl);
  756. #endif //MFC 7.0
  757. if (!pDX->m_bSaveAndValidate)
  758. {
  759. if ((pMinRange != NULL && *pMinRange > refValue) ||
  760. (pMaxRange != NULL && *pMaxRange < refValue))
  761. {
  762. #if _MSC_VER > 1200 //MFC 7.0
  763. TRACE(traceAppMsg, 0, "Warning: initial dialog data is out of range in "
  764. "control ID %d.n", pDX->m_idLastControl);
  765. #else
  766. #ifdef _DEBUG
  767. int nIDC = GetWindowLong(pDX->m_hWndLastControl, GWL_ID);
  768. TRACE1("Warning: initial dialog data is out of range in control ID %d.n", nIDC);
  769. #endif
  770. #endif //MFC 7.0
  771. return;     // don't stop now
  772. }
  773. }
  774. pWnd->SetRange(pMinRange, pMaxRange);
  775. }
  776. _XTP_EXT_CLASS void AFXAPI DDV_XTMinMaxMonth(CDataExchange* pDX, COleDateTime& refValue,
  777. const COleDateTime* pMinRange, const COleDateTime* pMaxRange)
  778. {
  779. ASSERT(pMinRange == NULL || pMaxRange == NULL || *pMinRange <= *pMaxRange);
  780. #if _MSC_VER > 1200 //MFC 7.0
  781. CXTMonthCalCtrl* pWnd =
  782. (CXTMonthCalCtrl*) pDX->m_pDlgWnd->GetDlgItem(pDX->m_idLastControl);
  783. #else
  784. CXTMonthCalCtrl* pWnd =
  785. (CXTMonthCalCtrl*) CWnd::FromHandle(pDX->m_hWndLastControl);
  786. #endif //MFC 7.0
  787. if (!pDX->m_bSaveAndValidate)
  788. {
  789. if ((pMinRange != NULL && *pMinRange > refValue) ||
  790. (pMaxRange != NULL && *pMaxRange < refValue))
  791. {
  792. #if _MSC_VER > 1200 //MFC 7.0
  793. TRACE(traceAppMsg, 0, "Warning: initial dialog data is out of range in "
  794. "control ID %d.n", pDX->m_idLastControl);
  795. #else
  796. #ifdef _DEBUG
  797. int nIDC = GetWindowLong(pDX->m_hWndLastControl, GWL_ID);
  798. TRACE1("Warning: initial dialog data is out of range in control ID %d.n", nIDC);
  799. #endif
  800. #endif //MFC 7.0
  801. return;     // don't stop now
  802. }
  803. }
  804. pWnd->SetRange(pMinRange, pMaxRange);
  805. }
  806. IMPLEMENT_DYNAMIC(CXTDateTimeCtrl, CWnd)
  807. IMPLEMENT_DYNAMIC(CXTMonthCalCtrl, CWnd)